We gave three local lip-sync models the same photo and the same 17-second line, then checked every pause frame by frame. None of them reliably closed the mouth when the voice stopped: the best managed 2 of 6 pauses. Here is what each one costs, what it looks like, and what we do about it.
The test
One photo, one line, three models, one box. The photo is our AI host Daisy's on-set portrait. The line is 50 words in her AI voice (ElevenLabs), 17.28 seconds long, with a timestamp for every word.
Every model got the same photo, the same audio, the same prompt and seed 42. LTX also got a second seed. Everything ran on one DGX Spark through ComfyUI, one job at a time.
How we counted
We count frames instead of trusting a playback. Every gap between words longer than 0.35 seconds is a pause, and the mouth should be shut there. Every 4th word is a speech point, and the mouth should be open.
A script grabs the frame at the middle of each one, cropped to the face. This line has 6 pauses (0.40 to 0.60 seconds each) and 12 speech points. On a real-looking face, lips slightly apart at a pause count as open.
One caveat up front: the photo itself shows Daisy with a parted, toothy smile, and the shared prompt asked for a "warm smile". Some of the open mouths at pauses may come from either. A mouth-closed portrait did no better in a separate run (0 of 6), so neither is the whole story.
The results
| Model (test, seed) | Closed at pauses | Open on words | Compute per second of video | Output |
|---|---|---|---|---|
| InfiniteTalk (314, 42) | 1 of 6 | 9 of 12 | 59.4 s | 832x480 |
| LTX 2.5 image+audio (324, 42) | 0 of 6 | 8 of 12 | 18.3 s | 1280x704 |
| LTX 2.5 image+audio (325, 1234) | 2 of 6 | 9 of 12 | 18.0 s | 1280x704 |
| Wan 2.2 S2V + Lightning (332, 42) | 0 of 6 | 12 of 12* | 22.4 s | 832x480 |
*S2V holds one parted smile for the whole clip, so every word counts as "open" by the rule. The mouth barely changes shape. I scored its lip-sync a 1 out of 5, the same as InfiniteTalk and LTX seed 42.
None of the three passes our bar of 4 of 6 pauses. All three stayed on-model from the first frame to the last.
What each model is like
InfiniteTalk is steady. The face holds across every window, and the motion is calm. But it holds an open smile at most pauses, with teeth at three of them. It is also the slowest by far: 17 minutes of compute for 17 seconds of video, about 3.3 times LTX.
LTX 2.5 image+audio is the most alive: head tilts, eyebrows, a real performance. It is also the fastest and the sharpest. The two seeds agreed on the first four pauses (all open) and split on the last two, which is why one seed is never a result.
Wan 2.2 S2V with the Lightning LoRA barely moves. The head stays still and the mouth sits in the same small parted smile throughout. It costs less than InfiniteTalk but more than LTX, and it doesn't read as talking.
Our own hosts fail it too
The hosts in our videos are LTX renders, so I ran the same count on them. Daisy closed her mouth at 2 of 22 pauses across four takes. Sloane did better: one of her takes closed 5 of 7, but the other seed, with the same audio, closed only 2 of 7. Her film take closed 4 of 12.
Longer pauses are not the fix either. A separate controlled run on Daisy closed at 6 of 52 pauses, no matter which voice model, seed, lips-closed prompt or reference photo it used. Pauses of 1.0 and 1.3 seconds stayed open there too.
So the instructional cuts away to the clips or the score sheets over Daisy's longer pauses. Sync is loose at pauses, and the captions say so.
Re-drawing only the mouth afterwards did not fix it either. TBDub closed 0 of 6 and 0 of 5 pauses on two of Daisy's clips; the details are in our post on what we're testing next.
What I'd actually do
- Use LTX 2.5 image+audio for talking hosts. It is the fastest, the sharpest and the most alive. Render two seeds and keep the better one.
- Write fewer pauses. Longer ones did not help in our controlled run. One film take did close at its three pauses over 0.6 seconds, but nine controlled takes did not, so treat that as luck until it repeats.
- Don't expect the prompt to fix it. On another Daisy line, asking for closed lips instead of a smile closed 1 of 6 pauses on LTX, the same as with the smile. We have not run a no-smile prompt on InfiniteTalk or S2V.
- Cut away over the long pauses. It is cheaper than any re-render.
- Count, don't watch. A score sheet takes seconds and catches what a quick playback hides.
Setup notes
- One GPU, shared memory. LTX runs in one ComfyUI and the other two in a second. Before a job, we tell the other one to unload. On the Spark's unified memory, a 14B model loading next to LTX can push the whole box close to running out of memory.
- InfiniteTalk works in windows of 81 frames at 25 fps. The last 9 frames of each window carry into the next, and each window uses the next seed up.
- LTX clip lengths come in steps of a third of a second (8 frames at 24 fps), so our graph builder cut the 17.28-second line down to 17.0 seconds and LTX made a 17.04-second clip. Only trailing silence was lost.
- S2V renders 77-frame chunks at 16 fps. The Lightning LoRA we used was trained for text-to-video, not sound-to-video. It cuts the job to 4 steps.
What did not run tonight
The box froze twice this morning and the queue lost about three hours. So these runs did not happen. InfiniteTalk and S2V on a second seed; InfiniteTalk with a stronger audio setting; S2V without the Lightning LoRA; the 48-second line; and the cartoon-host versions. The "do it twice" rule only holds for LTX in this post.
Settings
The InfiniteTalk ComfyUI graph is linked at the bottom of the page.
- InfiniteTalk: Wan 2.1 I2V 480p 14B fp8 + the InfiniteTalk single-speaker patch + the lightx2v rank-64 LoRA. 832x480, 6 steps, euler, CFG 1.0, audio scale 1.0, 25 fps.
- LTX 2.5 image+audio: the 22B distilled model (int8) with the Gemma text encoder. Two stages, 8 steps at half size then 3 at 1280x704, CFG 1.0, image strength 1.0, the voice frozen in both stages, 24 fps.
- Wan 2.2 S2V: S2V 14B fp8 with the lightx2v 4-step LoRA. 832x480, 4 steps, uni_pc, CFG 1.0, shift 8, 16 fps.
Timings include loading the model when it wasn't already in memory. They come from one Spark with other work running, so compare them with each other, not with a clean machine.