Skip to content

Instantly share code, notes, and snippets.

@shehbajdhillon
Last active October 24, 2023 01:05
Show Gist options
  • Select an option

  • Save shehbajdhillon/3ee6481f21e9320ed23072f0048509fe to your computer and use it in GitHub Desktop.

Select an option

Save shehbajdhillon/3ee6481f21e9320ed23072f0048509fe to your computer and use it in GitHub Desktop.
Combine Everything
# Previous Code (Unchanged)
def combine_segments(segment_files, output_file_path):
# How to concatenate files in FFMPEG: https://trac.ffmpeg.org/wiki/Concatenate
input_list = []
filter_list = []
for idx, file_name in enumerate(segment_files):
input_list.append(f"-i file:{file_name}")
filter_list.append(f"[{idx}:v][{idx}:a]")
filter_list.append(f"concat=n={len(segment_files)}:v=1:a=1[v][a]")
input_args = " ".join(input_list)
filter_ags = "".join(filter_list)
ffmpeg_cmd = \
f"ffmpeg {input_args} -filter_complex '{filter_ags}' -map '[v]' -map '[a]' -vsync 2 file:{output_file_path}"
return os.system(ffmpeg_cmd)
def main():
file_path, input_language = sys.argv[1:]
input_language = str(input_language).lower()
transcript = transcribe_audio(file_path=file_path)
segments = transcript.segments
# Cut out the first segment from the input video for voice cloning
initial_segment = segments[0]
initial_segment_path = get_video_segment_path(file_path, initial_segment)
cut_segment(file_path, initial_segment.start, initial_segment.end, initial_segment_path)
voice_object = clone_voice(initial_segment_path)
delete_files([initial_segment_path])
processed_segments = []
for idx, segment in enumerate(segments):
translated_text = translate_segment(segment.text, input_language)
audio_file_path = get_audio_file_path(file_path, segment, input_language)
generate_speech(translated_text, voice_object, audio_file_path)
video_segment_path = get_video_segment_path(file_path, segment)
cut_segment(file_path, segment.start, segment.end, video_segment_path)
before_segment_path = get_before_video_segment_path(video_segment_path)
if idx == 0 and segment.start > 0.00:
cut_segment(file_path, 0.00, segment.start, before_segment_path)
processed_segments.append(before_segment_path)
elif idx > 0:
cut_segment(file_path, segments[idx - 1].end, segment.start, before_segment_path)
processed_segments.append(before_segment_path)
dubbed_video_segment = layer_video_audio(video_segment_path, audio_file_path)
processed_segments.append(dubbed_video_segment)
if idx == len(segments) - 1 and segment.end < get_media_file_length(file_path):
after_segment_path = get_after_video_segment_path(video_segment_path)
cut_segment(file_path, segment.end, get_media_file_length(file_path), after_segment_path)
processed_segments.append(after_segment_path)
delete_files([audio_file_path, video_segment_path])
dubbed_video_file_path = get_dubbed_video_file_path(file_path, input_language)
combine_segments(processed_segments, dubbed_video_file_path)
delete_files(processed_segments)
return dubbed_video_file_path
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment