ASS to WebVTT: Subtitle Format Conversion Guide
🎬 Ready to convert? Use the free browser-based ASS to VTT Converter — no upload, no signup.
Open Converter →Table of Contents
If you are building a web video player or hosting video content online, you have almost certainly encountered the requirement for WebVTT subtitles. The problem is that many subtitle files come in ASS (Advanced SubStation Alpha) format — the standard for high-quality anime fansubs and styled caption tracks. ASS is powerful but not web-native; the browser's HTML5 <video> element does not support it directly.
WebVTT (Web Video Text Tracks) is the solution. It is the only subtitle format natively supported by all modern browsers via the <track> element, and it is accepted by virtually every streaming platform for caption uploads. This guide covers everything you need to know about converting ASS to WebVTT correctly.
What Is the ASS Format?
ASS stands for Advanced SubStation Alpha — an evolution of the older SSA format. An ASS file is structured plain text divided into sections:
- [Script Info] — metadata: title, creator, playback resolution
- [V4+ Styles] — named styles with font, size, color, border, shadow, and alignment
- [Events] — the timed subtitle events, each referencing a defined style
The [Events] section begins with a Format: line that declares column order, followed by Dialogue: lines for each subtitle cue:
Dialogue: 0,0:01:02.34,0:01:05.12,Default,,0,0,0,,This is the subtitle text\Nwith a second line.
The timestamp format is H:MM:SS.cc where cc is centiseconds. Inline style tags are wrapped in curly braces: {\i1}italic{\i0}, {\b1}bold{\b0}, {\c&H0000FF&}blue text{\r}.
What Is the WebVTT Format?
WebVTT (Web Video Text Tracks, defined in the WHATWG WebVTT specification) is the subtitle standard for the web. Every valid WebVTT file must start with the string WEBVTT on the first line, followed by a blank line, then the cues:
WEBVTT 00:01:02.340 --> 00:01:05.120 This is the subtitle text with a second line. 00:01:07.000 --> 00:01:09.500 Next subtitle here.
Key WebVTT characteristics:
- Timestamps use dot as the millisecond separator:
HH:MM:SS.mmm - Cue identifiers (numbers or strings) before the timestamp line are optional
- Cue settings (line, position, size, align) can follow the timestamp on the same line
- Supports HTML-like inline tags:
<b>,<i>,<u>,<ruby>, and timestamp tags for karaoke-style effects - Styling via CSS
::cueselector in the page stylesheet
Why Convert ASS to WebVTT?
The primary reason is web compatibility. WebVTT is the only subtitle format that works natively with HTML5 <video> via <track>. Platforms and use cases that require WebVTT:
- HTML5 video players — any player using the
<track>element requires VTT (Video.js, Plyr, JW Player, Shaka Player) - Streaming platforms — YouTube, Vimeo, Wistia, Cloudflare Stream all accept VTT for caption tracks
- CDN-based streaming — HLS and DASH manifests commonly reference VTT side-car files for subtitles
- Accessibility compliance — WCAG 2.1 Level AA requires captions for video; VTT is the web standard for delivering them
- LMS platforms — Moodle, Canvas, Kaltura, and Brightcove use VTT for video captions
- Modern browsers — Chrome, Firefox, Safari, and Edge all render VTT natively without plugins
What You Lose in Conversion
The dialogue text and timing are fully preserved. Here is what changes:
| ASS Feature | In WebVTT |
|---|---|
| Custom fonts and sizes | Removed — browser/player CSS controls appearance |
| Color styling ({\c&H...}) | Removed (VTT colors require CSS ::cue targeting) |
| Screen positioning ({\pos(x,y)}) | Removed — VTT uses its own cue settings syntax |
| Karaoke timing ({\k}, {\kf}) | Removed — syllable text preserved |
| Animated transforms ({\t(...)}) | Removed entirely |
| Drawing mode vector shapes | Removed entirely |
| Bold ({\b1}…{\b0}) | Mapped to <b>…</b> ✓ |
| Italic ({\i1}…{\i0}) | Mapped to <i>…</i> ✓ |
| \N and \n line breaks | Converted to real newlines ✓ |
| Dialogue text content | Fully preserved ✓ |
| Timing (start/end) | Fully preserved in HH:MM:SS.mmm format ✓ |
Format Internals: How ASS Parsing Works
The most important rule when parsing ASS files is to read the Format: line rather than assuming a fixed column order. The typical column order is:
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
But non-standard files may use a different column order. The correct parsing approach:
- Locate the
[Events]section - Read the
Format:line and build a column index map - For each
Dialogue:line, split on the first N-1 commas (where N = number of Format columns) - The
Textfield (always last) may contain commas — the N-1 split rule handles this correctly
Example: "Yes, I agree, but that is not the point." — a naive split(',') would truncate this to "Yes". The correct approach preserves the entire sentence.
Timestamp Conversion Details
ASS timestamps use centiseconds as the fractional unit. WebVTT timestamps use milliseconds with a dot separator. The conversion:
| ASS Timestamp | WebVTT Timestamp | Note |
|---|---|---|
| 0:01:02.34 | 00:01:02.340 | cc × 10 = ms; hours zero-padded |
| 1:23:45.07 | 01:23:45.070 | Single-digit centisecond → 070ms |
| 0:00:00.00 | 00:00:00.000 | Valid — starts at time zero |
| 0:01:02.999 | 00:01:02.999 | Three-digit fraction = already ms |
Unlike SRT (which uses a comma: 00:01:02,340), WebVTT always uses a dot: 00:01:02.340. Using a comma in a VTT file is a parse error — browsers will reject the cue. This is one of the most common mistakes when manually creating VTT files.
WebVTT timestamps must always have two-digit zero-padded hours, even for short videos — 00:00:01.000 is valid; 0:00:01.000 is not. Some parsers accept single-digit hours but it is not spec-compliant.
Tag Mapping: Bold, Italic, and More
ASS inline style tags use a curly-brace syntax. WebVTT uses HTML-like angle-bracket tags. The converter maps these directly:
| ASS Tag | WebVTT Tag | Notes |
|---|---|---|
{\i1}…{\i0} | <i>…</i> | Italic — fully supported |
{\b1}…{\b0} | <b>…</b> | Bold — fully supported |
{\u1}…{\u0} | <u>…</u> | Underline — stripped (uncommon) |
{\c&H...&} | Stripped | Color — use CSS ::cue in page styles |
{\pos(x,y)} | Stripped | Position — VTT uses cue settings instead |
{\an1}…{\an9} | Stripped | Alignment — VTT uses align/position settings |
All other {…} | Stripped | No VTT equivalent |
After tag mapping, any remaining curly-brace blocks are stripped entirely. The VTT output contains only valid WebVTT inline markup.
Using WebVTT in HTML5 Video
Once you have the .vtt file, adding it to an HTML5 video element is straightforward:
<video controls>
<source src="movie.mp4" type="video/mp4">
<track src="subtitles.vtt" kind="subtitles"
srclang="en" label="English" default>
</video>
The kind attribute accepts: subtitles (translation), captions (dialogue + sound descriptions), descriptions (audio description), chapters (chapter markers), or metadata (non-display data). For most subtitle conversions, use subtitles or captions.
To style the cues via CSS:
::cue {
font-size: 1.1em;
color: white;
background: rgba(0, 0, 0, 0.6);
border-radius: 4px;
}
::cue(b) { font-weight: bold; color: #ffd700; }
Note: ::cue styling has limited cross-browser support — Chrome and Firefox support it; Safari support is partial. For production deployments, test across browsers.
Batch Conversion Workflows
For converting multiple files — a full season of a show, a documentary series, or an e-learning course — the batch approach saves significant time:
- Browser tool — drop up to 50
.assfiles at once, convert, download as a ZIP nameddataconvesioncenter_ass_to_vtt_yyyymmddhhmm.zip. Each run produces a uniquely timestamped archive. - FFmpeg —
ffmpeg -i input.ass output.vtt. Batch with a shell loop:for f in *.ass; do ffmpeg -i "$f" "${f%.ass}.vtt"; done - Python + pysubs2 —
subs = pysubs2.load("input.ass"); subs.save("output.vtt"). Note: pysubs2 VTT output may not include the WEBVTT header in all versions — verify the output. - Node.js + subtitle package — the
subtitlenpm package supports ASS→VTT conversion via streaming transforms, suitable for server-side pipelines.
Frequently Asked Questions
WEBVTT (optionally followed by a space and a description), then a blank line. Also check: (1) the file is served with MIME type text/vtt — some servers default to text/plain which browsers reject for <track> elements; (2) CORS headers if the video and VTT file are on different domains.text/vtt. Web servers must be configured to serve .vtt files with this type or browsers will refuse to load them as subtitle tracks. In Apache: AddType text/vtt .vtt. In Nginx: add text/vtt vtt; to the types block.<track>. For platform uploads (YouTube, Vimeo, social media), both are widely accepted, but VTT is preferred for web-native delivery. For device playback (smart TV, media player), SRT typically has broader support.🎬 Convert your ASS subtitle files to WebVTT now — free, browser-based, no upload required.
Open ASS to VTT Converter →