PainterS2Vplus
Wan 2.2 S2V lipsync at 2 steps
- positive
- negative
- vae
- video
- audio_encoder_output
- start_image
- previous_frames
- latent
- positive
- negative
- trim_image
Wan 2.2 has a dedicated sound-to-video model - S2V-14B - built to re-animate a clip's mouth to match an audio track. PainterS2Vplus is the PainterNodes conditioning node for it, and the pitch in the changelog is speed: two-step sampling for video lipsync, positioned as faster than the InfiniteTalk-style alternatives. If you've got a clip and a voice line and you want the lips to fall in line without a full multi-step pass, this is the node.
What it is
A conditioning/video_models node. Required inputs: positive/negative conditioning, vae, the video to re-lip-sync, resolution (width/height/length), and three tuning dials - video_fps, audio_scale, and motion_frame_count. Optional: audio_encoder_output, start_image, and previous_frames. Outputs: latent, positive, negative, and a trim_image int.
How it works
S2V is Wan 2.2's audio-conditioned variant: the model takes the driving clip plus the encoded audio and regenerates it with the mouth synced to the track. This node packages that - the video input is the footage, audio_encoder_output carries the speech from your Wan audio encoder, and the node produces the conditioning and latent for the S2V sampler. The positive/negative outputs can be re-conditioned for the audio pass, which is what makes a two-step "2x" flow work: sample once on the video conditioning, once on the audio-aligned pass, and out comes a lipsynced clip at a fraction of the usual cost.
The dials: video_fps (default 16, range 8–60) is the footage's assumed frame rate - the mouth timing math depends on getting this right. audio_scale (default 1.0, 0.1–20) is how strongly the audio drives the motion; crank it up if the lips look lazy, drop it if the face is contorting. motion_frame_count (default 9, 0–33) controls how many context frames of motion are considered for the sync - higher is smoother but slower. The trim_image output is an index you feed into your frame handling, telling downstream which frame corresponds to the start of the usable audio-synced region.
Inputs and outputs that matter
- video - the clip to re-sync (required).
- audio_encoder_output - the driving audio (from your Wan audio encoder stack).
- video_fps / audio_scale / motion_frame_count - sync timing, audio strength, motion context.
- start_image / previous_frames - optional anchors and context.
- Outputs:
latent+positive/negativeto the sampler,trim_imageto frame handling.
Install
Part of the PainterNodes pack. ComfyUI Manager → search "PainterNodes" → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/princepainter/ComfyUI-PainterNodes
cd ComfyUI-PainterNodes
pip install -r requirements.txt
Common issues
- Lipsync off -
video_fpswrong is the classic cause: tell the node the real frame rate of the footage or the mouth lands on the wrong beats. - Face getting wrecked by audio -
audio_scaletoo high. Dial it back toward 1.0; the model shouldn't need to contort to sync. - It's still a Wan 2.2 model underneath - two steps is the speed story, but quality expectations should match the architecture. If you need a different look, the S2V base isn't the thing to blame.
- Wiring confusion - the
trim_imageint is easy to ignore and easy to mis-wire; it feeds frame trimming downstream, not the sampler.
The S2V-14B path was always the "fast lipsync" option in the Wan lineup, and this node makes the conditioning half of it a single box. If you're comparing it to the Humo nodes in the same pack, think of this one as the Wan-native, two-step, mouth-focused take.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| video | IMAGE | — | |
| width | INT | 83216–16384 | — |
| height | INT | 48016–16384 | — |
| length | INT | 811–16384 | — |
| video_fps | FLOAT | 16.08–60 | — |
| audio_scale | FLOAT | 1.00.1–20 | — |
| motion_frame_count | INT | 90–33 | — |
| audio_encoder_outputopt | AUDIO_ENCODER_OUTPUT | — | |
| start_imageopt | IMAGE | — | |
| previous_framesopt | IMAGE | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| trim_image | INT | — |