aaporosh's picture
Update app.py
d7933b3 verified
"""
YouTube Video Summarizer – Gradio Space
"""
import os
import gradio as gr
import whisper
from pytube import YouTube
from transformers import pipeline
import torch
# ── 1. Load models once at startup -------------------------
print("⏳ Loading Whisper base model...")
whisper_model = whisper.load_model("base") # 74 M params, fast on CPU
print("⏳ Loading BART-large-cnn...")
summarizer = pipeline("summarization",
model="facebook/bart-large-cnn",
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32)
# ── 2. Core pipeline ---------------------------------------
def summarize_video(url: str) -> str:
try:
# a) Download audio stream
yt = YouTube(url)
audio_stream = yt.streams.filter(only_audio=True).first()
if not audio_stream:
return "❌ No audio stream found."
audio_file = audio_stream.download(filename="audio.mp4")
# b) Transcribe
result = whisper_model.transcribe(audio_file)
transcript = result["text"]
# c) Summarize (BART has 1024 token limit; chunk if necessary)
max_chunk = 900 # tokens
chunks = [transcript[i:i+max_chunk] for i in range(0, len(transcript), max_chunk)]
summary_parts = []
for chunk in chunks:
summary_parts.append(
summarizer(chunk,
max_length=120,
min_length=30,
do_sample=False)[0]["summary_text"]
)
summary = " ".join(summary_parts)
# cleanup
os.remove(audio_file)
return summary
except Exception as e:
return f"⚠️ Error: {e}"
# ── 3. Gradio UI -------------------------------------------
iface = gr.Interface(
fn=summarize_video,
inputs=gr.Textbox(label="Paste YouTube URL"),
outputs=gr.Textbox(label="Summary", lines=10),
title="YouTube Video Summarizer πŸ€–",
description="Paste any public YouTube link and get an AI-generated summary in ~30 s."
)
if __name__ == "__main__":
iface.launch(server_name="0.0.0.0", server_port=7860)