To convert VTT to SRT, drop the .vtt file above and press Convert: the header and comments go, the cues are numbered, the dot before the milliseconds becomes a comma, and bold, italic and underline are kept. The same box converts SRT to VTT and ASS or SSA to SRT, several files at a time, without sending them anywhere.
VTT vs SRT: what actually differs
Both formats are plain text files with a start time, an end time and a few lines of text per cue. SRT (SubRip) is the older and simpler one, read by nearly every desktop player, video editor and TV. WebVTT was designed for the web: it is the format of the HTML5 <track> element and of the subtitle tracks inside HLS streams. The differences that break a file when you rename it instead of converting it:
| SRT | WebVTT | |
|---|---|---|
| First line | The first cue | WEBVTT, then optional metadata and a blank line |
| Cue numbers | 1, 2, 3... before each cue | Optional identifier, any text |
| Times | 00:01:02,500 with a comma | 00:01:02.500 with a dot; hours optional (01:02.500) |
| Position | Not in the format; many players read {\an8} for "top" | Cue settings after the time: line, position, align, size, regions |
| Styling | <b> <i> <u> and <font color> | <b> <i> <u>, classes <c.yellow>, speakers <v Name>, <lang>, <ruby>, CSS in STYLE blocks |
| & and < | Written as is | Must be escaped: & < |
| Comments | None | NOTE blocks |
How to convert VTT to SRT (and SRT to VTT)
- Drop one or more files on the box above, or paste the text in the field next to it.
- Leave Convert to on Auto (VTT and ASS become SRT, SRT becomes VTT), or choose SRT or VTT yourself.
- If the subtitles are out of sync, enter a shift or open More options for the frame rate.
- Press Convert. Each file gets a report, a before and after preview, and a Download button.
VTT to SRT removes the WEBVTT header and the NOTE, STYLE and REGION blocks, numbers the cues from 1, writes HH:MM:SS,mmm times, keeps <b>, <i> and <u>, and removes class, voice and language tags while keeping their text. Karaoke timestamps inside a cue (<00:00:07.500>, typical of YouTube captions) are removed, ruby readings are kept in parentheses, and &, <, >, , ‎ and ‏ become real characters. A cue placed at the top (line:0, or a percentage up to 20%) gets {\an8}, one in the middle gets {\an5}. Horizontal alignment is not carried over on purpose: YouTube puts align:start position:0% on every cue, and copying it would push every line to the left edge.
SRT to VTT adds the header, switches to dots, escapes &, < and >, removes <font> tags (WebVTT has none) and turns {\an8} into the line:0 setting. Converting VTT to VTT keeps cue identifiers and settings, which is handy to apply a shift or to clean a broken file.
ASS and SSA to SRT: what survives
ASS (Advanced SubStation Alpha) and its older form SSA are styling formats, common for anime fansubs and karaoke. SRT and WebVTT can only hold part of that. The converter reads the [Events] section with its own Format line, so the field order of the file is respected and commas inside the dialogue stay in the text.
- Kept: the text;
\Nline breaks;\nas a break only when the script sets WrapStyle 2 (a space otherwise, as in ASS);\has a no-break space; bold, italic and underline from{\b1}{\i1}{\u1}and from the style itself; a top or middle placement from\an, the old\aor the style alignment, written as{\an8}in SRT orline:0in VTT. - Lost: fonts, sizes, colors, outlines and shadows, exact positions (
\pos,\move), fades,\tanimations, karaoke timing and rotation. - Skipped: Comment lines and vector drawings (
\p1), which would otherwise show up as strings of coordinates.
Lines are sorted by start time, since ASS files do not have to be in order. Signs and dialogue often overlap in ASS: the report counts the overlaps, and the cues are kept as they are.
Fix subtitles that are out of sync
When every line is early or late by the same amount, a shift fixes it. Find a line you can hear clearly, note when it is spoken in the video and when it appears in the file, and enter the difference in milliseconds: -2000 shows everything 2 seconds earlier, 1500 shows it 1.5 seconds later. A cue pushed before 0:00 starts at 0:00, and a cue that would end before 0:00 is removed; the report says how many.
When the gap grows during the video, the subtitles were timed for another frame rate. Subtitles made for a 25 fps release run about 4% faster than a 23.976 fps video: after one hour the difference is close to two and a half minutes. Under More options, set the frame rate the subtitles were made for and the frame rate of your video; every time is multiplied by the first divided by the second, then the shift is applied.
What the report tells you
Hand-edited and auto-generated files are often slightly broken. The converter repairs what it safely can and lists every change with the line number in your file:
- Invalid timestamp such as
00:00:61,000: the cue is skipped, nothing is guessed. - Cue without an end time: it ends when the next cue starts, or 2 seconds later for the last one.
- Missing blank line between two cues: they are split before the second timing line.
- Blank line inside an SRT cue: the second part is kept with its cue instead of being lost.
- Cue that ends before it starts or lasts 0 ms: skipped, no player would show it.
- Overlapping cues: counted, not changed. Cues out of order: sorted. Missing or wrong SRT numbers: renumbered.
Encoding is detected too: UTF-8 with or without a byte order mark, UTF-16 in both byte orders, and Windows-1252 when a file is not valid UTF-8, the usual reason for accents turning into é. Windows-1252 is only a guess, so the page flags it and offers an encoding menu: a Russian file saved as Windows-1251, for example, would otherwise come out as Ïðèâåò instead of Привет. The output is always UTF-8. Tick Add UTF-8 BOM or Windows line endings only if an older player or program asks for them.
Subtitles from an HLS (m3u8) video
Streaming sites that use HLS keep subtitles apart from the video: the master playlist declares them with #EXT-X-MEDIA:TYPE=SUBTITLES, and that subtitle playlist lists small WebVTT segments. Paste the master playlist into the M3U8 Tester to see how many subtitle tracks a stream has. If you do not have the playlist URL yet, the M3U8 sniffer finds the .m3u8 links in a HAR file or a page source.
Once you have the segment files, join them in playlist order (cat seg1.vtt seg2.vtt seg3.vtt > all.vtt, or copy /b on Windows) and drop the result here. The repeated WEBVTT headers and X-TIMESTAMP-MAP lines are skipped, even when a segment ends without a blank line. In our test, ffmpeg 6.1 reading a local copy of such a subtitle playlist left the second header inside the text of the first cue. If every line then appears early or late by the same amount, correct it with the shift.
Other ways: ffmpeg and Subtitle Edit
From a terminal, ffmpeg converts by file extension:
ffmpeg -i input.vtt output.srt
ffmpeg -i input.srt output.vtt
ffmpeg -i input.ass output.srt
ffmpeg -itsoffset 2.5 -i input.srt output.srt
The last command delays every cue by 2.5 seconds (use a negative value to advance them). We checked this converter against ffmpeg 6.1.1 on the same files: identical cue counts and timestamps, including a 3,000-cue file, and ffmpeg reads our output back with the same cues and times. Two differences showed up. ffmpeg refused an SRT file whose first cue has no number ("Invalid data found when processing input"), which this page repairs. And converting ASS to SRT, ffmpeg wrapped every line in a <font size="20"> tag taken from the style.
Subtitle Edit is a free, open-source subtitle editor for Windows. Use it when you need to re-time lines one by one against the audio waveform, translate, or edit long files; for a straight format change it is more than you need.