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) | |