Alex Volkov
Initial commit, let's see if this works on HF
6fd7ef3
raw
history blame
2.43 kB
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)