from moviepy.editor import VideoFileClip, AudioFileClip from pydub import AudioSegment import srt import datetime import ffmpeg import os import re import random def create_translated_video(original_video_path, translated_audio_path, translated_text_path, video_name, output_dir='./translated'): # Load original video video = VideoFileClip(original_video_path) # Load TTS audio new_audio = AudioFileClip(translated_audio_path) video = video.set_audio(new_audio) audio_segment = AudioSegment.from_file(translated_audio_path, format="wav") # Check if new audio is shorter to pad with silence if new_audio.duration < video.duration: silence_duration = (video.duration - new_audio.duration) * 1000 # convert to milliseconds silence_segment = AudioSegment.silent(duration=silence_duration) audio_segment = audio_segment + silence_segment padded_audio_path = os.path.join(output_dir, 'padded_audio.wav') audio_segment.export(padded_audio_path, format='wav') new_audio = AudioFileClip(padded_audio_path) # Generate SRT content def parse_translated_text(file_path): with open(file_path, 'r') as file: content = file.readlines() subtitles = [] timestamp_pattern = re.compile(r'\[(\d+\.\d+)\-(\d+\.\d+)\]') for line in content: match = timestamp_pattern.match(line) if match: start_time = datetime.timedelta(seconds=float(match.group(1))) end_time = datetime.timedelta(seconds=float(match.group(2))) text = line[match.end():].strip() subtitle = srt.Subtitle(index=len(subtitles)+1, start=start_time, end=end_time, content=text) subtitles.append(subtitle) return srt.compose(subtitles) # Generate SRT content srt_content = parse_translated_text(translated_text_path) # Write to an SRT file srt_file = './translated/translated.srt' with open(srt_file, 'w', encoding='utf-8') as file: file.write(srt_content) # Write final video temp file temp = "./translated/temp.mp4" video.write_videofile(temp) # Add subtitles ran = random.randint(1000,9999) final_video_file = os.path.join(output_dir, f"{video_name}{ran}.mp4") # Correct subtitle filter string for ffmpeg subtitle_filter_str = f"subtitles='{srt_file}'" try: ffmpeg.input(temp).output(final_video_file, vf=subtitle_filter_str).run() except ffmpeg.Error as e: print(f"Error creating final video: {e}") return None # Remove temp file os.remove(temp) return final_video_file