Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import torch | |
| import yt_dlp | |
| import os | |
| import subprocess | |
| import json | |
| from threading import Thread | |
| from transformers import AutoTokenizer, AutoModelForCausalLM | |
| import spaces | |
| from moviepy import editor as mp # FIXED IMPORT | |
| import time | |
| import langdetect | |
| import uuid | |
| # Load LLM Model | |
| model_path = "Qwen/Qwen2.5-7B-Instruct" | |
| tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) | |
| model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16, trust_remote_code=True).cuda() | |
| model.eval() | |
| # Function to generate a unique filename | |
| def generate_unique_filename(extension): | |
| return f"{uuid.uuid4()}{extension}" | |
| # Function to download audio from a YouTube video | |
| def download_youtube_audio(url): | |
| output_path = generate_unique_filename(".mp3") | |
| ydl_opts = { | |
| 'format': 'bestaudio/best', | |
| 'postprocessors': [{'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3'}], | |
| 'outtmpl': output_path, | |
| } | |
| with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
| ydl.download([url]) | |
| return output_path if os.path.exists(output_path) else None | |
| # Function to extract audio from a video file | |
| def extract_audio(video_path): | |
| video = mp.VideoFileClip(video_path) | |
| audio_path = generate_unique_filename(".mp3") | |
| video.audio.write_audiofile(audio_path) | |
| return audio_path | |
| # Function to transcribe audio using Whisper | |
| def transcribe_audio(audio_path): | |
| model = whisper.load_model("base") | |
| result = model.transcribe(audio_path) | |
| return result["text"] | |
| # Function to summarize text using LLM | |
| def summarize_text(text): | |
| detected_language = langdetect.detect(text) | |
| prompt = f"Summarize the following text in 150-300 words in {detected_language}: {text[:300000]}..." | |
| response, _ = model.chat(tokenizer, prompt, history=[]) | |
| return response | |
| # Gradio function to process YouTube links | |
| def process_youtube(url): | |
| if not url: | |
| return "Please enter a YouTube URL.", "" | |
| audio_path = download_youtube_audio(url) | |
| if not audio_path: | |
| return "Error downloading YouTube audio.", "" | |
| transcription = transcribe_audio(audio_path) | |
| summary = summarize_text(transcription) | |
| os.remove(audio_path) | |
| return transcription, summary | |
| # Gradio function to process uploaded videos | |
| def process_uploaded_video(video): | |
| if not video: | |
| return "No video uploaded.", "" | |
| audio_path = extract_audio(video) | |
| transcription = transcribe_audio(audio_path) | |
| summary = summarize_text(transcription) | |
| os.remove(audio_path) | |
| return transcription, summary | |
| # Gradio UI | |
| with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("# 🎥 Video Summarizer") | |
| with gr.Tabs(): | |
| with gr.TabItem("📤 Upload Video"): | |
| video_input = gr.Video(label="Upload Video") | |
| video_button = gr.Button("Process Video") | |
| with gr.TabItem("🔗 YouTube Link"): | |
| url_input = gr.Textbox(label="Enter YouTube URL") | |
| url_button = gr.Button("Process URL") | |
| with gr.Row(): | |
| transcription_output = gr.Textbox(label="📝 Transcription", lines=10) | |
| summary_output = gr.Textbox(label="📊 Summary", lines=10) | |
| video_button.click(process_uploaded_video, inputs=[video_input], outputs=[transcription_output, summary_output]) | |
| url_button.click(process_youtube, inputs=[url_input], outputs=[transcription_output, summary_output]) | |
| demo.launch() | |