HuMo Audio Attention Control v4
Boost or suppress audio attention without retraining
- model
- model
The name undersells it. This isn't one knob labeled "audio influence" - it's twelve independent dials that reach into HuMo's transformer and turn its Q, K, V, and O projections up or down, per block range, at runtime. If HuMo is ByteDance's audio-to-talking model (built on the Wan 2.1 14B base, run in ComfyUI through Kijai's WanVideoWrapper), this node is the keyhole into its head.
Why you'd reach for it
HuMo listens to speech through a Whisper encoder and drives lip movement, expression, and some body motion from it. Out of the box that pathway is monolithic - you can't tell it "do the gestures but skip the lip-sync," or "lean harder on the body language." This node from the ckinpdx/comfyui-humo-audio-motion pack opens that up. The README calls it experimental, and it means it, but the core trick is simple: intercept attention outputs and scale them. No training, no model file edits, and the weights are never modified.
How it works
Every transformer block runs three attention types - audio cross-attention (the direct speech→motion path), text cross-attention, and self-attention - and each has four projection components: Q (what to look for), K (what's available), V (actual content), O (final result). The node registers forward hooks that multiply each projection's output by your scale: below 1 attenuates, exactly 1 is neutral, above 1 amplifies (up to 5). HuMo has 40 blocks, and instead of picking numbers by hand you choose a preset - early_0-10_body, mid_6-24_lipsync, all_0-39_maximum, and so on. Hooks are registered on each run and cleaned up after, so changes never accumulate across generations.
The inputs that matter
You'll set maybe four of them and leave the rest alone:
- enable_audio_cross_attn - on by default. This is the pathway you actually care about.
- audio_blocks - the block-range preset. The default
mid_6-24_lipsyncis where the strongest lip-sync sensitivity lives. - audio_v_scale - the Value projection, and the author's own tooltip says it outright: "THIS IS THE MAIN ONE FOR LIP-SYNC." For suppression, 0.01–0.1 on blocks 6–24. For body-motion boost, 2.0–4.0 on the early
0-10blocks. - audio_custom_range (optional) - when no preset fits, a string like
0-5,25-39for a hand-picked range.
Text cross-attention and self-attention are off by default, and you should keep them that way until you know what you're doing - every enabled type means more hooks and more memory. The output is a single model wire, still type WANVIDEOMODEL, that plugs right back into your HuMo graph: WanVideo Model Loader → this node → HuMo Embeds.
Installing it
The pack itself is a two-line install:
cd ComfyUI/custom_nodes
git clone https://github.com/ckinpdx/comfyui-humo-audio-motion
Restart ComfyUI. There's no requirements.txt - no extra Python dependencies. ComfyUI Manager users can just search "comfyui-humo-audio-motion." What it does need is the whole HuMo stack already standing: Kijai's ComfyUI-WanVideoWrapper, the HuMo weights (the fp8-scaled Wan2_1-HuMo-14B files live in Kijai's WanVideo_comfy_fp8_scaled repo), and the Whisper audio encoder. No HuMo model, nothing to hook.
Common issues
- "Hooks not firing / no effect." Almost always torch.compile. Compilation bypasses runtime hooks, so if you compile the model, this node silently does nothing. Disable it.
- Out of memory. Hooks add work at every attention layer. Narrow the block range, drop to a lower resolution, or disable attention types you aren't using. Fewer hooks, less memory.
- "Registered 0 attention hooks" in the console. That line is your diagnostic. If it prints a block-doesn't-exist warning or zero hooks, your model isn't the HuMo variant of the wrapper - the node can't find
audio_cross_attn_wrapperon the blocks. - Artifacts and desaturation. The README is upfront that no stable values exist yet. Scale aggressively and things get weird; back off and change one component at a time.
Where people get burned: they treat the sliders as "more is better." It's a fader, not a boost pedal - you're supposed to audition it. Start at 1.0, move one scale, lock your seed, compare. That's the whole workflow for a research tool like this.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| model | WANVIDEOMODEL | — | |
| enable_audio_cross_attn | BOOLEAN | true | Enable audio cross-attention modification |
| audio_blocks | COMBO | mid_6-24_lipsync | 8 options: custom, early_0-5_structure, early_0-10_body, mid_6-24_lipsync, mid_10-25_gestures, late_25-39_texture, +2 |
| audio_q_scale | FLOAT | 1.000.01–5 | Audio Query scale (<1 suppress, >1 boost) |
| audio_k_scale | FLOAT | 1.000.01–5 | Audio Key scale (<1 suppress, >1 boost) |
| audio_v_scale | FLOAT | 1.000.01–5 | Audio Value scale - THIS IS THE MAIN ONE FOR LIP-SYNC |
| audio_o_scale | FLOAT | 1.000.01–5 | Audio Output scale (<1 suppress, >1 boost) |
| enable_cross_attn | BOOLEAN | false | Enable text cross-attention modification |
| cross_blocks | COMBO | early_0-10_body | 8 options: custom, early_0-5_structure, early_0-10_body, mid_6-24_lipsync, mid_10-25_gestures, late_25-39_texture, +2 |
| cross_q_scale | FLOAT | 1.000.01–5 | — |
| cross_k_scale | FLOAT | 1.000.01–5 | — |
| cross_v_scale | FLOAT | 1.000.01–5 | — |
| cross_o_scale | FLOAT | 1.000.01–5 | — |
| enable_self_attn | BOOLEAN | false | Enable self-attention modification |
| self_blocks | COMBO | early_0-10_body | 8 options: custom, early_0-5_structure, early_0-10_body, mid_6-24_lipsync, mid_10-25_gestures, late_25-39_texture, +2 |
| self_q_scale | FLOAT | 1.000.01–5 | — |
| self_k_scale | FLOAT | 1.000.01–5 | — |
| self_v_scale | FLOAT | 1.000.01–5 | — |
| self_o_scale | FLOAT | 1.000.01–5 | — |
| audio_custom_rangeopt | STRING | 6-24 | Custom block range (e.g. '6-24' or '0-5,25-39') |
| cross_custom_rangeopt | STRING | 0-10 | — |
| self_custom_rangeopt | STRING | 0-10 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | WANVIDEOMODEL | — |