Nodes/ComfyUI-H3-AudioRefine/H3 Audio Refine Sampler
ComfyUI Node

H3 Audio Refine Sampler

H3 Audio Refine Sampler, explained

By Adudeguyman·Created 4 days ago·Updated about 21 hours ago· 59
H3 Audio Refine Sampler
  • model
  • positive
  • negative
  • latent
  • LATENT
seed0
steps6
cfg1.0
sampler_nameeuler
schedulersimple
audio_denoise0.50
video_denoise0.00

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 the audio_denoise depth, 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: the negative input 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 - default euler / 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 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
Categorysampling/minimax

Inputs (11)

NameTypeDefaultDescription
modelMODELMiniMax H3 model, with the same LoRA/patch stack you intend to refine with.
positiveCONDITIONING
negativeCONDITIONING
latentLATENTSampled MiniMax H3 AV latent (video+audio) from the first pass.
seedINT00–18446744073709550000
stepsINT61–100Refinement steps. These run at denoise depth audio_denoise (KSampler-style: the full schedule is steps/audio_denoise long and only the tail runs).
cfgFLOAT1.00–100Keep at the value the first pass used (1.0 for Turbo LoRA passes).
sampler_nameCOMBOeuler44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBOsimple9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
audio_denoiseFLOAT0.500.01–1How 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_denoiseoptFLOAT0.000–10.0 freezes video exactly (default). > 0.0 partially opens video to the refinement pass.

Outputs (1)

NameTypeDescription
LATENTLATENT