ComfyUI Node

PainterS2Vplus

Wan 2.2 S2V lipsync at 2 steps

By princepainter·Created 7 months ago·Updated 6 days ago· 194
PainterS2Vplus
  • positive
  • negative
  • vae
  • video
  • audio_encoder_output
  • start_image
  • previous_frames
  • latent
  • positive
  • negative
  • trim_image
width832
height480
length81
video_fps16.0
audio_scale1.0
motion_frame_count9

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/negative to the sampler, trim_image to 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_fps wrong 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_scale too 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_image int 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.

Categoryconditioning/video_models

Inputs (13)

NameTypeDefaultDescription
positiveCONDITIONING
negativeCONDITIONING
vaeVAE
videoIMAGE
widthINT83216–16384
heightINT48016–16384
lengthINT811–16384
video_fpsFLOAT16.08–60
audio_scaleFLOAT1.00.1–20
motion_frame_countINT90–33
audio_encoder_outputoptAUDIO_ENCODER_OUTPUT
start_imageoptIMAGE
previous_framesoptIMAGE

Outputs (4)

NameTypeDescription
latentLATENT
positiveCONDITIONING
negativeCONDITIONING
trim_imageINT