JaganathC's picture
Update app.py
0df6496 verified
raw
history blame
4.98 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")
st.markdown("""
This app helps you:
- Convert videos into text and summarize them.
- Extract multilingual transcriptions and translations.
- Process videos with multiple speakers.
""")
# Temporary video storage
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")
# Buttons for navigation
col1, col2 = st.columns(2)
with col1:
local_upload_btn = st.button("πŸ“ Upload Local Video")
with col2:
youtube_upload_btn = st.button("πŸ“Ί Upload YouTube Video")
# Upload Local File
if local_upload_btn:
video_file = st.file_uploader("Upload your video file", type=["mp4", "mkv", "avi"], key="local-upload")
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!")
# Download Video from YouTube
if youtube_upload_btn:
youtube_url = st.text_input("Enter YouTube URL", key="youtube-upload")
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)}")
# Process Video Section
if st.session_state.video_path:
st.header("Process Your Video")
st.video(st.session_state.video_path)
st.write(f"Processing {st.session_state.video_path}...")
process_btn = st.button("πŸš€ Process Video", key="process-video", help="Click to start processing", 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 in extracting audio: {str(e)}")
return None
audio_path = extract_audio(st.session_state.video_path)
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
if audio_path:
st.session_state.transcription = transcribe_audio(audio_path)
# Summarize and Translate Section
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.")