SRT and WebVTT are the same idea written two ways: a list of cues, each with a start time, an end time and some text. Converting between them is a small job, and knowing exactly how small is useful, because it tells you when you can do it in a text editor and when you want something to check the result.
The same two cues, in both formats
1 00:00:01,000 --> 00:00:04,500 Welcome to forklift safety. 2 00:00:04,800 --> 00:00:09,200 Before you drive, walk around the truck and check the forks, chains and tires.
WEBVTT 00:00:01.000 --> 00:00:04.500 Welcome to forklift safety. 00:00:04.800 --> 00:00:09.200 Before you drive, walk around the truck and check the forks, chains and tires.
Three differences, and that is the whole of it:
- VTT starts with the line
WEBVTT, then a blank line. Without it, players reject the file. - Times use a period before the milliseconds,
00:00:04.500, where SRT uses a comma. - The cue numbers are optional in VTT. Keeping them is legal, and they become cue identifiers rather than a required sequence.
Everything else that differs is optional extra: VTT can carry styling, positioning, regions and comments, which SRT cannot. A converted file uses none of it.
Converting by hand, without breaking it
1Add the header
Open the .srt in a plain text editor. Put WEBVTT on the first line, and a blank line after it.
2Change the timestamp commas, and only those
This is where hand conversion goes wrong. A find-and-replace of every comma also rewrites the commas in the captions themselves, and you end up with “Before you drive. walk around the truck” in front of your learners. Replace commas only inside the timestamp lines: the ones with an arrow in them.
3Save it as UTF-8, with the .vtt extension
WebVTT is defined as UTF-8. If your editor offers a byte-order mark, leave it off. Accented characters and curly quotes are where a wrong encoding shows up, usually as a black diamond in the middle of a word that nobody notices until the course is live.
Which format does each thing want?
- A web page using the HTML5 video tag takes VTT and nothing else. This is the most common reason people need the conversion at all.
- Storyline 360 imports SRT, VTT, SBV and SUB, so either of these works; Articulate’s import page lists the four.
- YouTube and most video platforms accept SRT, and several accept VTT as well.
- Broadcast and some enterprise systems ask for TTML or its DFXP flavor, which is XML and a different animal from both of these.
Faults that survive a conversion
A caption file can be perfectly valid and still be wrong. These are the ones worth checking after any conversion, because a player will show you no error at all:
- Overlapping cues. One cue ending after the next one starts. Players handle it differently and some simply drop a line.
- Cues running past the media. Usually a sign the captions came from a different cut of the audio.
- Text nobody can read in the time given. Around 21 characters per second is the usual ceiling, and machine transcription cheerfully exceeds it. The Caption Reading Speed Checker ranks every cue worst-first and says how long each one would need.
- Lines too long for the player. Two lines of about 32 to 42 characters is the convention; Caption Line Splitter rewraps a file to a budget without retyping it.
- Timings shifted from the audio. If the whole file is out by the same amount, Caption Timing Shifter moves every cue at once rather than one at a time.