Wan - 2.2 A14B Speech to Video Turbo
Point an audio file at a portrait and make it talk
- image_url
- audio_url
- video
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
Audio-driven video is the bridge everyone ends up needing: you have a voice track and a face, and you want them to belong to each other. Wan's S2V line is Alibaba's first-party answer - Apache 2.0 weights, part of the same frozen 2.2 family - and this node is KIE's hosted, turbo-distilled version of it, wrapped as a native ComfyUI node with an AUDIO socket instead of a URL box.
Reach for it for talking-head work, dubbed clips, character voices you generated elsewhere in the graph. Don't reach for it expecting a puppeteer: you give it one still frame and a soundtrack, and it invents the performance. That's a good deal for a portrait and a bad deal for a full-body action beat.
How it works
Three required sockets go in - image_url (IMAGE), audio_url (AUDIO), and prompt - and the node does the URL plumbing you'd otherwise do by hand. The image is uploaded to KIE, the audio is converted to WAV bytes and uploaded, and both come back as URLs that the marketplace request uses. Then it POSTs to /api/v1/jobs/createTask with model wan/2-2-a14b-speech-to-video-turbo and polls /api/v1/jobs/recordInfo until the job reports success. The finished MP4 is downloaded and archived under ComfyUI/output/KIE-Results/videos; you get a native VIDEO object back.
Inputs that matter
The prompt is mostly a sanity check on what's happening ("the lady is talking" is the shipped default) - the audio is doing the driving here.
Where you'll actually spend time:
num_frames- default 80, and it must be a multiple of 4 between 40 and 120. At the default 16 fps, 80 frames is a five-second performance. Longer audio than your frame budget means it gets cut off, not stretched.frames_per_second- the tooltip states the trap directly: with frame interpolation andadjust_fps_for_interpolationon KIE's side (default true), the final playback FPS multiplies. Set 16 and you may get 32.resolution-480p,580p,720p. Default is 480p and that's fine for a draft.num_inference_stepsat 27,guidance_scaleat 3.5,shiftat 5.0 - these are the sampler knobs, and the defaults are sensible. Raise steps for quality, leaveshiftalone unless you know why you're touching it.negative_prompt- 500 characters, gets you out of blurry/flicker territory.nsfw_checkeroff by default,timeout_secondsat 1200,callback_urlempty.
Outputs
video is the one you wire to SaveVideo or the video combiner. Beside it: url, all_urls_json, task_id, raw_json, and the pair this pack is quietly good at - credits_consumed and credits_left, on the node face as a receipt after each run. Speech-driven clips are short, which makes them one of the cheaper ways to spend credits on this pack.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
cd ComfyUI-KIE-Nodes-Next && pip install -r requirements.txt
Restart ComfyUI. There are no model files and no heavy dependencies - requests, Pillow, numpy, PyYAML is the whole list, because the model lives on KIE's side. The node tree itself is generated at startup from KIE's live API catalog, so you find this one under KIE Next / Video / Wan.
One-time setup: Settings → KIE.ai Nodes Next → Connection, paste your key, wait for ✅ CONNECTED. It's validated before it replaces anything saved. KIE_API_KEY in the environment works for headless installs and takes priority.
Common issues
The mouth doesn't match the words. That's the model, not the node. S2V does well on straight-on, well-lit faces; profiles and heavy occlusion degrade fast. Trim your audio to a clean take first.
Audio length vs. frame count fights you. Decide the clip length in frames, then cut the audio to fit. num_frames being a multiple of 4 is a hard requirement - 79 gets rejected.
Nothing renders. Add a video preview or save node. This isn't an output node, so a successful run looks like a no-op.
"Your ComfyUI build does not expose comfy_api.latest…" - the native VIDEO type needs a current ComfyUI. Update before blaming the pack.
Cost sneaks up. KIE meters credits per second of generated video and per resolution tier, and a failed job still bills. Kick off a silent 480p test with a short clip before committing to a batch.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The lady is talking | The text prompt used for video generation (Max length: 5000 characters) |
| image_url | IMAGE | — | |
| audio_url | AUDIO | — | |
| num_framesopt | FLOAT | 80.0040–120 | Number of frames to generate. Must be between 40 to 120, (must be multiple of 4) (Min: 40, Max: 120, Step: 4) (step: 4) |
| frames_per_secondopt | FLOAT | 16.004–60 | Frames per second of the generated video. Must be between 4 to 60. When using interpolation and adjust_fps_for_interpolation is set to true (default true,) the final FPS will be multiplied by the number of interpolated frames plus one. For example, if the generated frames per second is 16 and the number of interpolated frames is 1, the final frames per second will be 32. If adjust_fps_for_interpolation is set to false, this value will be used as-is (Min: 4, Max: 60, Step: 1) (step: 1) |
| resolutionopt | COMBO | 480p | Resolution of the generated video (480p, 580p, or 720p) |
| negative_promptopt | STRING | Negative prompt for video generation (Max length: 500 characters) | |
| num_inference_stepsopt | FLOAT | 27.002–40 | Number of inference steps for sampling. Higher values give better quality but take longer (Min: 2, Max: 40, Step: 1) (step: 1) |
| guidance_scaleopt | FLOAT | 3.501–10 | Classifier-free guidance scale. Higher values give better adherence to the prompt but may decrease quality (Min: 1, Max: 10, Step: 0.1) (step: 0.1) |
| shiftopt | FLOAT | 5.001–10 | Shift value for the video. Must be between 1.0 and 10.0 (Min: 1, Max: 10, Step: 0.1) (step: 0.1) |
| seedopt | INT | 0-2147483648–2147483647 | Random seed for reproducibility. If None, a random seed is chosen |
| nsfw_checkeropt | BOOLEAN | false | Defaults to false. You can set it to false based on your needs. If set to false, our content filtering will be disabled, and all results will be returned directly by the model itself. Note: There is no guarantee that everything can be filtered out; if you are not satisfied with the results, you will need to make your own arrangements. |
| timeout_secondsopt | INT | 120030–7200 | — |
| callback_urlopt | STRING | Optional KIE callback URL. Leave empty for normal ComfyUI use. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| url | STRING | — |
| all_urls_json | STRING | — |
| task_id | STRING | — |
| raw_json | STRING | — |
| credits_consumed | FLOAT | — |
| credits_left | FLOAT | — |