[docs]def__init__(self,llm:BaseLanguageModel,verbose:bool=True,char_limit:int=20):self.llm=llmself.verbose=verbose# Adjust as needed. Be careful adjusting it too low because OpenAI may# produce unwanted outputself._CHAR_LIMIT=char_limit
[docs]defprocess(self,video_models:List[VideoModel],audio_models:List[AudioModel],run_manager:Optional[CallbackManagerForChainRun]=None,)->List[CaptionModel]:caption_models=[]audio_index=0forvideo_modelinvideo_models:whileaudio_index<len(audio_models):audio_model=audio_models[audio_index]overlap_start,overlap_end=self._check_overlap(video_model,audio_model)ifoverlap_start==-1:ifaudio_model.start_time<=video_model.start_time:caption_models.append(CaptionModel.from_audio_model(audio_model))audio_index+=1else:breakelse:self._handle_overlap(caption_models,video_model,audio_model,overlap_start,overlap_end,)# Update audio model or pop if it's fully usedifaudio_model.end_time<=overlap_end:audio_index+=1else:audio_model.start_time=overlap_endcaption_models.append(CaptionModel.from_video_model(video_model))# Add remaining audio modelsforiinrange(audio_index,len(audio_models)):caption_models.append(CaptionModel.from_audio_model(audio_models[i]))returncaption_models
@staticmethoddef_check_overlap(video_model:VideoModel,audio_model:AudioModel)->Tuple[int,int]:overlap_start=max(audio_model.start_time,video_model.start_time)overlap_end=min(audio_model.end_time,video_model.end_time)ifoverlap_start<overlap_end:returnoverlap_start,overlap_endreturn-1,-1def_handle_overlap(self,caption_models:List[CaptionModel],video_model:VideoModel,audio_model:AudioModel,overlap_start:int,overlap_end:int,)->None:# Handle non-overlapping partifvideo_model.start_time<overlap_start:caption_models.append(CaptionModel.from_video_model(VideoModel(video_model.start_time,overlap_start,video_model.image_description,)))video_model.start_time=overlap_start# Handle the combined caption during overlapcaption_text=self._validate_and_adjust_description(audio_model,video_model)subtitle_text=audio_model.subtitle_textcaption_models.append(CaptionModel.from_video_model(VideoModel(overlap_start,overlap_end,caption_text)).add_subtitle_text(subtitle_text))# Update video model start time for remaining partifvideo_model.end_time>overlap_end:video_model.start_time=overlap_enddef_validate_and_adjust_description(self,audio_model:AudioModel,video_model:VideoModel,run_manager:Optional[CallbackManagerForChainRun]=None,)->str:conversation=LLMChain(llm=self.llm,prompt=VALIDATE_AND_ADJUST_DESCRIPTION_PROMPT,verbose=True,callbacks=run_manager.get_child()ifrun_managerelseNone,)# Get response from OpenAI using LLMChainresponse:Dict[str,str]=conversation({"limit":self._CHAR_LIMIT,"subtitle":audio_model.subtitle_text,"description":video_model.image_description,})# Take out the Result: part of the responsereturnresponse["text"].replace("Result:","").strip()