SF WaveSpeed InfiniteTalk
Talking-head video from one portrait and an audio file
- client
- video_url
Give it a face and a voice, get back a video of that face talking in sync with the voice. That's the whole pitch of SF WaveSpeed InfiniteTalk, and it's genuinely good at it - accurate lip sync, natural head movement, facial expressions that track the audio's mood, and crucially, it can keep going for as long as you need rather than choking at a fixed clip length. It's the node you reach for when you want a character to actually deliver lines - narration, a singing performance, a virtual presenter - instead of just staring at you.
How it works
This is an audio-driven generation, which is a different shape from the image nodes in this pack. The input is a public URL for an audio file plus a public URL for a portrait image. The node posts both to WaveSpeed's infinitetalk endpoint, and the model animates the face to match the audio - lip movements, head tilt, expressions - while preserving the identity in your image. Because it's an audio-first pipeline, the output is a video URL string, not an IMAGE tensor. You'll typically feed that URL into a video loader or a download node to actually see the result. Note enable_sync_mode defaults to false here, unlike most of the pack's image nodes - the node submits the job and waits on the task either way, so don't read too much into it; just know a generated video isn't instant.
The inputs that matter
- client - from SF WaveSpeed Client. Always the first wire.
- audio - public URL of the audio file driving the lips.
- image - public URL of the portrait to animate.
- resolution - 480p or 720p, with the pricing spelled out in the tooltip ($0.15 vs $0.30 per 5 seconds). For longer speeches that difference adds up fast.
- prompt (optional) - generation instructions that control scene, pose, and behavior while keeping audio sync. This is how you steer the performance - "looking down, then smiling at the end" - without breaking the lip-sync.
- mask_image (optional) - if your image contains multiple people, mask the one to animate.
- seed (optional, -1 = random) and enable_base64_output (optional).
Output: video_url (STRING).
Installing it
In the SF ComfyUI Nodes pack from Stillfront. ComfyUI Manager → "SF ComfyUI Nodes" → Install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Stillfront/comfyui-sf-nodes.git
cd comfyui-sf-nodes
pip install -r requirements.txt
Plus a WaveSpeed key via SF WaveSpeed Client, and a way to serve your audio/image files at public URLs.
Common issues
Two inputs, both URL strings, both must be publicly reachable - that's where almost every failure lives. A local file path won't work; you need whatever host you use for the "Upload Audio" / "Upload Image" nodes the tooltips reference, or any direct-link hosting. Second, pacing: longer clips cost more per 5-second block, so test the sync quality on a short clip before committing to a monologue. And if the video comes back as a URL you can't preview, you need a node that fetches and displays remote video - the URL output is a pointer, not the pixels themselves.
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 | — |