Subtitle converter
Convert between SRT, WebVTT and ASS — with the comma-versus-full-stop trap handled.
The differences are small and they break players silently
These formats look almost identical and disagree in ways that produce no error message at all — the file simply does not work, and nothing tells you why. Each of them is handled deliberately here.
SRT uses a comma as the decimal separator: 00:01:02,250. WebVTT uses a full stop. Write an SRT with full stops and most players ignore the file without complaint.
WebVTT must begin with the word WEBVTT on its own first line. Without it a browser refuses the track outright, which is the usual reason a <track> element shows nothing.
WebVTT lets you omit the hours. 01:23.000 is a valid WebVTT time and an invalid SRT one, so converting the other way needs the hours put back. This writer always emits them.
ASS stores hundredths of a second, not thousandths — 0:01:02.25, with a single-digit hour. So SRT to ASS genuinely loses precision, and it has to round rather than truncate. Truncating makes every cue land up to nine milliseconds early, which across a long film is a visible creep.
The byte order mark
A UTF-8 BOM at the start of an SRT breaks the first cue's index in a great many players — the first subtitle simply never appears. It is invisible in every text editor. This strips it on the way in, never writes one out, and tells you when it found one, because that alone is often the whole problem.
Styling does not survive equally
ASS carries real styling: fonts, colours, positioning, karaoke timing. SRT supports a little inline HTML. WebVTT supports its own cue settings and almost none of ASS's. Converting downward loses things, and the honest options are to drop the markup cleanly or to leave it and risk a player rejecting the file.
<font color> is the specific trap: it is common in SRT and has no WebVTT equivalent, so leaving it in can invalidate the cue. Turn on "remove styling tags" when converting to WebVTT and it goes cleanly rather than half-translated.
Characters that are markup
In a WebVTT cue, &, < and > are markup. A line of dialogue containing "R&D" or a stage direction in angle brackets breaks the parse unless escaped, which this does. In ASS a line break is the literal characters \N, not a newline, and writing a real newline splits the event.
Renumbering
SRT indices are supposed to run 1, 2, 3 with no gaps. After anyone edits a file by hand there are usually gaps, and some players stop at the first one. Renumbering is on by default and costs nothing.
Plain text
Converting to plain text drops the timings and the markup and leaves the dialogue — useful for a transcript, a word count, or feeding into a translator. It is the one conversion here that is deliberately lossy.
Nothing is uploaded
This is text processing, so it happens in your browser. There is no file size limit, no queue, and the dialogue of an unreleased film does not pass through anybody's server.
Common questions
Why does my SRT not work after converting?
Most often the decimal separator: SRT needs commas, WebVTT needs full stops, and players ignore the wrong one silently. This writes each format correctly.
My WebVTT shows nothing in the browser.
It probably lacks the WEBVTT header line, or it uses <font> tags WebVTT does not support. This always writes the header, and the tag-stripping option removes the rest.
Does converting to ASS lose accuracy?
A little — ASS stores hundredths of a second, so times are rounded to the nearest 10 ms. Rounded, not truncated, which matters over a long file.
What is a byte order mark and why does it matter?
An invisible marker some editors put at the start of a UTF-8 file. It breaks the first cue index in many players, so it is stripped here and never written.
Can I convert ASS styling into SRT?
Not meaningfully. ASS carries fonts, colours and positioning that SRT cannot express. The dialogue and timings convert; the styling is dropped.
Is there a size limit?
No. It runs in your browser, so a feature-length file is no different from a short one.