import gradio as gr import os from moviepy.editor import VideoFileClip from transformers import pipeline # Load models asr = pipeline(task="automatic-speech-recognition", model="distil-whisper/distil-small.en") summarizer = pipeline("summarization", model="facebook/bart-large-cnn") qa_pipeline = pipeline("question-answering", model="distilbert-base-cased-distilled-squad") # Global transcript stored_transcript = "" def transcribe_and_summarize(video_file): global stored_transcript if video_file is None: return "Error: No file provided.", "" try: video = VideoFileClip(video_file) audio_path = "temp_audio.wav" video.audio.write_audiofile(audio_path, codec='pcm_s16le') transcription_result = asr(audio_path, return_timestamps=True) transcribed_text = " ".join([segment['text'] for segment in transcription_result['chunks']]) stored_transcript = transcribed_text if len(transcribed_text.split()) < 50: summarized_text = "Text too short to summarize." else: summary_result = summarizer(transcribed_text, max_length=500, min_length=100, do_sample=False) summarized_text = summary_result[0]['summary_text'] return transcribed_text, summarized_text except Exception as e: return f"Error: {str(e)}", "" def answer_question(question): global stored_transcript if not stored_transcript: return "Please transcribe a video first." result = qa_pipeline(question=question, context=stored_transcript) return result['answer'] # Gradio UI with gr.Blocks(theme=gr.themes.Base()) as iface: gr.Markdown("## 🎥 Video Transcriber, Summarizer & Q&A Tool") gr.Markdown("Upload a video to get a transcript, summary, and ask questions about its content.") with gr.Tab("1️⃣ Transcription & Summary"): with gr.Row(): video_input = gr.Video(label="📂 Upload Video (.mp4)", interactive=True) with gr.Row(): transcribe_btn = gr.Button("🚀 Transcribe and Summarize") with gr.Row(): transcribed_text = gr.Textbox(label="📝 Transcribed Text", lines=8, interactive=False) summarized_text = gr.Textbox(label="📄 Summarized Text", lines=8, interactive=False) transcribe_btn.click(fn=transcribe_and_summarize, inputs=video_input, outputs=[transcribed_text, summarized_text]) with gr.Tab("2️⃣ Ask Questions"): with gr.Row(): question_input = gr.Textbox(label="❓ Ask a question based on the transcript", placeholder="E.g., What is the main topic?") with gr.Row(): ask_btn = gr.Button("🔍 Get Answer") with gr.Row(): answer_output = gr.Textbox(label="💬 Answer", interactive=False) ask_btn.click(fn=answer_question, inputs=question_input, outputs=answer_output) # Launch app port = int(os.environ.get('PORT1', 7860)) iface.launch(share=True, server_port=port)