2024-02-17 18:47:30 +01:00
import moviepy . editor as mp
2024-02-15 12:27:13 +01:00
import time
import os
2024-02-17 18:47:30 +01:00
import gradio as gr
2024-02-15 11:23:36 +01:00
from . . import engines
2024-02-15 12:27:13 +01:00
from . . utils . prompting import get_prompt
2024-02-15 11:23:36 +01:00
2024-02-15 17:48:47 +01:00
class GenerationContext :
def __init__ (
2024-02-17 18:47:30 +01:00
self ,
powerfulllmengine ,
simplellmengine ,
scriptengine ,
ttsengine ,
captioningengine ,
2024-02-15 17:48:47 +01:00
) - > None :
2024-02-17 18:47:30 +01:00
self . powerfulllmengine : engines . LLMEngine . BaseLLMEngine = powerfulllmengine [ 0 ]
2024-02-15 12:27:13 +01:00
self . powerfulllmengine . ctx = self
2024-02-15 17:48:47 +01:00
2024-02-17 18:47:30 +01:00
self . simplellmengine : engines . LLMEngine . BaseLLMEngine = simplellmengine [ 0 ]
2024-02-15 12:27:13 +01:00
self . simplellmengine . ctx = self
2024-02-15 11:23:36 +01:00
2024-02-17 18:47:30 +01:00
self . scriptengine : engines . ScriptEngine . BaseScriptEngine = scriptengine [ 0 ]
2024-02-15 11:23:36 +01:00
self . scriptengine . ctx = self
2024-02-17 18:47:30 +01:00
self . ttsengine : engines . TTSEngine . BaseTTSEngine = ttsengine [ 0 ]
2024-02-15 11:23:36 +01:00
self . ttsengine . ctx = self
2024-02-15 17:48:47 +01:00
2024-02-17 18:47:30 +01:00
self . captioningengine : engines . CaptioningEngine . BaseCaptioningEngine = (
captioningengine [ 0 ]
)
self . captioningengine . ctx = self
2024-02-15 12:27:13 +01:00
def setup_dir ( self ) :
self . dir = f " output/ { time . time ( ) } "
os . makedirs ( self . dir )
2024-02-17 18:47:30 +01:00
2024-02-15 18:03:09 +01:00
def get_file_path ( self , name : str ) - > str :
return os . path . join ( self . dir , name )
2024-02-15 12:27:13 +01:00
2024-02-15 11:23:36 +01:00
def process ( self ) :
2024-02-17 18:47:30 +01:00
# ⚠️ IMPORTANT NOTE: All methods called here are expected to be defined as abstract methods in the base classes, if not there is an issue with the engine implementation.
progress = gr . Progress ( )
self . width , self . height = (
1080 ,
1920 ,
) # TODO: Add support for custom resolution, for now it's tiktok's resolution
2024-02-15 12:27:13 +01:00
self . setup_dir ( )
2024-02-17 18:47:30 +01:00
self . script = self . scriptengine . generate ( )
self . timed_script = self . ttsengine . synthesize (
self . script , self . get_file_path ( " tts.wav " )
)
if not isinstance ( self . captioningengine , engines . NoneEngine ) :
self . captions = self . captioningengine . get_captions ( )
else :
self . captions = [ ]
# add any other processing steps here
# we render to a file called final.mp4
# using moviepy CompositeVideoClip
2024-02-15 12:27:13 +01:00
2024-02-17 18:47:30 +01:00
clip = mp . CompositeVideoClip ( self . captions , size = ( self . width , self . height ) )
audio = mp . AudioFileClip ( self . get_file_path ( " tts.wav " ) )
clip = clip . set_audio ( audio )
clip . write_videofile ( self . get_file_path ( " final.mp4 " ) , fps = 60 )