Spaces:
Build error
Build error
import streamlit as st | |
from moviepy.editor import VideoFileClip | |
import speech_recognition as sr | |
from moviepy.editor import TextClip, concatenate_videoclips | |
from tempfile import NamedTemporaryFile | |
import os | |
# Function to extract subtitles using speech recognition | |
def generate_subtitles(video_path): | |
recognizer = sr.Recognizer() | |
clip = VideoFileClip(video_path) | |
audio = clip.audio | |
audio_file = NamedTemporaryFile(delete=False, suffix='.wav') | |
audio.write_audiofile(audio_file.name) | |
with sr.AudioFile(audio_file.name) as source: | |
audio_data = recognizer.record(source) | |
try: | |
# Recognize speech using Google Web Speech API | |
text = recognizer.recognize_google(audio_data) | |
except sr.UnknownValueError: | |
text = "Could not understand audio" | |
except sr.RequestError: | |
text = "Could not request results" | |
os.remove(audio_file.name) | |
return text | |
# Streamlit App | |
st.title("Video Trimmer with Subtitles") | |
# Video upload | |
uploaded_file = st.file_uploader("Choose a video...", type=["mp4", "avi", "mov", "mkv"]) | |
if uploaded_file is not None: | |
# Display uploaded video | |
st.video(uploaded_file) | |
# Load video file | |
video = VideoFileClip(uploaded_file) | |
# Time options for trimming | |
time_options = [15, 30, 60] # in seconds | |
trim_time = st.selectbox("Select trim duration", time_options) | |
# User selects trim time | |
start_time = 0 | |
end_time = trim_time | |
trimmed_video = video.subclip(start_time, end_time) | |
# Display trimmed video | |
st.video(trimmed_video) | |
# User selects subtitle font style | |
font_style = st.selectbox("Choose subtitle font style", ["Arial", "Courier", "Times-Roman", "Impact"]) | |
# Generate subtitles | |
subtitles_text = generate_subtitles(uploaded_file) | |
# Add subtitles to video | |
subtitle_clip = TextClip(subtitles_text, fontsize=24, color='white', font=font_style) | |
subtitle_clip = subtitle_clip.set_position('bottom').set_duration(trimmed_video.duration) | |
final_video = concatenate_videoclips([trimmed_video.set_audio(trimmed_video.audio), subtitle_clip]) | |
# Display final video | |
st.video(final_video) | |
# Button to generate video | |
if st.button("Generate Video"): | |
# Save the final video | |
final_output = NamedTemporaryFile(delete=False, suffix='.mp4') | |
final_video.write_videofile(final_output.name, codec="libx264") | |
st.download_button("Download Final Video", final_output.name) | |