π§ DualSamplerCustomAdvanced
When video and audio shouldn't share one noise schedule
- noise_video
- noise_audio
- guider
- dual_sampler
- video_sigmas
- audio_sigmas
- av_latent
- output
- denoised_output
- video_output
- audio_output
- denoised_video_output
- denoised_audio_output
MiniMax H3 doesn't generate a video and then bolt audio on afterward. It packs both into a single latent - that's the av_latent - and denoises them together in one DiT forward. The catch is that the video stream and the audio stream were trained with different flow shifts (12.0 for video, 3.0 for audio), so they want different noise schedules. Stock ComfyUI sampling only takes one SIGMAS input, and it "handles" this by carrying the audio latent onto the video schedule. That works, but it locks the two streams together. This node is the do-it-properly version: each stream gets its own sigma schedule, sampled inside a single model pass.
You'll hit this in any H3 workflow that builds the packed latent with EmptyMiniMaxH3LatentAV and samples it with the plain SamplerCustomAdvanced. If you're happy with those results, you may not need this node - but if you want the audio's denoising controlled separately, this is the tool. The source even documents the killer use case: an all-zero sigma schedule freezes that stream, so it's left untouched while the other is refined. That's how you improve the video while the audio just sits there conditioning it.
How it works. The video stream runs on video_sigmas; the audio stream is held at its own noise level on audio_sigmas. To get the model to respect that, the node shadows the H3 model's audio_scale to 1.0 for the duration of the run - that's the mechanism core uses to drag audio onto the video schedule, so turning it off lets the audio live at its own sigma. Each step, the flow-shift mapping is inverted so the audio reaches the DiT at exactly the noise level its schedule says it should be at. One genuinely thoughtful touch: the ending sigmas are stamped onto the output latent, so if you resume with a schedule whose first sigma doesn't match where the previous run stopped, it warns you instead of silently mangling the audio.
Inputs that matter. av_latent (packed video + audio, e.g. from EmptyMiniMaxH3LatentAV), video_sigmas and audio_sigmas (both SIGMAS, e.g. from BasicScheduler - they must have the same number of steps), guider (from a ModelSamplingMiniMaxH3-patched setup; the model has to be a real two-stream model like H3), dual_sampler (from DualSamplerEulerAncestral - a stock SAMPLER won't plug into this socket), and noise_video / noise_audio (NOISE source nodes, one per stream, so you can re-noise one while resuming the other).
Outputs. output is the packed latent - feed it straight to the H3 VAE decode. video_output and audio_output are each stream as a plain latent, for decoding or inspecting one side alone. The denoised_* outputs are the clean x0 estimate where the sampler produces one; beginners can ignore those.
Install. ComfyUI Manager β search "ComfyUI-SuperNodes", or:
cd ComfyUI/custom_nodes && git clone https://github.com/sonnybox/ComfyUI-SuperNodes
then restart ComfyUI. The pack's only Python dependency is matplotlib (used by its Sigmas Graph node), so nothing heavy here - but this pack is written against ComfyUI's newer extension API (comfy_api.latest), so you need a current ComfyUI. On an old build it simply won't register.
Gotchas. The two sigma schedules must have the same step count or it throws immediately. And the specific trap the author guards against: don't let one stream start at sigma 1.0 while the other is below 1 - the model can't express that pairing, and the fix is 0.9999 for the first sigma of whichever side is starting at 1.0. The errors here are loud and readable, which is more than most sampler nodes give you.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| noise_video | NOISE | β | |
| noise_audio | NOISE | β | |
| guider | GUIDER | β | |
| dual_sampler | DUAL_SAMPLER | β | |
| video_sigmas | SIGMAS | β | |
| audio_sigmas | SIGMAS | Use the same number of steps as video_sigmas. | |
| av_latent | LATENT | Packed video + audio latent. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| output | LATENT | β |
| denoised_output | LATENT | β |
| video_output | LATENT | β |
| audio_output | LATENT | β |
| denoised_video_output | LATENT | β |
| denoised_audio_output | LATENT | β |