FOREIGN-WHISPERS / translated_video.py
sc45's picture
Initial Commit
f0ceee4
raw history blame
No virus
2.84 kB
from moviepy.editor import VideoFileClip, AudioFileClip
from pydub import AudioSegment
import srt
import datetime
import ffmpeg
import os
import re
def create_translated_video(original_video_path, translated_audio_path, translated_text_path, 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 the final video file
temp = "./translated/temp.mp4"
video.write_videofile(temp)
# Add subtitles
final_video_file = os.path.join(output_dir, "final_video.mp4")
# Correct the 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
# The rest of your script, if any