ZeeAI1 commited on
Commit
301515d
·
verified ·
1 Parent(s): 180987f

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +64 -0
app.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ os.environ["NUMBA_DISABLE_CACHE"] = "1"
3
+
4
+ import streamlit as st
5
+ import whisper
6
+ from gtts import gTTS
7
+ from moviepy.editor import VideoFileClip, AudioFileClip
8
+ from tempfile import NamedTemporaryFile
9
+ import torchaudio
10
+
11
+ st.set_page_config(page_title="AI Voiceover", layout="centered")
12
+ st.title("🎤 AI Voiceover App")
13
+
14
+ @st.cache_resource
15
+ def load_whisper_model():
16
+ return whisper.load_model("small")
17
+
18
+ whisper_model = load_whisper_model()
19
+
20
+ video_file = st.file_uploader("Upload a short video (MP4 preferred)", type=["mp4", "mov", "avi"])
21
+
22
+ if video_file:
23
+ with NamedTemporaryFile(delete=False, suffix=".mp4") as tmp_video:
24
+ tmp_video.write(video_file.read())
25
+ tmp_video_path = tmp_video.name
26
+
27
+ st.video(tmp_video_path)
28
+
29
+ video = VideoFileClip(tmp_video_path)
30
+ audio_path = tmp_video_path.replace(".mp4", ".wav")
31
+ video.audio.write_audiofile(audio_path)
32
+
33
+ st.info("Transcribing using Whisper...")
34
+ result = whisper_model.transcribe(audio_path)
35
+ st.subheader("📝 Detected Speech")
36
+ st.write(result["text"])
37
+
38
+ custom_text = st.text_area("Enter your voiceover text:", result["text"])
39
+
40
+ if st.button("Generate AI Voiceover"):
41
+ ai_voice_path = audio_path.replace(".wav", "_ai_voice.wav")
42
+ tts = gTTS(text=custom_text)
43
+ tts.save(ai_voice_path)
44
+ st.audio(ai_voice_path)
45
+
46
+ original_audio, sr = torchaudio.load(audio_path)
47
+ ai_audio, _ = torchaudio.load(ai_voice_path)
48
+
49
+ if ai_audio.shape[1] < original_audio.shape[1]:
50
+ diff = original_audio.shape[1] - ai_audio.shape[1]
51
+ ai_audio = torchaudio.functional.pad(ai_audio, (0, diff))
52
+ else:
53
+ ai_audio = ai_audio[:, :original_audio.shape[1]]
54
+
55
+ mixed_audio = (original_audio * 0.4) + (ai_audio * 0.6)
56
+ mixed_path = audio_path.replace(".wav", "_mixed.wav")
57
+ torchaudio.save(mixed_path, mixed_audio, sr)
58
+
59
+ final_video = video.set_audio(AudioFileClip(mixed_path))
60
+ final_path = tmp_video_path.replace(".mp4", "_final_streamlit.mp4")
61
+ final_video.write_videofile(final_path, codec="libx264", audio_codec="aac")
62
+
63
+ with open(final_path, "rb") as f:
64
+ st.download_button(label="📥 Download Final Video", data=f, file_name="final_ai_voiceover.mp4")