import gradio as gr from utils import process_video # Define supported languages language_map = { "English": None, "Hindi": "Helsinki-NLP/opus-mt-en-hi", "Spanish": "Helsinki-NLP/opus-mt-en-es", "French": "Helsinki-NLP/opus-mt-en-fr", "German": "Helsinki-NLP/opus-mt-en-de", "Telugu": "facebook/nllb-200-distilled-600M", "Portuguese": "Helsinki-NLP/opus-mt-en-pt", "Russian": "Helsinki-NLP/opus-mt-en-ru", "Chinese": "Helsinki-NLP/opus-mt-en-zh", "Arabic": "Helsinki-NLP/opus-mt-en-ar", "Japanese": "Helsinki-NLP/opus-mt-en-jap" } # Custom CSS for a professional look css = """ body { background-color: #1a1a1a; color: #e0e0e0; font-family: 'Segoe UI', sans-serif; } .gradio-container { max-width: 1200px; margin: 0 auto; padding: 20px; border-radius: 8px; background: #2d2d2d; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); } .file-preview { border: 2px dashed #007acc; padding: 20px; border-radius: 8px; } .progress-text { color: #00ff00; font-weight: bold; margin-top: 10px; } """ # Define Gradio Interface with gr.Blocks(theme=gr.themes.Monochrome(), css=css) as demo: gr.Markdown("# 🎥 AI-Powered Video Subtitling") gr.Markdown("Upload a video (MP4/MKV/AVI) and select a language to generate subtitles.") with gr.Row(): with gr.Column(scale=2): video_input = gr.File( label="Upload Video File", file_types=["mp4", "mkv", "avi"], # Extensions without leading dots elem_classes=["file-preview"] ) with gr.Column(scale=1): language_dropdown = gr.Dropdown( choices=list(language_map.keys()), label="Select Subtitle Language", value="English" ) generate_button = gr.Button("Generate Subtitles 🚀", elem_classes=["btn-primary"]) progress_text = gr.Textbox( label="Status", interactive=False, elem_classes=["progress-text"] ) output_srt = gr.File(label="Download Subtitles") def generate_subtitles(video_file, language): try: # Validate original filename (not the temporary path) if not video_file.orig_name.lower().endswith(('.mp4', '.mkv', '.avi')): return None, "❌ Invalid file type. Please upload an MP4, MKV, or AVI file." # Initialize progress tracking progress = gr.Progress(track_tqdm=True) # Process video using the temporary file path progress(0, desc="Initializing...") srt_path = process_video(video_file.name, language, progress=progress) # Use video_file.name for processing if srt_path: progress(1, desc="✅ Subtitles generated successfully!") return gr.File(srt_path), "✅ Subtitles ready for download!" else: progress(0, desc="❌ Error during processing.") return None, "❌ Failed to generate subtitles. Check logs." except Exception as e: progress(0, desc="❌ Error encountered.") return None, f"❌ Error: {str(e)}" generate_button.click( generate_subtitles, inputs=[video_input, language_dropdown], outputs=[output_srt, progress_text] ) demo.launch()