Keeping captions in sync with a dub
Captions burned before a dub drift against the translated audio. The fix is an order of operations that transcribes each dubbed track on its own.
The bug looks like this. A finished English video goes out to seven markets. Captions were burned in during the English edit, because that was the last step of the edit and it felt done. Then the dub runs, and in five of the seven languages the subtitle on screen is describing a sentence the speaker finished a beat and a half ago. In German it is worse than a beat and a half. Nobody notices in QC because QC watched the English master, which is still perfect.
This is not a rendering fault or a bad dub. It is what happens when caption timing is derived from one audio track and then played against a different one. The fix is entirely an ordering problem, and it adds no extra work at all provided you settle the order before the first job is dispatched.
Why the drift is structural
Translation changes how long it takes to say a thing. The same sentence that runs 2.4 seconds in English runs longer in German and shorter in Japanese, and there is no version of dubbing that makes that go away. A dub has two ways to handle it, and both of them break captions burned from the source language.
If the dub holds the original runtime, the translated line has to be compressed into the same window. Word boundaries move even though the total length did not, so a caption cue that was aligned to the third word of an English sentence now lands somewhere in the middle of a Spanish one.
If the dub is allowed to breathe, the drift is worse and more obvious. The enable_dynamic_duration setting on Versely's dub job exists exactly for this: it lets the output run longer or shorter than the source so a translation that does not fit the original timing gets a natural pace instead of an unnatural speed-up. That is almost always the right call for anything not cut to an exact ad slot — and it guarantees that timings taken from the source no longer describe the output.
There is a second, quieter reason. Dubbing translates the spoken audio. It does not translate on-screen text or existing captions, and it is not billed as though it did. Caption translation is a separate captioning job per language, which means a pipeline that never dispatches those jobs ships seven markets with English subtitles over translated speech.
The order of operations
Six steps. The only one people get wrong is the position of step 5.
- Lock the master edit. Everything downstream derives from it. A re-cut after fan-out means every dub and every caption pass is redone, and a resubmission is a new job, not a correction of an old one.
- Export the master with no burned captions. Not with captions you intend to replace — with none. Burned-in captions live in the pixels, so a master carrying English subtitles carries them into every dubbed language forever.
- Dub the clean master into each target language. One job per language. Engine choice is a separate decision with its own constraints, covered in two dubbing engines and their hard limits — it does not change the caption ordering either way.
- Wait for each dub to complete and collect its output URL. The dubbed file is now the source of truth for that language's timing. The English master is not.
- Caption each dubbed output separately, transcribing from that file. This is the step. You are not translating the English caption track. You are transcribing the German audio to produce German cues from German timing.
- Spot-check one hard line per language against the video, then publish.
Step 5 is where teams try to save effort by translating the source caption file and re-timing it by hand. That works, and it is slower and more error-prone than transcribing a file you already have, because the dubbed track already contains the correct timing. Reading it out is cheaper than reconstructing it.
Which caption tool actually transcribes
Versely has several tools with "caption" in the name and they are not interchangeable. Only one of them listens to audio.
| Tool | What it does | Right for a dub? |
|---|---|---|
add_veed_captions |
Auto-transcribes the audio and burns styled subtitles | Yes — this is the one |
add_video_captions |
Burns a fixed text overlay you supply, at one position | No — hook lines and CTAs, not speech |
add_timestamped_captions |
Burns text overlays you supply, each with its own start and end time | No — nothing is transcribed |
preview_caption_style |
Renders the opening seconds of your clip in a candidate style | Use before step 5, not instead of it |
The two overlay tools are useful and they are not subtitle tools. Handing add_timestamped_captions a translated script and a set of timings copied from the English edit is the manual version of the exact bug this post is about. If you are typing start and end times for dialogue, something has gone wrong upstream.
add_veed_captions supports a wide list of transcription language codes — the tool's own documentation names 165, including regional variants like es-ES against es-MX and en-GB against en-US. Set the language code explicitly per job rather than letting it infer. Inference is usually right and "usually" is not a property you want in a step that runs seven times unattended.
Presets sit in two tiers: a basic tier of 21 plain, legibility-first looks, and a dynamic tier of 9 animated ones that carry a higher credit cost per render. The transcription and the timing are identical across every preset. The tier buys the visual treatment, not accuracy, which means a localization pass is a perfectly good place to use the basic tier and spend the difference on more languages. If you want the look pinned to a house style instead, the caption style presets are the place to settle it once.
The QC pass that actually catches drift
Watching a dubbed video end to end in a language you do not speak is a bad use of a reviewer, and it is also how drift gets missed — subtitles that are consistently late read as "fine" to someone who is not tracking the words.
Check three points per language instead:
- The first spoken line. Drift is cumulative in some pipelines and constant in others. If the very first cue is already late, the transcription ran against the wrong file.
- The longest sentence in the piece. This is where a translation-length mismatch is most visible. Find it once in the English master, note its timecode, and check the corresponding moment in each output.
- The last line before the CTA. The end of the video is where drift has had the most opportunity to accumulate and where a mistimed caption does the most commercial damage.
Three checks, roughly thirty seconds a language, and they catch the two failures that matter: captions generated from the wrong source, and a dub whose dynamic duration pushed everything past the end of the timeline.
One thing worth knowing before you start re-rendering: captions are burned into pixels at render time, so changing the wording after the fact is a new captioning job rather than an edit to an existing one. Settle the copy before the final pass. The captions on a month of clips breakdown walks through how that shape adds up when the clip count is high.
The job count, before you dispatch
A seven-language localization from one master is not seven jobs. It is fourteen plus the master, and knowing that before you start is the difference between a planned batch and a surprise.
| Stage | Jobs |
|---|---|
| Master export, no captions | 1 |
| Dub | 1 per language |
| Caption the dubbed output | 1 per language |
| Re-caption after a copy change | 1 more per language affected |
The last row is the one that bites. Approving the master late is not a scheduling inconvenience — it doubles a stage. This is the same discipline the editor's preview pass encodes: iterate before you commit to a render, not after.
For the wider surface around this — style, fonts, readability — the captions task group collects the individual jobs, and automatic subtitles is the direct entry point for step 5.
FAQ
Can I translate my English caption file instead of re-transcribing?
You can, and you will then have to re-time it against the dubbed audio by hand, which is the work you were trying to avoid. The dubbed file already encodes correct timing for its own language. Transcribing it is reading that timing out rather than reconstructing it from a file that describes a different performance.
Does turning off dynamic duration fix the sync problem?
No. It changes the failure mode. Locking the dub to the original runtime keeps the total length identical but still moves word boundaries inside it, so cues still land in the wrong place — and it forces the translated read to compress, which usually sounds worse than the drift you were trying to avoid.
What about on-screen text that is not speech — titles, lower thirds, product callouts?
Dubbing does not touch them, and neither does a transcription pass, because they were never spoken. Those are text overlays and they need a localized version per language in the edit itself. Plan them as part of the master, not as a caption step.
Do I have to dub before captioning if the video has no speech to dub?
If there is nothing spoken, there is nothing to dub and nothing to transcribe — you are writing overlays, which is a different job entirely. The ordering rule only applies where translated speech is going to change the timing that captions are derived from.