Resync Subtitles to the Audio
The first run downloads the video engine — about 31 MB, served by this site and cached by the browser afterwards. It is used only to read the audio track; the subtitles are matched against the sound itself, with no speech model and nothing uploaded.
Options
How far the subtitles might be from where they should be, in either direction. It is a cost and a risk setting rather than an accuracy one: a wider window finds a larger drift but also gives the search more chances to settle on a coincidence that happens to score well. Nothing beyond about a minute comes from a trim or a logo — that much usually means a different cut of the film, or a frame-rate mismatch, which this page solves separately. Pick the smallest window that covers your guess.
This page fixes subtitles that are in the right order but at the wrong times. You give it two things — the subtitle file and the video or audio it belongs to — and it works out how far the text has drifted, then writes the file again with every cue moved. Drift of a few seconds comes from trims and logos; drift that grows through the film comes from a frame-rate mismatch, where a 23.976 fps master was paired with subtitles timed for 25 fps and the error is already a minute and a half by the end of the first hour.
The measurement is made from the audio itself. The page extracts a mono track, folds it into twenty-millisecond frames of loudness, and marks which frames contain speech. It then asks a single question over and over: for this shift and this speed change, how much of the subtitle text lands on speech rather than on silence? The answer is scored per cue and averaged, and the winning pair is what gets applied. No speech recognition is involved, which is why it runs in a couple of seconds and why it works when the subtitles are in a language you do not have a model for.
Because the score is a measurement rather than a guarantee, the page is built to do nothing when the measurement is weak. Five cues or fewer, an audio track with no detectable speech, a best score that still mostly lands on silence, or two very different alignments scoring about the same — each of those ends with a report and no rewritten subtitle file. A quiet failure is far better here than a confident one: subtitles pushed five seconds off look untidy, but subtitles pushed five seconds off by a tool that claimed success are hard to notice and hard to explain.
When the alignment is good you get two files, because the two answer different questions. The corrected subtitle keeps the format it came in, named film.synced.srt or whatever the extension was, ready to play. The report is a small text file with the shift in milliseconds, the ratio actually applied, the score, the confidence, and one line saying whether the file was touched at all. Both come out of the same run, so a batch of episodes produces a matched pair for each one.
The work is local. The audio is decoded by ffmpeg compiled to WebAssembly, downloaded once from this site and cached afterwards; the subtitle is parsed in the tab. Nothing about your film or your subtitles is sent anywhere — there is no upload step to skip, which matters for material that is not allowed to leave the machine.
Frequently asked questions
How is a measured shift different from the fixed offset I type into the shift page?
The shift page applies a number you already know, so it stays correct whether or not the audio agrees. This page starts from the opposite end: it assumes you do not know the number, reads the speech activity out of the audio, and solves for the shift and the speed change together. That is also why it can fix a frame-rate problem, which no single offset can express — at 25 against 23.976 the error is zero at the start and grows by about 3.6 seconds per hour, so a shift that repairs the beginning makes the end worse.
Why does the page sometimes refuse to write a new subtitle file at all?
Because a wrong correction is harder to detect than a missing one. The search reports four things: how many cues it had to work with, whether the audio contained any speech, what fraction of subtitle time landed on speech, and how much better the winner was than the best genuinely different alternative. If any of those is weak, the run produces only the report, whose state line says not-found along with the reason. You lose nothing — the original file is untouched — and you get a number you can check before doing anything manual.
What does the ratio in the report mean for a 23.976 to 25 fps mismatch?
Cue times are multiplied by the ratio and then shifted by the offset, so a ratio of 1.0427 means the subtitles were timed for a faster frame base and every cue has to be stretched later. The page tries both directions of each common pair, because which way it reads depends on which file you happen to hold: 1.0427 and 0.9590 are the same mismatch seen from either end. If the reported ratio is 1.000000 and the offset is under a frame, the file already lines up and is left alone.
Will the corrected file keep my styling, or only the timings?
The timing changes and nothing else does. The subtitle is parsed into the same internal representation every other page on this site uses, the start and end of each cue are rewritten, and it is serialised back into the format it arrived in. ASS styling, positioning and inline tags survive; so does the file's own structure, which is why a .ass in gives a .ass out rather than a flattened .srt. The one visible exception is a cue squeezed to under a millisecond by a large ratio, which is held at one millisecond and counted in the loss list.
Does this work when the subtitles are in a language the audio is not?
Yes, and that is the point of measuring loudness rather than recognising words. Speech activity is a shape — a sentence is a burst of energy followed by a gap — and that shape is the same whether the voice is speaking German or Spanish. A German dub under Spanish subtitles aligns as well as a matched pair would. What it cannot do is tell a dubbed line from an original one, so if the dub inserts extra dialogue the alignment still finds the overall fit but individual cues in the inserted passages may sit on the wrong line.