ASS to VTT
Or paste subtitle text
What this conversion changes
4 things are dropped or need a decision
- Styling
all styling except bold and italic (colour, outline, shadow, margins)
- Positioning
on-screen positioning (every cue returns to the default position)
- Karaoke
karaoke timing (per-syllable highlighting)
- Format-specific content
content the source format keeps outside its cues (non-cue blocks, header text, per-cue settings, commented-out events) — the target format has no place for it
This list comes from the capability matrix for these two formats, not from the particular file you loaded. A specific file may lose more if it uses features the format allows but the matrix does not model.
This page converts ASS to WebVTT. Drop a file in — or paste the text — and you get the VTT version back. The conversion runs entirely in your browser: nothing is uploaded, no account is needed, and the page keeps working with the network switched off once it has loaded.
ASS is the format subtitle houses use for styled work, and it carries more than WebVTT can hold, so this is a lossy direction and the report above is worth reading before you convert. Bold and italic survive — the override codes {\b1} and {\i1} become VTT's <b> and <i> tags — but the rest of the style table does not: colours, outlines, shadows and margins are dropped, along with the named styles themselves. Screen placement goes the same way, because {\pos(320,240)} and {\an7} have no counterpart in a format whose only placement is a limited set of cue settings. Karaoke timing cannot survive either; the syllables are kept as separate spans in the text, so the words are still there, but the highlighting that made them appear one after another is gone.
Two other things are worth knowing. ASS files often carry [Fonts] and [Graphics] sections, which embed the fonts and images the script uses; those are attachments for a renderer, they are not subtitles, and WebVTT has no such sections, so they are not carried over. And override codes the converter does not model — {\fad}, for example — are left in the text exactly as they were rather than being half-translated or dropped, so nothing disappears silently.
Awkward input is fine: a byte-order mark, Windows line endings, a comment line that is not a subtitle, or a timecode with a single decimal are all read without complaint. Drop in one file or a whole season; the queue works through them in order, you can stop it part-way, and the results come down together as a single ZIP.
Examples
A typical ASS file, converted to VTT
Input
[Script Info]
Title: Example
ScriptType: v4.00+
WrapStyle: 0
[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,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
Style: Title,Arial,36,&H0000FFFF,&H000000FF,&H00000000,&H00000000,-1,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
Dialogue: 0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello there.
Dialogue: 0,0:00:05.00,0:00:08.50,Default,,0,0,0,,{\i1}Italic{\i0} and {\b1}bold{\b0} text.
Dialogue: 0,0:00:09.00,0:00:12.00,Title,,0,0,0,,{\pos(320,240)}Positioned
Dialogue: 0,0:00:13.00,0:00:16.00,Default,,0,0,0,,{\k50}ka{\k30}ra{\k20}o{\k10}ke
Dialogue: 0,0:00:17.00,0:00:20.00,Default,,0,0,0,,Line one\NLine two
Dialogue: 1,0:00:21.00,0:00:24.00,Default,,0,0,0,,{\an7}Top left
Output
WEBVTT
00:00:01.000 --> 00:00:04.000
Hello there.
00:00:05.000 --> 00:00:08.500
<i>Italic</i> and <b>bold</b> text.
00:00:09.000 --> 00:00:12.000
Positioned
00:00:13.000 --> 00:00:16.000
<c>ka</c><c>ra</c><c>o</c><c>ke</c>
00:00:17.000 --> 00:00:20.000
Line one
Line two
00:00:21.000 --> 00:00:24.000
Top left
Dropped in this output: styling, positioning, karaoke and format-specific content. Everything else matches line for line.
The same conversion on an awkward input
Input
[Script Info]
; 一份真实的脏文件:BOM + CRLF + 认不出的覆写码 + Comment + 坏时间码
Title: Dirty sample
ScriptType: v4.00+
[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,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
[Fonts]
fontname: Arial
!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Comment: 0,0:00:00.00,0:00:01.00,Default,,0,0,0,,这是一条注释,不该变成字幕
Dialogue: 0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello, world
Dialogue: 0,0:00:05.00,0:00:08.00,Default,,0,0,0,,{\fad(300,300)}Unmodelled override
Dialogue: 0,0:00:09.00,0:00:12.00,Default,,0,0,0,,{\an7\pos(320,240)}Both, wrong order
Dialogue: 0,0:00:13.00,0:00:16.5,Default,,0,0,0,,One decimal centisecond
Dialogue: 0,0:00:17.00,0:00:20.00,Default,,0,0,0,,Soft\nbreak
Dialogue: 0,0:00:xx.00,0:00:24.00,Default,,0,0,0,,Broken timecodeOutput
WEBVTT
00:00:01.000 --> 00:00:04.000
Hello, world
00:00:05.000 --> 00:00:08.000
{\fad(300,300)}Unmodelled override
00:00:09.000 --> 00:00:12.000
Both, wrong order
00:00:13.000 --> 00:00:16.500
One decimal centisecond
00:00:17.000 --> 00:00:20.000
Soft
break
This is the kind of damage real files have — mixed line endings, stray whitespace, fields left empty. Compare it with the tidy example above to see what the parser forgives.
Frequently asked questions
Why is my karaoke timing gone?
WebVTT has no per-syllable timing. The syllables are preserved as separate spans in the text, so a karaoke line still reads as ka ra o ke in four parts, but the \k values that made each part light up in turn have nowhere to go. If you need the highlighting, keep the ASS file as the master and treat the VTT as the plain-text version.
Are bold and italic kept?
Yes. They are the two things WebVTT's inline tag set can express, so {\i1}Italic{\i0} comes out as <i>Italic</i>, and the same for bold. Everything richer than that — colour, outline, shadow, margins, font names — is dropped.
What happens to positioned subtitles?
They lose their placement. \pos(x,y) and \an7 are ASS-specific, and WebVTT's equivalent is a limited set of cue settings rather than arbitrary coordinates, so the text appears in the player's default position. The words themselves are untouched.
Where did the [Fonts] and [Graphics] sections go?
They are not carried over. Those sections embed the fonts and images a player needs in order to draw the script, and they are attachments rather than subtitles — WebVTT has no equivalent section. Embedding a font in a VTT is not possible, so plan on a system font or on styling at the player level.
Does a client's ASS script have to be uploaded to convert it?
No. The script is parsed and rewritten inside the browser tab, so nothing about it — the cues, the `[Script Info]` block, the style table — is sent anywhere. Load the page once, pull the network cable, and the conversion still runs.