SRT to VTT Converter - Subtitles, Resync & Plain Text
Pricing
$5.00 / 1,000 converted subtitles
SRT to VTT Converter - Subtitles, Resync & Plain Text
Convert SRT to VTT or VTT to SRT, strip timings to a plain text transcript, and resync cues by any offset. Paste text or pass up to 50 file URLs. Handles optional VTT hours, comma vs dot decimals and NOTE blocks. $0.005 per file; files with no cues are free.
Pricing
$5.00 / 1,000 converted subtitles
Rating
0.0
(0)
Developer
Broke to Built
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
SRT to VTT Converter — Subtitles, Resync & Plain Text
Convert SRT to VTT, VTT to SRT, or strip the timings entirely and get a plain text transcript. Paste the subtitle text or pass file URLs in bulk. Cues that run early or late can be resynced by any offset in the same pass.
No account anywhere, no upload step, no API key. $0.005 per subtitle file converted — a file that produces no cues is recorded and not charged.
What it does
| You have | You want | This does it |
|---|---|---|
.srt from a transcription tool | .vtt for an HTML5 <track> or YouTube | outputFormat: "vtt" |
.vtt from a browser player | .srt for Premiere, Resolve, VLC | outputFormat: "srt" |
| Either | A readable transcript for a description, blog post or summary | outputFormat: "text" |
| Subtitles 2.5s out of sync | The same file, corrected | shiftSeconds: -2 |
Input
{"subtitle": "1\n00:00:01,000 --> 00:00:04,000\nWelcome to the show.\n","outputFormat": "vtt","shiftSeconds": 0}
Or in bulk, from URLs:
{"urls": ["https://example.com/episode-01.srt","https://example.com/episode-02.srt"],"outputFormat": "vtt"}
| Field | Type | Notes |
|---|---|---|
subtitle | string | Raw .srt or .vtt contents. Source format is detected automatically. |
urls | string[] | Direct links to subtitle files, up to 50 per run, 5 MB each. |
outputFormat | vtt | srt | text | Defaults to vtt. |
shiftSeconds | integer | −3600 to 3600. Negative if subtitles run late. Defaults to 0. |
Output
One record per file:
{"ok": true,"source": { "type": "raw" },"sourceFormat": "srt","outputFormat": "vtt","cueCount": 2,"durationMs": 8000,"durationHms": "00:00:08","shiftSeconds": 0,"characters": 118,"content": "WEBVTT\n\n00:00:01.000 --> 00:00:04.000\nWelcome to the show.\n\n…","warnings": []}
content is the finished subtitle file — save it straight to disk.
What it gets right
Subtitle conversion looks trivial and is full of small traps. This handles them:
- WebVTT hours are optional.
00:01.000is one second in VTT, not one minute. Treating the first field as hours turns a one-second cue into a one-minute one; the parser decides by field count, never by position. - Decimal separators differ. SRT uses
00:00:01,000, VTT uses00:00:01.000. Both are read, and output is always written in the target format's convention. - Short fractions.
00:00:01.5means 500 ms, not 5 ms. - VTT cue settings (
align:start line:90%) after the end time are parsed and dropped rather than corrupting the timing. NOTE,STYLEandREGIONblocks are metadata and never leak into subtitle text.- CRLF line endings and a UTF-8 BOM are handled.
- Cue numbering is rebuilt from 1 on SRT output, so a shifted or filtered file is still valid.
- A negative shift clamps at zero instead of producing negative timestamps, and the cue count stays the same — which is what you are billed on and what you diff against.
- Plain text output strips
<i>tags and{\an8}positioning, because those are presentation, not words.
Pricing
$0.005 per subtitle file converted. No start fee. A file that yields no cues — an HTML error
page, a mislabelled download — produces an ok: false record explaining why and is not charged.
Limits
- 50 files per run, 5 MB per file.
- SubRip (
.srt) and WebVTT (.vtt) in, the same two plus plain text out. SSA/ASS, TTML and SCC are not supported. - Styling and positioning are preserved inside cue text on
srt/vttoutput, and removed ontextoutput.
FAQ
Does it need an API key or an account? No. Paste text or pass a URL.
Can it fix subtitles that drift progressively? No — shiftSeconds applies one constant offset.
Progressive drift is a frame-rate mismatch and needs rescaling, which this does not do.
Is my subtitle text stored? It goes to your own run's dataset on Apify, the same as any Actor output, and nowhere else.
Where do the subtitles come from? If you need to generate them first, see Audio & Video to Text (Whisper) — it outputs SRT, which this converts.
Changelog
- 0.1 (2026-09-10) — first release. SRT ↔ VTT, plain-text transcript, constant resync, bulk URLs. 30 local parser assertions cover the format traps listed above.
Who uses it
- Video developers converting SRT captions to WebVTT for an HTML5
<track>element - Podcast and video editors shifting subtitles that run two seconds late
- Course creators turning caption files into a plain-text transcript for show notes
- Localization vendors converting a batch of VTT files back to SRT for an editing tool
- Accessibility teams preparing caption files in the format their player requires