Spaces:
Running
Running
import gradio as gr | |
from openai import OpenAI | |
import os | |
import edge_tts | |
import json | |
import asyncio | |
import whisper_timestamped as whisper | |
from utility.script_generator import generate_script | |
from utility.audio_generator import generate_audio | |
from utility.timed_captions_generator import generate_timed_captions | |
from utility.background_video_generator import generate_video_url | |
from utility.render_engine import get_output_media | |
from utility.video_search_query_generator import getVideoSearchQueriesTimed, merge_empty_intervals | |
async def generate_video(topic, progress=gr.Progress()): | |
try: | |
# Ensure audio directory exists | |
os.makedirs("audio", exist_ok=True) | |
SAMPLE_FILE_NAME = os.path.join("audio", "audio_tts.wav") | |
VIDEO_SERVER = "pexel" | |
progress(0.1, desc="Generating script...") | |
response = generate_script(topic) | |
progress(0.3, desc="Generating audio...") | |
await generate_audio(response, SAMPLE_FILE_NAME) | |
progress(0.5, desc="Generating captions...") | |
timed_captions = generate_timed_captions(SAMPLE_FILE_NAME) | |
progress(0.6, desc="Generating search terms...") | |
search_terms = getVideoSearchQueriesTimed(response, timed_captions) | |
if search_terms is not None: | |
progress(0.7, desc="Fetching background videos...") | |
background_video_urls = generate_video_url(search_terms, VIDEO_SERVER) | |
background_video_urls = merge_empty_intervals(background_video_urls) | |
if background_video_urls is not None: | |
progress(0.9, desc="Rendering final video...") | |
video = get_output_media(SAMPLE_FILE_NAME, timed_captions, background_video_urls, VIDEO_SERVER) | |
return video, "Video generated successfully!" | |
return None, "Failed to generate video. No suitable background videos found." | |
except Exception as e: | |
return None, f"Error: {str(e)}" | |
# Create Gradio interface | |
def create_interface(): | |
with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
gr.Markdown( | |
""" | |
# AI Video Generator | |
Generate engaging videos from any topic using AI | |
""" | |
) | |
with gr.Row(): | |
with gr.Column(): | |
topic_input = gr.Textbox( | |
label="Enter Your Topic", | |
placeholder="E.g., The history of artificial intelligence", | |
lines=2 | |
) | |
generate_btn = gr.Button("Generate Video", variant="primary") | |
with gr.Column(): | |
output_video = gr.Video(label="Generated Video") | |
status_text = gr.Textbox(label="Status", interactive=False) | |
generate_btn.click( | |
fn=generate_video, | |
inputs=[topic_input], | |
outputs=[output_video, status_text] | |
) | |
gr.Markdown( | |
""" | |
### How it works: | |
1. Enter a topic you want to create a video about | |
2. Click 'Generate Video' | |
3. Wait while the AI generates the script, audio, and matches appropriate visuals | |
4. Download your finished video! | |
""" | |
) | |
return demo | |
if __name__ == "__main__": | |
demo = create_interface() | |
demo.launch(share=True) | |