diff --git a/.gitignore b/.gitignore index 18089626dc6236b362b28f5b73836e9711453aef..d5283ab6a3cd51595be63e66e80e56a621715c5f 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ !karaUtils.py !autokara.py !segment.py +!assUtils.py media/ \ No newline at end of file diff --git a/assUtils.py b/assUtils.py new file mode 100644 index 0000000000000000000000000000000000000000..610081f7cf6cafd1d836c8e4e7c1d994d133ed8d --- /dev/null +++ b/assUtils.py @@ -0,0 +1,55 @@ +import numpy as np +import math + + +def timeToDate(time): + centiseconds, seconds = math.modf(time) + mins = int(seconds // 60) + remainder_sec = (seconds % 60) + centiseconds + hours = int(mins // 60) + remainder_mins = int(mins % 60) + return f'{hours:02d}:{remainder_mins:02d}:{remainder_sec:.2f}' + + + +class AssWriter: + + def __init__(self): + self.file = None + + def openAss(self, filename): + self.file = open(filename, 'w') + + def closeAss(self): + self.file.close() + + def writeHeader(self): + header = '''[Script Info] +Title: Default Aegisub file +ScriptType: v4.00+ +WrapStyle: 0 +ScaledBorderAndShadow: yes +YCbCr Matrix: None + +[Aegisub Project Garbage] + +[V4+ Styles] +Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding +Style: Default,Arial,48,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1 + +[Events] +Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text +''' + self.file.write(header) + + def writeSyls(self, syl_timings): + last_syl_dur = 500 + start_time = timeToDate(syl_timings[0]) + end_time = timeToDate(syl_timings[-1] + last_syl_dur//100) + line = f'Dialogue: 0,{start_time},{end_time},Default,,0,0,0,,' + for i in range(len(syl_timings) - 1): + syl_dur = round((syl_timings[i+1] - syl_timings[i]) * 100) + line += f'{{\k{syl_dur:d}}}' + line += f'{{\k{last_syl_dur:d}}}\n' + + self.file.write(line) \ No newline at end of file diff --git a/autokara.py b/autokara.py index 850cd0e3d3841a2a8c20c92563222863b74fd048..cf07dfc1c14341c589a253cc5574f77122b8c953 100644 --- a/autokara.py +++ b/autokara.py @@ -3,11 +3,13 @@ import demucs.separate import subprocess import shlex from pathlib import Path +from assUtils import AssWriter from segment import Segment try: video_file = sys.argv[1] + ass_file = sys.argv[2] except IndexError: print("usage : %s video_file" % sys.argv[0]) sys.exit("Invalid Arguments") @@ -31,3 +33,10 @@ vocals_file = "./media/vocals/htdemucs/%s/vocals.wav" % basename seg = Segment(vocals_file) onset_times = seg.onsets() + +writer = AssWriter() +writer.openAss(ass_file) +writer.writeHeader() +writer.writeSyls(onset_times) +writer.closeAss() +