Subtitles a player will accept
A subtitle file is code. One missing blank line, one comma where a dot belongs, and the player silently shows nothing at all. This editor parses what you paste, checks what actually breaks playback, and writes a file that starts with WEBVTT — because that first line is not optional.
The VTT Subtitle Generator builds or repairs a WebVTT or SRT caption file. It shifts all timings by a fixed amount, fits the cues to a target duration, and checks the characters per line, reading speed and minimum gap before you save. The result can be previewed before download.
How it works
Open your subtitles
Paste an SRT or WebVTT file, or open one from your device.
Fix the timing and the lines
Shift every cue, limit the characters per line and set the reading speed.
Download the .vtt file
Save the cleaned WebVTT file for the player or platform.
- 100:00:01.000→00:00:04.500Paste your subtitle file abovecheck_circleok
- 200:00:04.800→00:00:09.200Each cue is checked against the limitscheck_circleok
- 300:00:09.400→00:00:11.100Overlaps and short cues are flaggedcheck_circleok
- 400:00:11.300→00:00:16.000Export VTT, SRT or plain textcheck_circleok
WEBVTT 1 00:00:01.000 --> 00:00:04.500 Paste your subtitle file above 2 00:00:04.800 --> 00:00:09.200 Each cue is checked against the limits 3 00:00:09.400 --> 00:00:11.100 Overlaps and short cues are flagged 4 00:00:11.300 --> 00:00:16.000 Export VTT, SRT or plain text
What gets checked
Overlaps
Two cues on screen at once is legal in VTT and wrong in practice. The fix button pushes the second cue behind the first with a small gap.
Reading speed
Characters per second is the honest measure of readability. Anything above 21 CPS is flagged, and the line is what needs shortening.
Line length
Text wider than the safe area is cut off on phones. Lines are wrapped at 32, 42 or 50 characters, at word boundaries.
Cue duration
Under 0.6 seconds a cue flashes; over 7 seconds it lingers. Both are reported so you can decide which one to fix.
The limits, written down
| Rule | Common value | Why |
|---|---|---|
| Characters per line | 42 (32 for vertical video) | Fits the safe area on a phone |
| Lines per cue | 2 | Three lines cover the picture |
| Characters per second | 17–21 | The speed an average viewer reads comfortably |
| Minimum duration | 0.6–1 s | Shorter reads as a flash |
| Gap between cues | 2 frames | Prevents the text from appearing to stutter |
| Timestamp separator | A dot in VTT, a comma in SRT | The single most common reason a file is ignored |
WebVTT and SRT: what actually differs?expand_more
VTT starts with the line WEBVTT, uses a dot before the milliseconds and supports cue settings such as line:90% and align:center after the timestamp. SRT has none of that: it is a number, two timestamps with commas and the text. VTT also allows a STYLE block that styles every cue through the player, and NOTE blocks for comments.
Where do the STYLE rules apply?expand_more
Only in players that implement them — browsers do, most desktop players do not. The styling written here uses ::cue, which is the standard selector, so the file stays valid even where the rules are ignored. The text itself always remains readable.
Why does my file show nothing?expand_more
The usual causes, in order: the file does not start with WEBVTT; a timestamp uses a comma; a cue has no blank line before it; the encoding is not UTF-8. All four are fixed by parsing the file here and exporting it again.
Can I convert VTT back to SRT?expand_more
Yes — the SRT button writes the same cues with commas and cue numbers, dropping the STYLE block and cue settings, because SRT cannot carry them.
- check_circleFile starts with WEBVTT on its own line
- check_circleTimestamps use a dot, not a comma
- check_circleNo cue overlaps the next one
- check_circleEvery line fits 42 characters
- check_circleReading speed stays under 21 CPS
- check_circleSaved as UTF-8 without a BOM
VTT questions
Is this tool free and private?expand_more
Can I edit an existing VTT file?expand_more
Does it handle SRT input?expand_more
Which format should I upload to YouTube?expand_more
How do I shift subtitles for a different cut?expand_more
WebVTT, Explained Without the Specification
WebVTT is the subtitle format of the open web. It was designed to be readable by humans and strict enough for machines, and it is smaller than it looks: a signature line, a series of cues, and optional blocks for styling and comments.
The anatomy of a file
It begins with WEBVTT on a line of its own. Then come cues, separated by a blank line. Each cue may have an identifier, then a timing line, then the text. The timing line looks like 00:00:04.500 --> 00:00:07.200 and may continue with settings such as align:start or line:85%.
That is the entire format. Everything else — STYLE blocks, NOTE blocks, regions — is optional decoration around it.
The mistakes that break playback
By far the most common is a comma instead of a dot in the milliseconds. That is SRT syntax leaking into a VTT file, and players reject the whole cue, sometimes the whole file. The second is a missing blank line between cues, which merges two cues into one unparseable block. The third is a byte order mark at the start of the file: invisible, and enough to stop a strict parser before the signature line.
Encoding matters too. UTF-8 is required for anything outside ASCII, and without it accented characters arrive as question marks.
Reading speed is the real quality bar
A cue can be perfectly timed and still useless. Characters per second tells you whether the eye can keep up: under 17 is comfortable, 21 is the usual ceiling for broadcast, and above 25 the viewer stops reading and starts guessing.
The fix is rarely to make the cue longer. It is to shorten the text: drop the filler, split the sentence across two cues, or let the picture carry the meaning for a moment.
Styling that survives
A STYLE block with a ::cue rule sets colour, size and background inside browsers. Most desktop players ignore it entirely, and that is fine — the text stays readable because the styling is decoration, not structure. Never hide information in a style rule: assume someone will see the file without it.
One file, many places
Keep the cues clean and the exports become trivial: VTT for the web player, SRT for the video platform, plain text for the transcript page. The captions generator on this site produces the first draft; this studio is where the file becomes something a player will actually accept.
Where to go next
fact_checkQuick facts
- WebVTT separates the milliseconds with a dot (00:00:01.000) and SRT with a comma (00:00:01,000), the one difference that breaks a file when it is simply renamed.
- About 15 to 17 characters per second is comfortable for most viewers, so a long cue has to be split rather than shortened in time.
- WebVTT is the format the HTML video element reads for captions, and it separates the millisecond with a dot.menu_bookW3C
- The older SRT format has no formal standard; it survives because every player imports it.menu_bookW3C
- A single emoji can be several code points joined together, so “count the characters” gives a different number from “count what you see”.menu_bookUnicode Consortium
helpQuestions people ask
What is the difference between VTT and SRT?expand_more
How do I shift subtitles that are out of sync?expand_more
How do I validate a WebVTT file?expand_more
hubWhat this page is about
- WebVTTopen_in_new
The W3C subtitle and caption format used by the HTML video element, with cue timings written as 00:00:01.000.
- Unicodeopen_in_new
The standard that gives every character of every script a code point, and defines what counts as one user-perceived character.
library_booksOfficial sources cited on this page
- WebVTT: The Web Video Text Tracks FormatW3C
- The Unicode StandardUnicode Consortium
Continue with the same file
Each of these opens what the tool above produces. Use “Use in another tool” under the result to carry the file over — it moves from tab to tab inside your browser, never to a server.
Switched-off tools are not listed here: only what works right now.