H3 Audio Refine Sampler
H3 Audio Refine Sampler, explained
- model
- positive
- negative
- latent
- LATENT
MiniMax H3's big selling point is native stereo audio generated jointly with the picture. Its big practical annoyance is that a 4-step Turbo LoRA pass - fine for video - leaves that audio undercooked. This node is the all-in-one fix: it freezes the video stream of your already-sampled latent and runs extra denoising steps on the audio only, all inside a single node that mirrors the stock KSampler path. Sampled H3 latent goes in, refined LATENT comes out, straight into your existing VAE decode nodes.
How it works
Mechanically it's the same trick as the pack's composable mask node: build a per-stream noise mask (video preserved, audio generated) and call comfy.sample with denoise = audio_denoise. The steps run KSampler-style at that denoise depth - the full schedule is steps / audio_denoise long and only the tail actually executes. Every step, ComfyUI's native masked path injects the clean video at the visual conditioning timestep (0.999), so the model denoises the audio in the context of your finished picture, and the final blend returns the video bit-identical to the input at video_denoise 0.0.
The inputs that matter
latent- the sampled H3 AV latent from pass 1. It must be a real nested video+audio latent; plain latents are rejected with a clear error.audio_denoise- default 0.5. This is the dial: 0.3–0.6 keeps pass-1 audio content and cleans up the noise floor and artifacts; 1.0 regenerates the audio from scratch against the frozen video.steps- default 6. These run at theaudio_denoisedepth, so "6 steps" is six steps spent on audio, not a re-render of everything.cfg- default 1.0. Keep it at whatever pass 1 used (1.0 for Turbo LoRA passes). Fun fact: thenegativeinput is essentially a formality. H3 is a distilled model that runs at cfg 1.0, so the uncond branch is never evaluated - wire something in so the node is happy, but don't expect guidance from it.sampler_name/scheduler- defaulteuler/simple; that's the sane starting point.video_denoise(optional) - 0.0 freezes video exactly; only push it up if you want the refine pass to partially rework video too.
The recommended setup
The pack's recommended starting point: run your normal 4-step Turbo graph unchanged, then branch the model off before the Turbo LoRA and feed that to this node with steps 4–6, audio_denoise 0.5, euler/simple, same conditioning. Pass 1 gets turbo's speed for the video; the refinement runs on undistilled weights, so the audio quality the LoRA cost you is exactly what the extra steps recover. The honest A/B is against a straight 6–8 step Turbo run at matched total step count - that's the baseline this approach has to beat, and the README's measured numbers suggest it does.
A cost reality
One cost reality worth internalizing: each refinement step still costs close to a full model forward, because H3 runs video and audio through one fused transformer and the frozen video tokens stay in the sequence as attention context. The saving is step arithmetic - 4 turbo + 4–6 audio ≈ 8–10 full-cost steps instead of 20 - not cheaper steps. If those extra steps sting, the pack's third node, H3 Frozen Video Cache, is the accelerator that makes them several times cheaper.
Installing
Same story as the rest of the pack. ComfyUI Manager: search ComfyUI-H3-AudioRefine, click Install, restart. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/Adudeguyman/ComfyUI-H3-AudioRefine.git
No Python dependencies - torch, numpy, and ComfyUI internals only - but it needs a ComfyUI with native H3 support including the AV masked path (0.33.x against master), so update ComfyUI first. If the refine pass OOMs, ComfyUI's known-driver-bug flags are worth a try before you assume the node is at fault:
python main.py --cuda-device 0 --disable-pinned-memory
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | MiniMax H3 model, with the same LoRA/patch stack you intend to refine with. | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latent | LATENT | Sampled MiniMax H3 AV latent (video+audio) from the first pass. | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 61–100 | Refinement steps. These run at denoise depth audio_denoise (KSampler-style: the full schedule is steps/audio_denoise long and only the tail runs). |
| cfg | FLOAT | 1.00–100 | Keep at the value the first pass used (1.0 for Turbo LoRA passes). |
| sampler_name | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | simple | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| audio_denoise | FLOAT | 0.500.01–1 | How far the audio is re-noised on the shared (video) schedule before refining. 0.3-0.6 keeps pass-1 audio content; 1.0 regenerates audio from scratch against the frozen video. |
| video_denoiseopt | FLOAT | 0.000–1 | 0.0 freezes video exactly (default). > 0.0 partially opens video to the refinement pass. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |