WaveSpeedAI InfiniteTalk
A still photo that lip-syncs to your audio
- client
- video_url
Take a photo of a person, hand it a piece of audio, and get back a video of that person saying it, with the mouth and expressions synced to the speech. That's InfiniteTalk - a talking-head / lip-sync model that hit the scene in August 2025 and got the internet very excited, very fast. This node from razvanmatei-sf/razv-wavespeed runs it through the WaveSpeed AI API, so no weights, no GPU, just an API key and a bill.
The obvious use is dubbing and avatars - voiceover a character, localize a video into another language while keeping the original performance's energy. The tooltip even mentions prompt can steer scene, pose, and behavior while preserving audio sync, so it's not a frozen-face puppet: you can direct some of the motion. There's also mask_image, to say which person in a group photo should do the talking. That last one is the detail that makes this node feel properly built rather than hastily wrapped.
How it works
WaveSpeedAI Client → image (the face to animate) + audio (the speech track) → POST to the InfiniteTalk endpoint → poll → video_url out. The output is a hosted video URL, not a file - download it before it expires.
The inputs that actually matter:
- audio - an audio file URL. The tooltip says connect from an "Upload Audio node," and just like the image-upload situation, that node isn't registered in the current build - so paste a publicly reachable audio URL.
- image - the person to animate. Public URL.
- resolution -
480por720p, and the tooltip prices it out: $0.15 per 5 seconds at 480p, $0.30 at 720p. Yes, the cost is in the node. That's this pack being honest. - prompt - optional instructions for scene/pose/behavior while keeping audio sync. This is the differentiator; use it.
- mask_image - optional, to select which person in a multi-person image animates.
- enable_base64_output - an optional toggle for getting the result as base64 instead of a URL. Leave it off unless you know why you need it.
seed (-1 = random) and enable_sync_mode (defaults off) round it out.
Install
Shared pack:
cd ComfyUI/custom_nodes
git clone https://github.com/razvanmatei-sf/razv-wavespeed
# restart ComfyUI
Or ComfyUI Manager → search "razv-wavespeed" → Install. Add a WaveSpeed AI key via the WaveSpeedAI Client node, config.ini (copy from config.ini.tmp, [API]), or a WAVESPEED_API_KEY env var.
Common issues
- It's priced per 5 seconds and video-shaped, so a minute of output is real money. The tooltip tells you the exact cost; believe it.
- URL inputs, and no upload node. The tooltips reference "Upload Audio"/"Upload Image" nodes that aren't in the current build. Host your files and paste the URLs.
- Face quality sets the ceiling. A small, side-on, or low-res face won't lip-sync convincingly. Use a clean, frontal, well-lit headshot.
- Sync fidelity varies with speech complexity - long silences, music, or multiple voices can confuse the alignment. Keep the audio track clean if you can.
- Ethics note, because this class of model needs one: don't put words in a real person's mouth without consent. It's that simple.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| client | WAVESPEED_AI_API_CLIENT | — | |
| audio | STRING | Audio file URL for generating lip-synced output (connect from Upload Audio node) | |
| image | STRING | Image to animate (connect from Upload Image node) | |
| resolution | COMBO | 720p | Output video resolution (480p: $0.15 per 5 seconds, 720p: $0.3 per 5 seconds) |
| enable_sync_mode | BOOLEAN | false | Wait for video generation to complete before returning |
| promptopt | STRING | Optional generation instructions to control scene, pose, and behavior while maintaining audio synchronization | |
| mask_imageopt | STRING | Optional mask image URL to specify which person to animate (connect from Upload Image node) | |
| seedopt | INT | -1-1–2147483647 | Random seed for reproducible results. -1 for random seed |
| enable_base64_outputopt | BOOLEAN | false | Enable base64 output format |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | — |