Lip Sync · Lip Sync
Redub the mouth, keep the performance
- video_url
- audio_url
- video
- task id
It's a redub, not a re-shoot
There are two ways to get a face talking on screen, and they get conflated constantly. Audio-driven avatars take a still portrait and make it speak - mouth, head, blinks, all generated. Lip sync takes video that already exists and replaces only the mouth, leaving the performance, lighting, framing and camera work exactly as shot. Locally these are different tools, and the avatar field has its own leaderboard (InfiniteTalk for speed, LongCat for quality-at-a-cost).
This node is the second thing. A clip and a new speech track go in, the mouth gets redrawn to match, and you get the same shot back with different words in it. $0.012 per second - a 20-second clip is about 24 cents, which makes it the cheap end of the hosted video tools.
How it works
The clip (90 MiB ceiling) and the audio are uploaded, spicyapi/lip-sync-v1/lip-sync returns an MP4 with your audio, and the node hands it over as a ComfyUI VIDEO. Resolution is kept up to 720p.
The pipeline this unlocks is the one the KB describes as canonical: generate the voice with a TTS node - Chatterbox is right there in this same pack - and feed it into the lip-sync node. Voice and mouth both come out of the graph, and you never opened an NLE.
Inputs and outputs
video_url (VIDEO) - the clip whose mouth movement is replaced. One clearly visible face works best. A clip shorter than the audio gets looped to cover the audio's length, which is a genuinely useful behaviour and also a trap if you didn't want a loop.
audio_url (AUDIO) - the new speech, 3 to 60 seconds, MP3 or WAV. The result runs as long as this audio does, and files outside the range are rejected before any charge. Wire a Load Audio node or the audio output of a TTS node straight in.
Outputs: video (VIDEO) and task id (STRING). Note there's no seed field - you don't get bit-identical repeats.
Install
Manager → search SpicyAPI, or:
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart. No dependencies, no weights - the pack declares an empty dependency list and everything runs on SpicyAPI's servers, so this works on a machine with no GPU. Python 3.10+ and a ComfyUI with the V3 node API. Set your key in Settings > SpicyAPI (or export SPICY_API_KEY on a server), restart once so the node list comes from your account, and set Max cost per run before you start iterating on a long clip.
What works and what doesn't
- Talking heads are the use case. A face that turns away, gets occluded, or moves through heavy motion blur gives the model little to work with. Interviews, vlogs, single-takes to camera: yes.
- One face. Multiple speakers in frame means picking a shot, not a setting.
- The performance is inherited. If the original take is flat and wooden, the redub is flat and wooden - the mouth moves, the acting doesn't change. That's what the Talking Avatar node is for instead.
- Audio length sets video length. 3–60 seconds, hard. A 90-second monologue needs to be split and stitched.
- Cost scales linearly and honestly. $0.012/s makes the price predictable, which is the good news: you can multiply before you run.
- The voice is not included. You're supplying the track - from your own recording, or a TTS node. Cloning a real person's voice without permission is a legal problem this node will happily let you create.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| video_url | VIDEO | Clip whose mouth movement is replaced. One clearly visible face works best; a clip shorter than the audio is looped to cover it. | |
| audio_url | AUDIO | New speech to sync, 3 to 60 seconds, MP3 or WAV. The result runs as long as this audio; files outside that range are rejected before any charge. | |
| seed | INT | 00–2147483647 | This model takes no seed, so the number is never sent. Changing it makes ComfyUI run the node again: set 'control after generate' to randomize for a new result on every run; every run is billed. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |