VTT to ASS
Or paste subtitle text
What this conversion changes
2 things are dropped or need a decision
- Precision
timing precision — the output's clock is coarser, so every timestamp is rounded to the nearest 10 ms
- 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 WebVTT to ASS. Drop a file in — or paste the text — and you get the ASS version back, with the script header, the style table and the dialogue events that a player expects. 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.
The two formats agree on the text, the line breaks and the order of the cues, so what you get back is the same subtitles written in a richer syntax. Two differences are worth knowing before you convert. ASS stores times in centiseconds, so 00:00:01.234 has to become 0:00:01.23 — every timestamp is rounded to the nearest 10 ms, and the report above says so rather than letting you discover it when you line the file up against a video. And ASS needs a style table, which WebVTT has no equivalent of; a single Default style is written for you, Arial at 20 with a black outline, and you can edit it in any subtitle tool afterwards.
What does not come across is everything WebVTT stores outside its cues. The header line and its comment, the NOTE, STYLE and REGION blocks, and the settings that can follow a timestamp such as align:start or position:10% all have nowhere to go, because ASS expresses placement inside the dialogue text with its own override codes and this conversion does not invent them for you. The report above lists those, and once a file is loaded it says how much of it that file actually had.
Awkward input is fine: a missing header, Windows line endings, a stray line before a timestamp or a byte-order mark 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 VTT file, converted to ASS
Input
WEBVTT
intro
00:00:01.000 --> 00:00:04.000
Hello there.
00:00:04.500 --> 00:00:08.000 align:start position:10%
Second line with <i>italics</i>.
Output
[Script Info]
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,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
Dialogue: 0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello there.
Dialogue: 0,0:00:04.50,0:00:08.00,Default,,0,0,0,,Second line with {\i1}italics{\i0}.
Dropped in this output: precision and format-specific content. Everything else matches line for line.
The same conversion on an awkward input
Input
a stray comment line
cue-id-1
00:00:01.000 --> 00:00:02.000
No header, two lines before the timecode.
Output
[Script Info]
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,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
Dialogue: 0,0:00:01.00,0:00:02.00,Default,,0,0,0,,No header, two lines before the timecode.
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 are my timings rounded?
ASS records time in centiseconds, a hundredth of a second, while WebVTT records milliseconds. A cue that starts at 00:00:01.234 becomes 0:00:01.23, so each timestamp moves by at most 5 ms. That is invisible when you watch the video and can matter when you compare the file against another one frame by frame.
Where does the style table come from?
It is written for you, because an ASS file without one is not playable. The output carries a single style named Default — Arial at size 20, white text with a black outline — and every dialogue line points at it. Change it in your subtitle editor afterwards if your house style differs; re-running this converter would overwrite your edit.
What happens to the settings after a timestamp, like align:start or position:10%?
They are dropped. ASS can place a cue precisely, but it does so with override codes inside the text — \an7 for the top left, \pos(320,240) for an exact point — and WebVTT's settings are a different, more limited vocabulary with no one-to-one mapping. Rather than guess a placement, the conversion leaves the text alone and reports the setting as lost.
Do NOTE, STYLE and REGION blocks survive?
No. They are WebVTT-only constructs with no counterpart in ASS. STYLE is the one to watch, since it can hold the whole document's layout rules rather than a passing comment; that styling will have to be rebuilt in ASS if you need it.
Can I convert a confidential WebVTT file here?
Yes. The file is read and written in the browser tab, so a WebVTT file under NDA never leaves the machine it is on — there is no upload step and no server-side parse. The output is written locally, and the page keeps converting with the network switched off.