Cutter / dub.py
salomonsky's picture
Update dub.py
aa87011
import os
import tempfile
from gtts import gTTS
from pydub import AudioSegment
import moviepy.editor as mp
from pocketsphinx import AudioFile
def merge_video_audio(video_file, audio_file, output_file):
video_clip = mp.VideoFileClip(video_file)
if audio_file is not None:
audio_clip = AudioSegment.from_wav(audio_file)
if audio_clip.duration < video_clip.duration:
audio_clip = audio_clip.set_duration(video_clip.duration)
else:
audio_clip = audio_clip.subclip(0, video_clip.duration)
video_clip = video_clip.set_audio(audio_clip)
video_clip.write_videofile(output_file, codec="libx264", audio_codec="aac", verbose=False)
def text_to_speech(text, lang='es'):
tts = gTTS(text=text, lang=lang, slow=False)
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_file:
tts.save(temp_file.name)
return temp_file.name
def transcribe_and_dub(video_file):
temp_folder = tempfile.mkdtemp()
try:
with mp.VideoFileClip(video_file) as video:
audio_file = os.path.join(temp_folder, "audio.wav")
video.audio.write_audiofile(audio_file, codec='pcm_s16le')
audio_transcription = []
with AudioFile(audio_file) as source:
audio_transcription = source.hypothesize()
text = " ".join(audio_transcription)
print(f"Texto reconocido: {text}")
dubbed_audio_file = text_to_speech(text)
print(f"Archivo de audio doblado: {dubbed_audio_file}")
original_audio = AudioSegment.from_wav(audio_file)
dubbed_audio = AudioSegment.from_mp3(dubbed_audio_file)
final_audio = original_audio.overlay(dubbed_audio)
video_with_dubbed_audio = mp.VideoFileClip(video_file).set_audio(final_audio)
dubbed_video_file = os.path.join(temp_folder, "dubbed_video.mp4")
video_with_dubbed_audio.write_videofile(dubbed_video_file, codec="libx264", audio_codec="aac", verbose=False)
print(f"Archivo de video doblado: {dubbed_video_file}")
return dubbed_video_file
except Exception as e:
print(f"Error durante la transcripción y el doblaje: {str(e)}")
return None