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): | |
print(f"Baking {subs_file} into video... {input_file} -> {output_file}") | |
fontfile = fontsdir / 'arial.ttf' | |
fontstyle = 'Fontsize=18,OutlineColour=&H40000000,BorderStyle=3,FontName=Arial' | |
video = ffmpeg.input(input_file) | |
audio = video.audio | |
( | |
ffmpeg | |
.concat( | |
video.filter('subtitles', subs_file, fontsdir=fontfile, force_style=fontstyle), | |
audio, v=1, a=1 | |
) | |
.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 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) |