A talking avatar whose mouth slowly falls out of step with the voice ruins an otherwise good video. Before you spend more generation credits on a re-render, it is worth finding out which of two different problems you have, because they have different fixes and many cases can be repaired in your editor. Last checked: 27 October 2026.
Key takeaways
- A constant offset stays the same from start to finish. Nudge the audio and you are done.
- Progressive drift grows over time. It is often a frame-rate or audio-timing mismatch introduced after generation, not a failure of the model.
- Convert clips to a constant frame rate, match audio to 48 kHz, and re-check at the start, middle and end before you re-render anything.
Two different problems
Constant offset. The mouth is slightly early or late at the first word, and the gap is the same at the end. At 30 frames per second, one frame is about 33 milliseconds, and at 24 frames per second it is about 42 milliseconds, so a gap of one or two frames is small but noticeable. Viewers tend to notice audio that arrives before the picture more easily than audio that arrives late.
Progressive drift. The mouth matches the first words, then falls further behind as the clip plays. By the end of a minute it can be a beat late. A drift like this usually points to timing: variable frame rate video, mismatched audio sample rates, or re-encoding that changed the length of one stream.
The three-point check
- Start: play the first spoken word. Is the mouth early, late or in sync?
- Middle: find a pause or a hard consonant such as a “p” or “b” near the halfway mark. Is the gap the same as at the start?
- End: check the last sentence. If the gap has grown, you have drift. If it matches the start, you have a constant offset.
| What you see | Likely cause | First fix to try |
|---|---|---|
| Same small gap start to end | A fixed offset between audio and video | Slip the audio track a frame or two, or use the offset command below |
| Gap grows over the clip | Variable frame rate or sample-rate mismatch | Convert to constant frame rate and 48 kHz audio, then re-import |
| Sync is fine in the generator, off after export | Export or conform settings changed timing | Match sequence and export frame rate to the source |
| Mouth shapes look wrong, not just late | The lip-sync model itself | Regenerate with the final audio, in shorter segments |
Fix 1: Check and convert the frame rate
Many clips from phones, screen recorders and some generators use a variable frame rate (VFR), which editors can handle badly. A quick check with FFprobe shows the frame rate values. If the two numbers differ, the clip is probably variable:
ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate,r_frame_rate -of default=nw=1 input.mp4
Convert to a constant frame rate that matches your project, and set the audio to 48 kHz while you are at it:
ffmpeg -i input.mp4 -vf fps=30 -c:v libx264 -crf 18 -c:a aac -ar 48000 output.mp4
Use 30 here only if your project is 30 frames per second. Use the same number as your editing sequence. If you prefer not to use the command line, most editors have a setting to conform or transcode media to constant frame rate on import.
Fix 2: Nudge a constant offset
In your editor, move the audio clip one or two frames earlier or later and play the first sentence again. Change by one frame at a time. If you would rather do it in FFmpeg, the following delays the audio in a new file by 0.08 seconds. Use a negative value to move it earlier:
ffmpeg -i video.mp4 -itsoffset 0.08 -i audio.wav -map 0:v -map 1:a -c:v copy -c:a aac output.mp4
Want the free PDF guide on making videos without filming? Jump to the sign-up.
Fix 3: Correct slow drift
If the gap grows steadily and the clip is already constant frame rate, the audio may be running slightly long or short. FFmpeg’s resample filter can stretch or squeeze the audio to match the timestamps. In this command the number is the maximum count of audio samples per second that FFmpeg may add or drop, so a modest value is safer than a very large one:
ffmpeg -i input.mp4 -af aresample=async=1000 -c:v copy -c:a aac output.mp4
Check the result by ear, and read the FFmpeg documentation for the resample filter for your version before relying on it for important work.
Fix 4: Re-generate in a way that avoids the problem
- Lock the final audio first. Generate the lip-sync on the exact audio you will publish, not on a version you later trim or re-encode.
- Use shorter segments. Splitting a long script into shorter clips and joining them gives timing less room to wander.
- Keep one sample rate. Use 48 kHz audio throughout the project.
- Match frame rates. Set the sequence, the source clips and the export to the same frame rate.
If the avatar’s face also looks warped when it moves, see our guide to fixing warping with camera-motion prompting. If the character changes between scenes, use the 3-scene consistency test to compare tools.
When to re-render and when not to
Re-render when the mouth shapes themselves look wrong, or when the sync is bad even in the raw file from the generator. Fix it in your editor when the raw file is fine and the problem appeared after import or export. Checking the raw file first takes a minute and can save the cost of a full re-generation.
FAQ
How much audio delay is too much?
There is no single number for every viewer. A gap of a frame or two is usually noticeable on close-ups, and audio that leads the picture tends to bother people more than audio that trails it. Aim for the mouth and the sound to feel locked together on hard consonants.
Why is the sync fine in the generator but off in my editor?
Timing can change on import or export, for example when a variable frame rate clip is placed on a constant frame rate timeline. Convert the clip first and keep the sequence and export frame rate the same.
Is this a problem with the AI model?
Sometimes, but a drift that grows over time is more often a timing mismatch in the files. Check the raw file from the generator before blaming the model.
Sources and further reading
- FFmpeg documentation: command-line options, including -itsoffset
- FFmpeg filters documentation: aresample
Kishor Gediya is the founder of PassiveOn, based in Surat, Gujarat, India. He has worked in affiliate marketing for about two years and writes about AI video tools and platform changes for faceless creators. He builds his own content workflows with n8n and Canva, and reports what he has tested himself separately from what comes from official sources.
FREE PDF GUIDE
Create YouTube videos without filming, editing or showing your face
Get the step-by-step guide, plus a short email whenever a platform rule changes that affects faceless channels.
No spam. Unsubscribe any time. See our Privacy Policy.