Skip to main content
SubtitleMatrix

ASS to VTT

Format conversionAdvanced SubStation Alpha (ASS)
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 timecode

Output

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.

Related tools