Subtitle Converter & Sync Fixer
Convert SRT to VTT and back, retime cues that drift out of sync, and fix the wording in an editable table of every line.
Output
The converted file appears here.
Pick SRT or VTT whenever you like — the output follows the choice.
Nothing to fix — every ticked rule already holds.
No subtitle cues were found
That file is not UTF-8
Export as
Override it if the accents still look wrong.
Negative moves every cue earlier.
A timecode with or without the milliseconds, or plain seconds — 00:41:02 and 2462 both work.
Ready to take away
How to use
- Open an .srt or .vtt file, drop it on the Cues pane, or paste the subtitle text there. Text that reads as subtitles turns into the table straight away.
- Read the note under the panes if one appears. It shows up when something was discarded, such as cue positioning or a block with an unreadable timestamp, or when the file was not UTF-8.
- Edit rows in place. Start and end take a timecode with or without the milliseconds (00:01:02 or 00:01:02,500) or a bare number of seconds, and a row whose end lands before its start stays marked until you fix it.
- Drop a junk cue with the ✕ at the end of its row. Advertising lines and hard-of-hearing labels usually go here.
- For an offset that stays the same all the way through, pick Shift every cue under Operation, type the seconds and press Shift.
- For drift that grows, pick Two-point resync and give both marks the times those lines should have, or pick Change frame rate if you know the two rates, then press Resync or Convert.
- Pick Clean up to see every proposed fix before it happens, untick any you disagree with and press Apply. Then choose SRT or VTT under Export as and press Download.
About this tool
An SRT your player refuses and a VTT your editor refuses are the same annoyance viewed from opposite ends. Open either one, drop it on the Cues pane or paste the text there, and every cue becomes a row: start, end, the words, and a ✕ for throwing the line away. The WEBVTT header and any NOTE, STYLE or REGION blocks are stepped over as the file is read. If a cue carried positioning settings, a note under the panes quotes what was removed, and blocks whose timestamps made no sense are counted in that same note rather than silently vanishing. A file that fails to decode as UTF-8 is read as windows-1252 instead, which is what most older subtitle files use, and Read as lets you pick another.
Timing is what most people arrive for. Shift moves every cue by the seconds you type, and a negative number pulls them earlier. Anything that would land before zero is clamped there, a cue shoved wholly into negative time is dropped, and the note under the panes names the cue that went and how much was clipped, with Undo one press away. Two-point resync covers the case where the gap widens as the film runs: name one line near the start and one near the end with the times they ought to have, and everything between is stretched to fit. The marks take 00:41:02, 00:41:02,500 or a plain count of seconds. When you know both framerates, Change frame rate does the same stretch from the two numbers alone.
What gets dropped on the way in
- Placement and style settings that sit after a timestamp are dropped while the file is parsed, and nothing brings them back. Formatting inside the text survives until you tick Strip formatting tags, which then clears anything in angle brackets or braces.
- SubRip and WebVTT are the only two formats it reads. Give it an .ass, .ssa or .sub and the parser finds no cues it recognises and tells you so instead of guessing at the file.
- Every cue is a live row in a scrolling table, and rows off screen are skipped until you scroll to them, which keeps a two-hour film of 1,240 cues workable; a track many times that size still makes the page heavy. Editing is all it does: no transcription, no translation.
Frequently asked questions
How do I turn an SRT into a VTT?
Open the file, switch Export as to VTT, then Download. Text and timings carry over untouched. The VTT gets a WEBVTT line at the top and writes its milliseconds after a dot, while going the other way numbers the cues from 1 again and puts a comma back in. The SRT is saved with a byte order mark, which older players use to recognise UTF-8; the VTT is saved without one.
My subtitles run a second behind the whole film. What do I type?
Minus one. Shift takes negative values to pull cues earlier and positive ones to push them later. If the file already started near zero, a cue at the top can be clamped or dropped, and the note under the panes says which one and how much of it went. Undo puts the track back as it was.
They line up at the start and end up minutes out. Why?
The subtitles were timed against a different framerate from the video you have, so the error grows steadily instead of staying put. Shift cannot fix that. If you know the two rates, Change frame rate stretches the track by their ratio: cues timed for 25 fps on 23.976 fps footage drift by 4.27%, over two and a half minutes by the end of an hour. Without them, Two-point resync works the stretch out from two lines you can see, one near the beginning and one near the end.
What does Fix overlaps actually change?
Cues are sorted by start time first, then any line still running when the next one begins has its end pulled back to a millisecond before that start. Clean up lists each of those changes before it makes one, so you can untick any you would rather keep. A cue completely swallowed by its neighbour ends up with no duration at all, which is your cue to delete it.
Missing something in Subtitle Converter & Sync Fixer? Suggest a feature →
Tell someone who needs this.