Fixing captions that land late
A uniform lag is an offset. Growing lag is drift. Frame-rate mismatch is a rescale. Pick the fix, not a restyle.
A caption that lands late is one of three bugs: a uniform offset, a drift that grows, or a frame-rate mismatch. Restyling will not fix any of them. Name the bug, then move the clock.
Caption timing is when each line appears and disappears relative to the speech — not the words, not the look. "The captions are off" is usually this clock. The line arrives after the mouth, hangs into the next sentence, or starts a second early because someone trimmed an intro after the burn. Karaoke families make the same error louder: a Snap punch on the wrong syllable is still an alignment miss.
This page is the diagnostic. The in-browser subtitle timing shifter is the offset tool for a sidecar. A burned-in file has no sidecar left to shift. That split decides the repair.
Offset: the whole track is late
Watch the first cue and the last cue.
If both are late by about the same amount — 400 ms, 1.2 s, a beat — you have an offset. Every timestamp is wrong by a constant. The usual cause is a trim you did after captioning: a 2-second slate removed from the head, a cold open you recut, a platform-safe crop that also dropped frames at the start. Less often: a captioner that includes a preroll the picture no longer has.
A constant is arithmetic. On a sidecar (.srt / .vtt), add or subtract that constant from every cue. The shifter does that in the browser and does not call a model. Do not pay a generator to "fix the sync."
On burned-in captions there is no cue list. The words are pixels. An offset means recaption the current picture — the file you actually have after the trim — not a nudge in an editor that no longer holds timestamps. Caption the locked cut. That rule is the whole of "why is my intro late again."
Measure the offset at the start, then confirm at the end. If the end is also ~1.2 s late, shift 1.2 s. If the end is 4 s late, you do not have an offset. Keep reading.
A single late name in an otherwise tight track is not an offset. That is an alignment miss on one token. Recaption or patch that cue. Do not shift the file because one surname lagged.
Drift: it gets worse
Drift is a track that starts acceptable and finishes drunk. The hook is fine. The closer is a second late, then two. Viewers who stay are the ones who see it. Retention graphs will not say "timing." They will say the back half died.
Two clocks are running at different speeds. That is almost always frame rate, treated in the next section, or a variable-frame-rate (VFR) phone file captioned as if it were constant. Phone camera apps love VFR. A 9:16 selfie that "is 30 fps" is often 24–30 depending on light. A captioner that assumed 30 fps will look fine for ten seconds and lie at 0:45.
Diagnostic: note the error at 0:05, 0:30, and the last 10 seconds. If the error is a flat line, offset. If the error is a slope, drift. Plotting is optional; three timestamps are enough.
Do not apply a constant shift to a slope. You will fix the hook and break the closer, or the reverse. The shifter is the wrong object. You need the timings rescaled, or you need to recaption against the actual audio of the file you will ship, after conforming the media to a constant frame rate.
Conform first when you can: 25 fps or 23.976 or 29.97, constant, then caption. A 24 fps clip dropped onto a 25 fps timeline is a slope waiting to happen. If you already captioned, recaption after the conform. Do not "nudge until it feels right" on a 3-minute Short; the middle will still be wrong.
Word-level timestamps (Snap, Reveal) inherit the same slope and look worse, because the punch is a syllable. If timed captions drift, the viewer thinks the karaoke is broken. It is the clock.
Frame-rate mismatch
A 25 fps caption file against 23.976 fps picture is the textbook case. Pal and film clocks. The ratio is small. Over a minute it is a visible lag. Over an episode it is a different scene.
The repair on a sidecar is a rescale: multiply every timestamp by (actual_fps / assumed_fps), or run a tool that does that conversion on purpose. A constant offset cannot represent a ratio. If you only have a shifter, you do not have a fix.
The repair on a burned-in MP4 is recaption after you know the picture rate. Read the file's fps. If you do not know it, you are guessing the slope. Do not guess.
Variable frame rate is mismatch that changes over the file. Rescale-by-a-constant will not save it. Conform to constant fps (hand off to an editor that can, or re-export), then caption. Phone screen recordings are frequent VFR offenders; so are some game captures. If the clip is a screen recording and the captions drift, suspect VFR before you suspect the captioner.
A second mismatch: the audio clock versus the video clock after a dub. You captioned the English, then replaced the soundtrack with a slower German take. The picture is the same length; the mouth is not. That is not fps. That is a new audio file. Caption the dubbed file. Translate then caption; do not reuse English cues.
A third: you sped the clip up 10% for a Short and kept the old captions. That is a rescale (×0.9), or a recaption of the sped file. An offset of "a bit earlier" will only help the open.
Burn-in freezes the clock
Decide the object you are repairing.
Sidecar still in hand. Offset → subtitle timing shifter. Drift / fps → rescale or recaption. Then, if the destination is a feed, burn the corrected track into a new MP4. A perfect .srt attached to a TikTok is still invisible in the mute autoplay.
Already burned. Recaption the locked file. Add captions to a video transcribes and times against the audio that is on this MP4. 165 language codes. 21 basic looks at 1× credits, 9 dynamic at 2×. Do not recaption in a 2× look to "try to hide" a 400 ms lag. The lag will pop on beat.
Preview before a long recaption. preview_caption_style is a look check. Timing QC is watching the first and last thirty seconds of the full burn. Drift shows up at the end. A 15-second preview of a 3-minute clip cannot show a slope.
Lock the cut before you caption. A later trim is a new timing pass. That sentence is in the glossary because it is the expensive one.
Place the recaption where the chrome is not. Timing can be perfect and still "feel late" if the line is under TikTok's composer field and the viewer reads it after they have already seen the mouth. That is placement, not offset. Different page, different fix: raise the block.
The AI caption generator is the recaption door when the file is the locked clip. Use it after the conform, after the dub, after the trim. Not before.
Late captions are a clock. Offset, drift, or fps. Pick one. Then move that clock, or burn a new one.
Fix the next cut in Versely.
FAQ
Why is the hook tight and the ending late?
That is drift, usually frame-rate or VFR, not an offset. A constant shift will make the hook early and the ending less late, or the reverse. Conform, then recaption.
Can I shift burned-in captions without re-rendering?
No. Pixels have no timestamps left. Recaption the locked file. Keep a sidecar only if you still need a course-player track.
Does a dynamic caption preset fix sync?
No. 2× looks animate the words you already have at the times you already have. Wrong times, prettier.