Painter Humo AV2V
Re-lip-sync an existing video in 2 steps
- positive
- negative
- vae
- video
- audio_encoder_output
- start_image
- end_image
- positive
- negative
- latent
Sometimes the video already exists and the voice doesn't match it. That's the problem PainterHumoAV2V is built for: audio-to-video lipsync on footage you already have. It takes a video, drives it with an audio encoder output, and hands you the conditioning and latent for a two-step Humo sampling pass - the "Wan 2.2 + Humo" recipe, aimed specifically at re-animating the mouth to a new track rather than generating motion from scratch.
What it is
The sibling to PainterHumoAI2V (image-to-video) in the same conditioning/video_models category. Where AI2V starts from a still, this one starts from a clip: feed in video, plus prompt conditioning, a vae, resolution, and the audio, and get back positive, negative, and latent ready for a two-step sampler. The author's changelog describes it plainly: "Humo model 2-step sampling for video lip-sync, custom audio talking frame rate (16–30 recommended)."
How it works
The video input is the footage to re-animate, the audio_encoder_output carries the new speech, and the node builds the conditioning that tells the model to re-sync the mouth to that track. Like its sibling it exposes a fps control (default 25, range 1–60) for the talking frame rate - keep it in the 16–30 band the README recommends for natural lip motion. The optional start_image / end_image inputs let you pin the first and/or last frame so the re-sync doesn't drift the shot's endpoints.
Two steps is the whole point: Humo's 2-step sampling is the speed story here, trading a little fidelity for dramatically faster lipsync than running a full multi-step pass. That's the "faster than InfiniteTalk" claim in the pack's changelog - the same niche, one pack.
Inputs and outputs that matter
- video - the clip to re-lip-sync (required).
- audio_encoder_output - the driving audio; expects the output of your Wan audio encoder.
- fps - talking frame rate; 16–30 is the sweet spot.
- width / height / length - target resolution and frame count (length default 97, stepped by 4).
- start_image / end_image - optional anchors to hold the shot's endpoints.
- Outputs:
positive/negativeinto the sampler,latentinto its latent port.
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
The example graph lives in the pack's workflows/video_humo-AV2V.json - load it to see the full two-step sampler wiring, since the node itself only covers conditioning and latent.
Common issues
- Mouth moves but doesn't match -
fpsoutside 16–30, or the source clip's own audio still in the graph fighting the new track. Mute the original before you judge the result. - The whole video drifts, not just the lips - that's the model re-interpreting motion, not a bug. Pinning
start_image/end_imagereins it in when the shot needs to stay put. - Two steps looks soft - expected trade-off of the speed pass. If the faces look mushy, the usual fix is a face detail pass after decode rather than cranking steps back up and losing the speed.
This is the node to grab when you've got a clip and a new voice line and you want the mouth to cooperate. It's small, it's focused, and it's fast - which is the entire pitch.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| video | IMAGE | — | |
| width | INT | 83216–16384 | — |
| height | INT | 48016–16384 | — |
| length | INT | 971–16384 | — |
| fps | FLOAT | 25.01–60 | — |
| audio_encoder_outputopt | AUDIO_ENCODER_OUTPUT | — | |
| start_imageopt | IMAGE | — | |
| end_imageopt | IMAGE | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |