Spaces:
Runtime error
Runtime error
| import argparse | |
| import json | |
| import os | |
| import subprocess | |
| from audio_to_transcript import TranscribeAudio | |
| from translator import MyTranslator | |
| from utils import log | |
| from video_to_audio_converter import VideoToAudioConverter | |
| with open('resources/languages.json', 'r') as f: | |
| code2lang = json.load(f) | |
| # language code lookup by name, with a few language aliases | |
| lang2code = { | |
| **{language: code for code, language in code2lang.items()}, | |
| } | |
| LANGS = sorted(lang2code.keys()) | |
| class Pipeline: | |
| def __init__(self): | |
| self.video_to_audio = VideoToAudioConverter() | |
| self.audio_to_text = TranscribeAudio() | |
| self.translator = MyTranslator() | |
| def __call__(self, video_path: str, output_path: str, input_language: str, output_language: str): | |
| filename, ext = os.path.splitext(video_path) | |
| audio_path = self.video_to_audio.convert(video_path) | |
| subtitle_path = self.audio_to_text(audio_path, output_path, input_language) | |
| if input_language != output_language: | |
| subtitle_path = self.translator.translate(subtitle_path, lang2code[input_language], | |
| lang2code[output_language]) | |
| log(f"Embedding subtitles on input video and saves output video to {output_path}/output.mp4") | |
| # Use ffmpeg to add the subtitles to the input MP4 file and create the output MP4 file | |
| subtitles_cmd = ["ffmpeg", "-y", "-i", video_path, "-vf", f"subtitles={subtitle_path}", "-c:a", "copy", | |
| f"{filename}_{output_language}_output.mp4"] | |
| subprocess.run(subtitles_cmd, check=True) | |
| return f"{filename}_{output_language}_output.mp4" | |
| if __name__ == '__main__': | |
| parser = argparse.ArgumentParser( | |
| formatter_class=argparse.ArgumentDefaultsHelpFormatter) | |
| parser.add_argument("video", type=str, | |
| help="video path to transcribe") | |
| parser.add_argument("--output_dir", "-o", type=str, | |
| default=".", help="directory to save the outputs") | |
| parser.add_argument("--input_language", type=str, default=None, choices=LANGS, | |
| help="language spoken in the video, skip to perform language detection") | |
| parser.add_argument("--output_language", type=str, default=None, choices=LANGS, | |
| help="required translation language") | |
| args = parser.parse_args() | |
| pipeline = Pipeline() | |
| pipeline(args.video, args.output_dir, args.input_language, args.output_language) | |