Video_Summ / app.py
JaganathC's picture
Update app.py
38dc709 verified
import os
import gradio as gr
from moviepy.video.io.VideoFileClip import VideoFileClip
from pydub import AudioSegment
import whisper
from transformers import pipeline, MarianMTModel, MarianTokenizer
import yt_dlp as youtube_dl
def download_youtube_video(url):
try:
os.system(f"yt-dlp -o video.mp4 {url}")
return "video.mp4"
except Exception as e:
return str(e)
def extract_audio(video_path):
try:
audio = AudioSegment.from_file(video_path)
audio.export("extracted_audio.mp3", format="mp3")
return "extracted_audio.mp3"
except Exception as e:
return str(e)
def transcribe_audio(audio_path):
try:
model = whisper.load_model("base")
result = model.transcribe(audio_path)
return result['text']
except Exception as e:
return str(e)
def summarize_text(text):
try:
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
summary = summarizer(text, max_length=150, min_length=30, do_sample=False)
return summary[0]['summary_text']
except Exception as e:
return str(e)
def translate_text(text, tgt_lang="es"):
try:
model_name = f"Helsinki-NLP/opus-mt-en-{tgt_lang}"
tokenizer = MarianTokenizer.from_pretrained(model_name)
model = MarianMTModel.from_pretrained(model_name)
translated = model.generate(**tokenizer(text, return_tensors="pt", padding=True))
return tokenizer.decode(translated[0], skip_special_tokens=True)
except Exception as e:
return str(e)
def process_video(video_file, youtube_url, video_source):
video_path = ""
# Handle Video Selection Based on Radio Button
if video_source == "Local Video" and video_file:
video_path = video_file.name
elif video_source == "YouTube" and youtube_url:
video_path = download_youtube_video(youtube_url)
else:
return "No valid input provided.", None
# Extract Audio and Transcribe
audio_path = extract_audio(video_path)
transcription = transcribe_audio(audio_path)
return transcription, video_path
def summarize_and_translate(text, lang):
summary = summarize_text(text)
translation = translate_text(summary, lang)
return summary, translation
with gr.Blocks(css="""
.glass-card {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 20px;
padding: 2rem;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.btn-blue {
background-color: #007BFF;
color: white;
border-radius: 10px;
}
.btn-blue:hover {
background-color: #0056b3;
}
.gradient-font {
background: linear-gradient(90deg, #ff7f50, #ff6347);
-webkit-background-clip: text;
color: transparent;
}
.gradio-container {
background-color: black;
color: white;
}
""") as app:
gr.Markdown("<h1 class='gradient-font'>🎥 Smart Video-to-Text Summarization App</h1>")
with gr.Row():
video_source = gr.Radio(["Local Video", "YouTube"], label="Choose Video Source", value="Local Video")
with gr.Column(visible=True) as video_section:
# Display tabs based on radio selection
local_video_tab = gr.File(label="Upload Local Video File", type="filepath", visible=True)
youtube_video_tab = gr.Textbox(label="YouTube URL", visible=False)
def switch_tabs(source):
if source == "Local Video":
local_video_tab.visible = True
youtube_video_tab.visible = False
elif source == "YouTube":
local_video_tab.visible = False
youtube_video_tab.visible = True
video_source.change(switch_tabs, inputs=video_source)
video_display = gr.Video(label="Processed Video", visible=False)
process_button = gr.Button("🚀 Process Video", elem_classes=["btn-blue"])
transcription_output = gr.Textbox(label="Transcription", interactive=False)
# Show video and process it after selection
def display_video(video_path):
return video_path # Display the video selected/processed
process_button.click(process_video, inputs=[local_video_tab, youtube_video_tab, video_source], outputs=[transcription_output, video_display])
process_button.click(display_video, inputs=[video_display], outputs=video_display)
summarize_button = gr.Button("📝 Summarize Text", elem_classes=["btn-blue"])
summary_output = gr.Textbox(label="Summary", interactive=False)
translate_button = gr.Button("🌍 Translate Summary", elem_classes=["btn-blue"])
language_dropdown = gr.Dropdown(choices=["es", "fr", "de", "zh"], label="Select Translation Language")
translated_output = gr.Textbox(label="Translated Summary", interactive=False)
summarize_button.click(summarize_text, inputs=transcription_output, outputs=summary_output)
translate_button.click(summarize_and_translate, inputs=[transcription_output, language_dropdown], outputs=[summary_output, translated_output])
app.launch()