Talking Avatar · Talking Avatar
One portrait, one voice clip, one video
- image_url
- audio_url
- mask_url
- video
- task id
Stills don't talk, and that's the gap this fills
Every portrait you generate is a frozen frame, and the difference between a nice image and a character is whether it can say something. On the local side the avatar field is where this gets solved - InfiniteTalk is the fast talking-head default, MultiTalk does multi-speaker scenes, LongCat trades speed for quality - and it's the second half of the pipeline the KB calls canonical: TTS makes the voice, an audio-driven avatar makes the face move.
Talking Avatar is that second half, hosted. One portrait plus a voice recording, $0.018 per second, and you get an MP4 of that person speaking: mouth, head movement and blinks all following the audio. A 10-second line is about 18 cents.
How it works
The portrait and the audio (both uploaded for you - images under a 10 MiB ceiling, media under 90 MiB) go to spicyapi/talking-avatar-v1/talking-avatar, and the result comes back as a ComfyUI VIDEO ready for Save Video. Nothing runs locally, so there's no expression model to download and no VRAM consideration at all.
The obvious, actually-good combo: wire Chatterbox · Text to Speech from this same pack into this node's audio_url. Type the script, get a lip-synced performance, all inside the graph, no audio editor.
Inputs and outputs
image_url (IMAGE) - the portrait of the person who will speak. One clearly visible face looking roughly at the camera works best; that's the whole quality bar, and it's not a suggestion. Extrapolating a face that's half turned away produces invented anatomy.
audio_url (AUDIO) - the speech driving the lips, 3 to 60 seconds, MP3 or WAV. The video runs as long as this audio. Files outside the range are rejected before any charge, which is how rejection should work. Load Audio or a TTS output both connect here.
prompt (STRING) - optional, and narrower than people expect: a note on expression or mood, such as calm or cheerful. Identity and setting come from the portrait. Don't try to use it to change the scene or the wardrobe; that's a different node.
seed - fixed by default, with the usual control after generate. Useful here because it lets you hold the performance constant and vary the audio.
mask_url (optional, IMAGE) - a black-and-white mask the same size as the portrait, white over the person who should speak. Only needed when the portrait shows several people. Advanced, and the reason a group shot isn't automatically disqualified.
Outputs: video (VIDEO) and task id (STRING).
Install
Manager → search SpicyAPI, or:
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart. There's genuinely nothing else: no pip install, no weights, no GPU - the pack declares zero dependencies and both the TTS and the avatar run on SpicyAPI's servers. Python 3.10+ and a ComfyUI new enough for the V3 node API. Key in Settings > SpicyAPI (or SPICY_API_KEY on a server), then restart once so the node list reflects your account.
Practical notes
- Per-second pricing, so test short. Iterating on a 60-second monologue is over a dollar a pass. Write a 6-second line, get the portrait and the mood note right, then run the full script.
- Audio shorter than the video is fine; longer sets the length. The clip runs as long as the audio does.
- Long video means long teeth. Portrait animation works best on short, single-idea lines; run-on audio gives you a mouth that's technically in sync and a face that's stopped acting.
- Mo-cap style artifacts - the mouth and jaw move; the hands, clothing and background don't. Better than a static frame, less than a performance.
- Consent, again. A still photo plus a voice clip of a real person is a deepfake generator with extra steps. The node has no guard, so the guard is you.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image_url | IMAGE | Portrait of the person who will speak. One clearly visible face, looking roughly at the camera, works best. | |
| audio_url | AUDIO | Speech that drives the lips, 3 to 60 seconds, MP3 or WAV. The video runs as long as this audio; files outside that range are rejected before any charge. | |
| prompt | STRING | Optional note on expression or mood, such as calm or cheerful. Identity and setting come from the portrait. | |
| seed | INT | 00–2147483647 | Same seed and settings, same result. Set 'control after generate' to randomize to get a new result on every run; every run is billed. |
| mask_urlopt | IMAGE | Optional black-and-white mask the same size as the portrait, white over the person who should speak. Only needed when the portrait shows several people. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |