VTT to SRT Converter

Paste, drop, or upload your .vtt file. See exactly what VTT-only features get stripped. Download a valid .srt in seconds — runs in your browser, no signup, no server upload.

Need the other direction? SRT to VTT Converter →

VTT → SRT Converter

0 chars · 0 cues
Paste VTT content on the left to see the converted output here.

Runs entirely in your browser — no signup, no upload to servers, no file limits. If you want subtitles generated from audio (not just converted between formats), upload audio here for accurate transcription in both .srt and .vtt formats.

Last verified July 13, 2026

How the conversion works (3 steps, transparent)

  1. Strip VTT header + metadata blocks. Remove the WEBVTT header line and any NOTE, STYLE, or REGIONblocks — SRT doesn’t support any of these.
  2. Convert timestamps. Change the millisecond separator from period to comma: 00:00:01.20000:00:01,200.
  3. Clean cue text and re-index. Strip inline VTT-only markup (<v Speaker>, <c.className>, inline timestamps), then number cues sequentially starting at 1 (SRT requires cue numbers; VTT makes them optional).

What gets stripped (the honest disclosure)

Every other online converter silently drops VTT features without telling you. Our tool shows you exactly what was removed. Here’s the full mapping:

VTT featurePreserved?What happens
Cue textYesCopied verbatim
TimestampsYesPeriod → comma
Multi-line cuesYesLine breaks preserved
Bold / italic / underline (<b>, <i>, <u>)YesSRT supports these tags
<v Speaker> voice tagsPartialSpeaker name preserved as inline Speaker: prefix
STYLE blocks (CSS)NoSilently dropped — no SRT equivalent
REGION blocksNoSilently dropped
Cue settings (align, line, position, vertical)NoSilently dropped
<c.className> class tagsPartialText preserved, tag stripped
NOTE commentsNoSilently dropped
Inline timestamps (karaoke-style)No<00:00:03.000> stripped
Cue identifiersNoReplaced with sequential SRT numbers
Chapter cuesNoSRT doesn’t support chapters

yt-dlp / YouTube captions → SRT

yt-dlp defaults to WebVTTwhen downloading captions from YouTube. That’s why so many people end up needing VTT → SRT conversion. Typical yt-dlp command:

yt-dlp --write-auto-subs --skip-download "https://www.youtube.com/watch?v=..."

This produces a .vtt file (or .en.vtt if you specified a language). YouTube auto-captions use inline <c> class tags to mark the currently-spoken word for karaoke highlighting — those get stripped when converting to SRT, leaving just the text. Paste the file above and download the SRT.

If you don’t have the video but want a full transcript, see How to Transcribe a YouTube Video for all four paths (native panel, widget, download + upload, Chrome extension).

Video editor compatibility

Why VTT → SRT is the more common direction: most editors and players prefer or require SRT. VTT support is inconsistent.

Editor / playerAccepts VTT?Accepts SRT?
Adobe Premiere ProPartial (via Captions panel)Yes (full)
DaVinci ResolveNo (native)Yes (Timeline → Import Subtitles)
Final Cut ProPartialYes (Edit → Captions → Import)
Camtasia / TechSmithNoYes
CapCutNoYes
VLCNo (drops silently)Yes (universal)
MPVYesYes
YouTube uploadYesYes
VimeoYesYes
HTML5 <video> + <track>Yes (spec-required)No (not supported)

If you’re going the opposite direction (need VTT for HTML5), see the SRT to VTT Converter.

How to convert VTT to SRT manually (no tool)

If you prefer to do it by hand — for a script, for education, or because you can’t use JavaScript — here’s the procedure:

  1. Delete the WEBVTT header line (the first line)
  2. Delete any NOTE, STYLE, or REGION blocks (each starts with those keywords and ends at the next blank line)
  3. Find . in timestamps → replace with , (careful: only inside HH:MM:SS.mmm patterns — use a regex like (\d{2}):(\d{2}):(\d{2})\.(\d{3}) $1:$2:$3,$4)
  4. Number each cue sequentially starting at 1 (add the number on its own line before the timestamp)
  5. Strip inline VTT tags: <v Speaker>...</v>, <c.className>...</c>, inline <00:00:03.000> timestamps
  6. Save as UTF-8 without BOM (avoid Windows-1252 or UTF-8 with BOM — both cause player issues)

FFmpeg one-liner (for CLI users)

ffmpeg -i input.vtt output.srt

Works but strips VTT-only features silently — no report of what was lost.

Python (webvtt-py library)

pip install webvtt-py
python -c "import webvtt; webvtt.read('input.vtt').save_as_srt('output.srt')"

Common issues + fixes

“Non-Latin characters garbled”

