MiniMax H3 Face Refine Per-Frame Denoise / 逐帧去噪 (Advanced)
Denoise that scales with face size — 30px faces get more help
- av_latent
- face_plan
- av_latent
- report_json
Here's the smart bit of the whole face-refine pipeline, and it's a small node that does one thing well. A distant face that's 30 pixels tall needs a much stronger second pass than a close-up that fills 120 pixels - the mush is worse and there's less information to work with. So instead of a single denoise value for every frame, this node applies the audited upstream face-size curve: it reads the face size from the plan (crop height divided by crop factor), maps small faces to a high denoise and large faces to a low one, and smooths the result across frames so it doesn't pulse.
The defaults encode the reference curve: a 30px face maps to strength_small_face (0.8) and a 120px face maps to strength_large_face (0.35), with 9-frame smoothing (smooth_frames). It applies this to the video noise mask only - the nested audio mask stays exactly zero, which is how you guarantee the second pass can't move the sound.
Inputs:
av_latent- the latent from the parity latent node (or your own AV latent).face_plan- the parity plan, which supplies the per-frame face sizes.strength_small_face/strength_large_face(0.8 / 0.35) - the curve endpoints. Lower both if identity is drifting; raise the small end if distant faces still aren't cleaning up.face_px_small/face_px_large(30 / 120) - where the curve anchors. If your footage is mostly medium shots, pullface_px_largedown so more frames get meaningful denoise.gamma(1) - curve shaping between the endpoints.smooth_frames(9) - temporal smoothing so denoise doesn't flicker frame to frame.scale_mode(absolute_px),video_mask_mode(replace_video_parity),require_locked_audio(true) - contract knobs; leave them alone unless you know better.
Outputs: av_latent (denoise curve applied to the video mask) and report_json so you can see what strength each frame actually got.
The trap: don't read the two strength values as "this is the denoise." The actual per-frame denoise is a curve between them, and the tooltip is the usual pack-level honesty - the curve is the audited upstream behavior, but nothing here is a calibrated quality guarantee. Watch a couple of frames at both ends of the size range when you review; the smoothing exists precisely because per-frame denoise flicker is a classic face-refine artifact.
Install: ComfyUI Manager → "MiniMax H3 Audio T8", or:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8
Restart after. No forced pip deps, no downloads. This node is pure latent/mask manipulation - the expensive H3 sampling happens in the sampler nodes you feed the result into.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| av_latent | LATENT | — | |
| face_plan | H3_T8_FACE_REFINE_PARITY_PLAN | — | |
| strength_small_face | FLOAT | 0.800–1 | — |
| strength_large_face | FLOAT | 0.350–1 | — |
| scale_mode | COMBO | absolute_px | 2 options: absolute_px, relative_to_clip |
| face_px_small | FLOAT | 301–2048 | — |
| face_px_large | FLOAT | 1202–4096 | — |
| gamma | FLOAT | 1.000.05–8 | — |
| smooth_frames | INT | 91–121 | — |
| video_mask_mode | COMBO | replace_video_parity | 2 options: replace_video_parity, cap_existing |
| require_locked_audio | BOOLEAN | true | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| av_latent | LATENT | — |
| report_json | STRING | — |