JaganathC's picture
Update app.py
3a20681 verified
raw
history blame
4.52 kB
import os
import streamlit as st
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
# App Configuration
st.set_page_config(page_title="Video-to-Text Summarization", layout="wide")
# Header
st.title("πŸŽ₯ Smart Video-to-Text Summarization App")
# Initialize session state
if "video_path" not in st.session_state:
st.session_state.video_path = None
if "transcription" not in st.session_state:
st.session_state.transcription = None
# Upload Video Section
st.header("Upload Your Video")
upload_option = st.radio("Choose upload method:", ["πŸ“ Local File", "πŸ“Ί YouTube URL"])
if upload_option == "πŸ“ Local File":
video_file = st.file_uploader("Upload your video file", type=["mp4", "mkv", "avi"])
if video_file:
with open("uploaded_video.mp4", "wb") as f:
f.write(video_file.read())
st.session_state.video_path = "uploaded_video.mp4"
st.success("Video uploaded successfully!")
elif upload_option == "πŸ“Ί YouTube URL":
youtube_url = st.text_input("Enter YouTube URL")
if youtube_url:
try:
os.system(f"yt-dlp -o video.mp4 {youtube_url}")
st.session_state.video_path = "video.mp4"
st.success("YouTube video downloaded successfully!")
except Exception as e:
st.error(f"Error downloading video: {str(e)}")
# Display video
if st.session_state.video_path:
st.header("Preview & Process Video")
st.video(st.session_state.video_path)
process_btn = st.button("πŸš€ Process Video", key="process-video", use_container_width=True)
if process_btn:
def extract_audio(video_path):
try:
audio = AudioSegment.from_file(video_path)
audio.export("extracted_audio.mp3", format="mp3")
st.success("Audio extracted successfully!")
return "extracted_audio.mp3"
except Exception as e:
st.error(f"Error extracting audio: {str(e)}")
return None
def transcribe_audio(audio_path):
try:
model = whisper.load_model("base")
result = model.transcribe(audio_path)
st.session_state.transcription = result['text']
st.text_area("Transcription", st.session_state.transcription, height=200)
return result['text']
except Exception as e:
st.error(f"Error in transcription: {str(e)}")
return None
audio_path = extract_audio(st.session_state.video_path)
if audio_path:
st.session_state.transcription = transcribe_audio(audio_path)
# Summarization & Translation
if st.session_state.transcription:
st.header("Results")
summarize_btn = st.button("πŸ“ Summarize Text")
translate_btn = st.button("🌍 Translate Summary")
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)
st.text_area("Summary", summary[0]['summary_text'], height=150)
return summary[0]['summary_text']
except Exception as e:
st.error(f"Error in summarization: {str(e)}")
return None
summary = None
if summarize_btn:
summary = summarize_text(st.session_state.transcription)
def translate_text(text, src_lang="en", tgt_lang="es"):
try:
model_name = f"Helsinki-NLP/opus-mt-{src_lang}-{tgt_lang}"
tokenizer = MarianTokenizer.from_pretrained(model_name)
model = MarianMTModel.from_pretrained(model_name)
translated = model.generate(**tokenizer(text, return_tensors="pt", padding=True))
translated_text = tokenizer.decode(translated[0], skip_special_tokens=True)
st.text_area("Translated Summary", translated_text, height=150)
return translated_text
except Exception as e:
st.error(f"Error in translation: {str(e)}")
return None
if summary and translate_btn:
target_language = st.selectbox("Select Translation Language", ["es", "fr", "de", "zh"], key="lang-select")
translated_summary = translate_text(summary, tgt_lang=target_language)
else:
st.info("Please upload a video to start the process.")