YTSubConverter
A tool for creating styled YouTube subtitles
Install / Use
/learn @arcusmaximus/YTSubConverterREADME
YTSubConverter
A tool for creating styled YouTube subtitles.

About this tool
YouTube's built-in subtitle editor doesn't support styling of any kind. If you want formatting such as bold, italic and coloring, you need to upload a subtitle file instead. The site accepts a number of file formats such as RealText, WebVTT and TTML, but all of these come with their own limitations - and most importantly, none of them give access to the full array of features offered by the YouTube player. For that, you need to use a YouTube-specific format called SRV3 (also referred to as YTT for "YouTube Timed Text"). It supports the following:
- Bold/italic/underline
- Text coloring and transparency
- Background coloring and transparency (including hiding the background box completely)
- Outlines, glows and drop shadows
- Fonts and font sizes
- Positioning (place your subtitles anywhere on the video)
- Karaoke timing (make the syllables of a song lyric appear as they're sung)
- Vertical text
- Ruby text
YTSubConverter can produce this file format for you.
The current version is 1.6.5 and is available for Windows, macOS, and Linux.
Usage
YTSubConverter is primarily an .ass → .ytt converter. You can create .ass subtitles using Aegisub.
Conversion is straightforward: launch the program, open your .ass file and click Convert. Alternatively, drag the .ass straight onto the .exe (Windows only). In both cases, you'll get a .ytt file that's ready for upload.
The program tries to approximate the look of the Aegisub subtitles as closely as possible on YouTube:

You'll notice that each .ass shadow can turn into one of four different YouTube shadow types: glow (same as outline), bevel, soft shadow and hard shadow. You can even combine multiple shadow types if you want - just choose from the checkboxes in the conversion UI. This is also where you can configure current word highlighting for karaoke.

Apart from converting from .ass to .ytt, the tool can also convert from .sbv (the format you get when downloading subs from YouTube's built-in editor) to .srt. This allows you to download existing, unstyled subs and add styling to them. Simply open the .sbv file, click Convert, and open the resulting .srt file in Aegisub.
Conversion between .ttml and .ytt is also possible. YouTube already supports uploading TTML files directly, but this support is rather limited - if you convert to .ytt and upload that instead, you get access to more features, not to mention workarounds for YouTube bugs. That being said, certain features like karaoke and transitions are still only available through .ass.
ASS feature support
YTSubConverter supports the following .ass style features:
- Font name. YouTube only allows the following fonts:

(Roboto is the YouTube default; the tool will automatically pick this if the specified font is not allowed)
- Font size. The "Default" style (or the first style if there is no "Default") always gets the standard YouTube font size no matter what you pick, while the other styles are relative to it. For example, if the "Default" style has size 15 in Aegisub and the "Header" style has 30, these will be respectively at 100% and 200% of the standard size in YouTube. Note that you can't go lower than 75% and that the Android app always uses the same size no matter what you specify.
- Bold, italic, underline
- Primary, secondary, outline and shadow color
- Alignment. Note that on YouTube, apart from the usual effect on the subtitle's position, the alignment also influences how subtitles move when users hover their mouse over the video: top-aligned subtitles (alignments 7, 8 and 9) will move downwards, center-aligned subtitles (alignments 4, 5 and 6) will stay in place, and bottom-aligned subtitles (alignments 1, 2 and 3) will move upwards.
- Outline thickness and shadow distance (only checking whether the value is 0 or greater than 0)
It also supports the following override tags:
{\b}- bold{\i}- italic{\u}- underline{\fn}- font. (See above for list of allowed fonts){\fs}- font size. This tag is relative to the size of the "Default" style (or the first style if there is no "Default"). For example, if the "Default" style has size 15 and you put{\fs30}, the YouTube subtitle will be twice the standard size. Note that you can't go lower than 75% and that the Android app always uses the same size no matter what you specify.{\c}or{\1c}- regular text color{\2c}- unsung karaoke text color{\3c}- outline color{\4c}- shadow color{\1a}- regular text transparency{\2a}- unsung karaoke text transparency. If this is fully transparent, YTSubConverter will use YouTube's native karaoke feature, which hides the text and background box of unsung text even on mobile.{\3a}- background transparency{\4a}- shadow transparency. Due to YouTube limitations, this only works if the shadow color is &H222222& and the shadow transparency equals the text transparency.{\alpha}- set all transparencies at the same time{\pos}- position{\an}- alignment. The same rules for subtitle movement on mouseover apply as described above.{\k}- karaoke segment duration.{\r}- reset to current or specified style{\fad}- simple fade. Due to YouTube limitations, shadows and outlines don't fade along unless their color is &H222222&.{\fade}- complex fade. Due to YouTube limitations, shadows and outlines don't fade along unless their color is &H222222&.{\move}- move from one point to another{\t}- animate colors, transparencies and font sizes.{\ytsub}- start using subscript (only works on PC){\ytsup}- start using superscript (only works on PC){\ytsur}- switch back to regular script{\ytruby}- enable ruby text.{\ytruby}これは[漢/かん][字/じ]ですwill result in a 漢 with a かん above it, followed by a 字 with a じ above it. You can change the position of the ruby text:{\ytruby8}will display it above the line (default), while{\ytruby2}will display it below. This tag only works on PC; mobile apps will display これは漢(かん)字(じ)です instead.{\ytvert}- enable vertical text (only works on PC):{\ytvert9}- characters are placed vertically in columns, with those columns going from right to left.{\ytvert7}- characters are placed vertically in columns, with those columns going from left to right.{\ytvert1}- the whole subtitle is rotated 90° counter-clockwise so that the lines that used to go from top to bottom now go from left to right.{\ytvert3}- the whole subtitle is rotated 90° counter-clockwise and the order of the lines is inverted so they go from right to left.
{\ytdir4}- mark subtitle as right-to-left. This tag is only needed if you want to include right-to-left sentences (such as Arabic) in subtitles for a left-to-right language (such as English). If you're uploading to a right-to-left language, YouTube will set the text direction automatically. Note that, while{\ytdir6}theoretically allows you to set the direction to left-to-right, in practice it's not possible to include left-to-right sentences in subtitles for a right-to-left language (YouTube bug).{\ytpack}- start ({\ytpack1}) or stop ({\ytpack0}) packing text into the space of a single full-width character. Only works on PC in vertical text.{\ytshake}- make the subtitle randomly jump around.{\ytshake}- shake for the duration of the subtitle, staying within 20px of the original position.{\ytshake(radius)}- stay withinradiuspixels of the original position.\ytshake(radiusX, radiusY)- stay withinradiusXpixels of the original position on the X axis andradiusYpixels on the Y axis.{\ytshake(radius, t1, t2)}- start shaking att1and stop att2(both numbers are in milliseconds relative to the subtitle start time).{\ytshake(radiusX, radiusY, t1, t2)}
{\ytchroma}- adds a chromatic abberation effect. At the start, a red, a green and a blue copy of the subtitle come together and merge into the regular subtitle. At the end, the subtitle splits up into its three copies again which then disperse.{\ytchroma}- copies start at a distance of 20px and converge/disperse over 270ms.{\ytchroma(intime, outtime)}- copies converge overintimemilliseconds at the start and disperse overouttimemilliseconds at the end.{\ytchroma(offsetX, offsetY, intime, outtime)}- the first copy starts atoffsetXpixels to the left of andoffsetYpixels above the subtitle position. (The last copy starts at the same distance in the opposite direction.) Both offsets can be negative.{\ytchroma(color1, color2..., alpha, offsetX, offsetY, intime, outtime)}- replace the default red/green/blue by any number of custom colors. Both the colors and the alpha value should be specified in hexadecimal (&H...&).
{\ytkt}- enables advanced Karaoke Types.{\ytktFade}- Configure the line to use fading karaoke. While the effect looks nice, it results in very large subtitle files and can cause lag on certain devices.{\ytktGlitch}- Configure the line to use karaoke with glitching text. Looks for Latin, Chinese, Japanese and Korean characters in each syllable and generates random ones accordingly. Works best with left-aligned text and invisible unsung lyrics (= fully transparent secondary color).{\ytkt(Cursor,text)}- Places the specified text after the word that's currently being sung.{\ytkt(Cursor,formatting tags,text)}- Like the above, but you can customize the look of the cursor with override tags (similar to\t).- `{\yt

