Spaces:
Sleeping
Sleeping
import gradio as gr | |
import os | |
import tempfile | |
from core.audio_processor import extract_audio | |
from core.subtitle_gen import generate_subtitles | |
from core.translator import translate_subtitles | |
from core.video_merger import merge_video_subtitles | |
# Available languages | |
LANGUAGES = { | |
"English": "en", | |
"Spanish": "es", | |
"French": "fr", | |
"German": "de", | |
"Japanese": "ja", | |
"Hindi": "hi" | |
} | |
def process_video( | |
video_file, | |
source_lang, | |
target_langs, | |
progress=gr.Progress() | |
): | |
# Create temp directory | |
with tempfile.TemporaryDirectory() as tmpdir: | |
try: | |
progress(0.1, desc="Extracting audio...") | |
audio_path = extract_audio(video_file.name, tmpdir) | |
progress(0.3, desc="Generating subtitles...") | |
srt_path = generate_subtitles(audio_path, tmpdir) | |
progress(0.5, desc="Translating subtitles...") | |
translated_subs = translate_subtitles( | |
srt_path, | |
[LANGUAGES[lang] for lang in target_langs], | |
tmpdir | |
) | |
progress(0.7, desc="Generating output videos...") | |
output_files = [] | |
for lang, sub_path in translated_subs.items(): | |
output_path = os.path.join(tmpdir, f"output_{lang}.mp4") | |
merge_video_subtitles( | |
video_file.name, | |
sub_path, | |
output_path | |
) | |
output_files.append(output_path) | |
progress(1.0, desc="Done!") | |
return output_files | |
except Exception as e: | |
raise gr.Error(f"Processing failed: {str(e)}") | |
# Gradio interface | |
with gr.Blocks(title="Video Translator") as demo: | |
gr.Markdown("# π₯ Video Translation System") | |
gr.Markdown("Upload a video to generate multilingual versions") | |
with gr.Row(): | |
with gr.Column(): | |
video_input = gr.File(label="Upload Video", type="file") | |
source_lang = gr.Dropdown( | |
label="Source Language", | |
choices=list(LANGUAGES.keys()), | |
value="English" | |
) | |
target_langs = gr.CheckboxGroup( | |
label="Target Languages", | |
choices=list(LANGUAGES.keys()), | |
value=["Spanish", "French"] | |
) | |
submit_btn = gr.Button("Translate Video") | |
with gr.Column(): | |
output_videos = gr.Files(label="Translated Videos") | |
submit_btn.click( | |
fn=process_video, | |
inputs=[video_input, source_lang, target_langs], | |
outputs=output_videos | |
) | |
if __name__ == "__main__": | |
demo.launch() |