The file was saved as Windows-1252 or UTF-8 with a BOM. Open in VS Code, look at the encoding indicator in the bottom-right, click it, choose Save with Encoding → UTF-8 (not UTF-8 with BOM).

“Cue numbers missing / players won’t load the SRT”

SRT requires cue numbers (index each cue starting at 1); VTT makes them optional. Our tool adds them automatically. If your manual conversion skipped this step, add them.

“Voice tags left as <v>Speaker</v>literal text”

Some converters don’t parse the tag structure and leave the raw markup in the output. Our tool converts them to inline “Speaker:” prefixes so speaker attribution survives.

“Timing looks wrong after conversion”

Usually a broken source — a VTT file with malformed timestamps (extra spaces, wrong separators, missing digits). The tool skips invalid cues silently. Check the input VTT for consistency.

Have the audio? Skip the conversion — get subtitles fresh

If your goal isn’t “fix an existing subtitle file” but “get accurate subtitles for a video I have,” upload the audio instead of converting a stale/lossy caption file.

Our audio-to-SRT flow produces both .srt and .vtt from the same transcription pass — word-level timestamps, accurate to the millisecond, with speaker labels. ~1 minute processing per hour of audio. Free tier: 60 minutes, no credit card.

Upload audio for real transcription

  • SRT to VTT Converter The other direction — convert .srt to .vtt for HTML5 <video>, Podcasting 2.0, and modern web players.
  • SRT Generator + Guide Full SRT format explainer — anatomy, timing rules (BBC/Netflix), encoding gotchas, and 4 ways to generate.
  • Text to SRT (free tool) Have plain text (translated dialogue, script)? Convert to .srt with reading-speed-appropriate timings.
  • Audio to SRT (real alignment) Upload audio, get transcript + word-level timestamps. When timing has to match what was actually said.
  • Video to SRT Full video → .srt workflow. Extract, attach as soft-sub, burn-in with FFmpeg or NLE.

Frequently Asked Questions

How do I convert VTT to SRT online for free?

Paste your .vtt content into the tool above (or drop the file), and the converted .srt appears in the preview instantly. Click Download for the .srt file. The tool runs entirely in your browser — no signup, no server upload, no file size limit.

What's the difference between VTT and SRT?

SubRip (.srt) uses a comma as the millisecond separator (00:00:01,200) and doesn't support styling, positioning, or comments. WebVTT (.vtt) uses a period (00:00:01.200), starts with a WEBVTT header, and adds CSS styling, positioning cues, voice tags, and comment blocks. VTT is the W3C standard for HTML5 video captions; SRT is the universal legacy format that every video editor and player accepts.

Can I convert VTT to SRT with FFmpeg?

Yes: ffmpeg -i input.vtt output.srt. FFmpeg handles the format conversion but strips VTT-only features silently. Our browser tool does the same conversion but shows you exactly what got stripped — voice tags, cue settings, STYLE blocks, class tags, and comments.

How do I convert VTT to SRT with Python?

The webvtt-py library is the standard: pip install webvtt-py, then in Python: import webvtt; webvtt.read('input.vtt').save_as_srt('output.srt'). For one-off conversions, the browser tool above is faster and handles voice tags and cue settings correctly (some Python libraries mishandle these).

How do I batch convert multiple VTT files to SRT?

For a handful of files: use the tool above one at a time. For batch (dozens/hundreds): FFmpeg in a shell loop: for f in *.vtt; do ffmpeg -i "$f" "${f%.vtt}.srt"; done. Or use webvtt-py in a Python script. Our browser tool handles one file at a time by design.

Can I convert VTT to SRT offline?

The tool above is offline-capable once the page loads — everything runs in your browser with no server calls. For fully offline / no-network use: install FFmpeg or webvtt-py locally, or use Subtitle Edit (free desktop app for Windows / Wine on Mac/Linux).

Does VTT to SRT conversion lose caption styling?

Yes, because SRT doesn't support most of what VTT can do. Specifically stripped: CSS STYLE blocks, positioning cue settings (align, line, position), <v Speaker> voice tags (though we convert these to inline "Speaker:" prefixes to preserve speaker attribution), <c.className> class tags, NOTE comments, REGION blocks, and inline timestamps. Basic bold/italic tags (<b>, <i>, <u>) are preserved — SRT supports those.

Why does my .vtt from yt-dlp have weird <c> tags?

yt-dlp downloads YouTube's auto-generated captions in WebVTT format, and YouTube uses <c> class tags to highlight the word being spoken as it plays (karaoke-style). When you convert to SRT, those tags are meaningless and get stripped — leaving the plain text. Our tool handles this correctly and strips <c> tags while preserving the words inside.