Spaces:
Build error
Build error
| import ffmpeg | |
| import os | |
| from pathlib import Path, PureWindowsPath | |
| import anvil.media | |
| import os | |
| from typing import Iterator, TextIO | |
| def bake_subs(input_file, output_file, subs_file, fontsdir, translate_action): | |
| print(f"Baking {subs_file} into video... {input_file} -> {output_file}") | |
| fontfile = fontsdir / 'HelveticaWorld-Bold.ttf' | |
| fontname = 'Helvetica World' | |
| if translate_action: | |
| fontfile = fontsdir / 'Poppins-Black.ttf' | |
| fontname = 'Poppins' | |
| watermarkfile = fontsdir / 'watermark_new.png' | |
| video = ffmpeg.input(input_file) | |
| watermark = ffmpeg.input(watermarkfile) | |
| audio = video.audio | |
| probe = ffmpeg.probe(input_file) | |
| video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None) | |
| iw = int(video_stream['width']) | |
| ih = int(video_stream['height']) | |
| print(f"width {iw} and height {ih}") | |
| sub_size = 18 if iw > ih else 8 | |
| fontstyle = f'Fontsize={sub_size},OutlineColour=&H40000000,BorderStyle=3,FontName={fontname},Bold=1' | |
| ( | |
| ffmpeg.concat( | |
| video.filter('subtitles', subs_file, fontsdir=fontfile, force_style=fontstyle), | |
| audio, v=1, a=1 | |
| ) | |
| .overlay(watermark.filter('scale', iw / 3, -1), x='10', y='10') | |
| .output(filename=output_file) | |
| .run(quiet=True, overwrite_output=True) | |
| ) | |
| def str2bool(string): | |
| str2val = {"True": True, "False": False} | |
| if string in str2val: | |
| return str2val[string] | |
| else: | |
| raise ValueError( | |
| f"Expected one of {set(str2val.keys())}, got {string}") | |
| def format_timestamp(seconds: float, always_include_hours: bool = False): | |
| assert seconds >= 0, "non-negative timestamp expected" | |
| milliseconds = round(seconds * 1000.0) | |
| hours = milliseconds // 3_600_000 | |
| milliseconds -= hours * 3_600_000 | |
| minutes = milliseconds // 60_000 | |
| milliseconds -= minutes * 60_000 | |
| seconds = milliseconds // 1_000 | |
| milliseconds -= seconds * 1_000 | |
| hours_marker = f"{hours}:" if always_include_hours or hours > 0 else "" | |
| return f"{hours_marker}{minutes:02d}:{seconds:02d}.{milliseconds:03d}" | |
| def write_srt(transcript: Iterator[dict], file: TextIO): | |
| for i, segment in enumerate(transcript, start=1): | |
| print( | |
| f"{i}\n" | |
| f"{format_timestamp(segment['start'], always_include_hours=True)} --> " | |
| f"{format_timestamp(segment['end'], always_include_hours=True)}\n" | |
| f"{segment['text'].strip().replace('-->', '->')}\n", | |
| file=file, | |
| flush=True, | |
| ) | |
| def get_srt(transcript: Iterator[dict]): | |
| srt = '' | |
| for i, segment in enumerate(transcript, start=1): | |
| srt += f"{i}\n" \ | |
| f"{format_timestamp(segment['start'], always_include_hours=True)} --> " \ | |
| f"{format_timestamp(segment['end'], always_include_hours=True)}\n" \ | |
| f"{segment['text'].strip().replace('-->', '->')}\n" | |
| return srt | |
| def filename(path): | |
| return os.path.splitext(os.path.basename(path))[0] | |
| # if __name__ == '__main__': | |
| # meta = { | |
| # "id": 1576155093245693954, | |
| # "ext": 'mp4' | |
| # } | |
| # tempdirname = Path(f"encoding/temp/{meta['id']}") | |
| # video_file_path = f"{meta['id']}.{meta['ext']}" | |
| # srt_path = f"{meta['id']}.srt" | |
| # out_path = f"{meta['id']}_translated.mp4" | |
| # os.chdir(tempdirname) | |
| # bake_subs(video_file_path, out_path, srt_path) | |
| # anvil_media = anvil.media.from_file(out_path, 'video/mp4') | |
| # print(anvil_media) | |