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