aiquizgenerator / app.py
harshith1411's picture
Update app.py
4a894f2 verified
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()