Subtitle Format & Timing Toolkit
Convert SRT/VTT, shift whole timelines, and merge bilingual subtitles by time-overlap ratio — entirely in your browser, with no upload.Processed locally · no upload
Operations
SRT / VTT conversion
Convert SRT and WebVTT with integer milliseconds: BOM, CRLF, multi-line cues, 59,999 crossing a minute, comma/dot separators, cue numbers and blank lines are correct; NOTE/style blocks are skipped and the original stays downloadable.
Whole-timeline offset
Add an exact integer-millisecond offset to every cue (positive or negative). +1500 ms is exact, end is never smaller than start; negative starts are rejected by default with guidance, or clipped to 0 with an impact count.
Bilingual merge by time overlap
Two subtitle files are matched greedily one-to-one by overlap duration divided by the shorter cue duration — never zipped by line number. With unequal counts or shifted timelines, unmatched primary/secondary cues are listed separately.
Real examples and limits
Defaults: 5 MiB per file and 5000 cues. UTF-8 (including Chinese, BOM, CRLF) is read and saved correctly; non-UTF-8 input such as GBK / Big5 / Shift_JIS first asks you to choose a source encoding instead of guessing and emitting mojibake. The unified Cue model is {startMs,endMs,text} with integer milliseconds. VTT NOTE / STYLE / REGION blocks and inline cue settings are skipped or dropped; output stays player-parseable SRT/VTT but may lose positioning/style information, and the original file remains downloadable. Preview is plain text; subtitle tags are restricted to the whitelist b/i/u/c/v/ruby/rt/lang, so malicious HTML/script never executes.
FAQ
Is my subtitle text uploaded?
No. Parsing, offsetting, merging and serialization all run locally in the browser. Analytics is off by default and only sends whitelisted event metadata — never text, file names or URLs.
What differs between SRT and VTT timestamps?
SRT uses a comma for milliseconds (00:00:59,999) with numbered cues; VTT starts with WEBVTT, uses a dot (00:00:59.999) and needs no cue numbers. This tool round-trips with integer milliseconds.
Why does a GBK subtitle look garbled?
Decoding is strict UTF-8 by default. On invalid bytes or replacement characters the tool stops and asks for a source encoding; choose GBK / Big5, then it reads correctly and saves as UTF-8.
Will bilingual merge zip unrelated lines together?
No. Pairs are scored as overlap duration divided by the shorter cue duration (default threshold 0.5) and matched greedily one-to-one. Unmatched primary/secondary cues are listed separately instead of being zipped by line number.
Are VTT styles and positioning preserved?
Not fully. NOTE / STYLE / REGION blocks are skipped and inline align/position/voice attributes are dropped; output is clean, playable SRT/VTT. Download the retained original before converting.