WaveSpeedAI InfiniteTalk Multi
Two People, One Photo, Two Audio Files — This Node Makes Them Talk
- client
- video_url
Picture this: you have a still photo with two people in it, and two separate audio files of those people talking. You want the photo to come alive - lips moving, heads turning, the two of them actually having a conversation. That's the entire job of WaveSpeedAI InfiniteTalk Multi, and it does it without you touching a single local checkpoint.
This is an audio-driven talking-head model, but the "Multi" part is the point. Regular InfiniteTalk animates one person from one image and one audio clip. Multi handles a scene with two characters and two audio tracks, then drives the conversation order. If you've ever tried to fake a two-person dialogue in ComfyUI with local video models, you know how much of a slog that is - this is the one-node shortcut.
How it works
Under the hood this node is a thin HTTP client. It takes your image and both audio files, POSTs them to WaveSpeed's hosted API at api.wavespeed.ai, and polls until the video is done. Nothing runs on your machine - no diffusion, no VRAM, no model download. You pay per clip instead.
There's a wrinkle in how you feed it media. The tooltips say "connect from Upload Image node" and "Upload Audio node," but in the shipped source there are no such nodes - every input is a plain URL string. You paste a public URL for the image and for each audio file. The audio needs to be hosted somewhere WaveSpeed can reach; Dropbox/Google Drive direct links work, or anything URL-addressable.
The inputs that matter
- client - required, the
WAVESPEED_AI_API_CLIENToutput from a WaveSpeedAI Client node. No client, no call. - left_audio / right_audio - the two voices. They map to characters by position in the image.
- image - the group photo you're animating.
- resolution - 480p or 720p. The tooltip literally prices it: $0.15 per 5 seconds at 480p, $0.30 per 5 seconds at 720p. Rare to see pricing in a tooltip, and it's the honest truth about what you're buying.
- audio_order -
meanwhile(both talk at once),left_right, orright_left. This is how you choreograph the conversation. - mask_image - optional, but it's the one that saves you. If the model animates the wrong person, mask out whoever you don't want moving.
prompt and seed round out the optional list; seed is -1 (random) by default, set it if you want a reproducible take. The output is a single video_url string - a hosted file. It's not a video tensor, so you can't pipe it straight into ComfyUI's local video processing; wire it to a text-preview node or just open it in a browser.
Installing it
Same story for every node in the Razv WaveSpeed pack:
cd ComfyUI/custom_nodes
git clone https://github.com/razvanmatei-sf/razv-wavespeed.git
cd razv-wavespeed
pip install -r requirements.txt
Or ComfyUI Manager → search "razv-wavespeed" → Install, then restart. Two gotchas the README won't save you from: the README's install path mentions a comfyui-razv-wavespeed-custom subfolder that doesn't exist - requirements.txt is at the repo root. And while the README shows key = in config, the code actually reads api_key =. Easiest path: skip config entirely and paste your key straight into the WaveSpeedAI Client node. You get the key from wavespeed.ai after making an account.
Where people get burned
First, the naming trap: this is the WaveSpeed AI API (wavespeed.ai, paid, hosted). It is not the "WaveSpeed" inference acceleration people rave about for 2–3x local speedups (chengzeyi/Comfy-WaveSpeed). Two different things, same name, easy to google into the wrong one.
Second, enable_sync_mode is a mild lie here. Both modes block - "async" still waits on a polling loop (up to 20 minutes for multi-character work). Sync mode just uses a different response path. Don't expect fire-and-forget. Finally, if the wrong character talks or nobody's lips move, that's usually the mask - animate a single character with a mask and re-run before blaming the model. If the node never appears after install, make sure PyAV (av) and torchaudio are installed; the pack's real code imports them even though they're missing from requirements.txt.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| client | WAVESPEED_AI_API_CLIENT | — | |
| left_audio | STRING | Left audio file URL for multi-character conversation (connect from Upload Audio node) | |
| right_audio | STRING | Right audio file URL for multi-character conversation (connect from Upload Audio node) | |
| image | STRING | Image containing multiple characters 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 multi-character behavior | |
| audio_orderopt | COMBO | meanwhile | Audio order for multi-character conversation: meanwhile (simultaneous), left_right, or right_left |
| mask_imageopt | STRING | Optional mask image URL to specify which characters 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 | — |