MiniMax H3 Shift Sigmas (video -> audio)
MiniMax H3's audio wants less noise than its video
- sigmas
- SIGMAS
When you resample MiniMax H3 in a two-pass upscale (see the h3-latent-upscaler pack's other nodes), you noise the video and audio streams separately and feed each its own MiniMaxH3AddNoise. The trap is assuming they want the same noise. They don't. MiniMax H3's video runs on one noise schedule and its audio runs on another, and if you noise the audio branch with the video branch's sigmas you get pass-2 audio that's been drowned far beyond what the model expects. It reads as distortion - audio that sounds blown out or garbled while the picture looks fine.
MiniMax H3 Shift Sigmas (video -> audio) is the fix: it remaps a video-schedule sigmas array onto H3's audio schedule, and you insert it on the audio branch only.
Why the schedules differ
ComfyUI's sampler hands the H3 DiT a single sigma per step, and that sigma is on the video schedule - generated by your pass-2 BasicScheduler with the checkpoint's default shift of 12.0. Inside the model, the audio stream doesn't get a sigma of its own from the sampler. Instead the DiT derives the audio timestep from the video sigma with a closed-form shift - time_shift_sigma with shift_video=12.0 down to shift_audio=3.0 by default, matching the checkpoint's sampling_settings - and rescales the audio velocity it returns to compensate.
That only works if the audio latent you handed the model was actually noised to the audio-schedule sigma, not the raw video one. Feed the audio branch the video sigmas as if "same noise level" were correct and you over-noise it badly: at denoise=0.4 (video sigma 0.4), the model's math expects audio noised to roughly sigma≈0.14. You're giving it almost three times the noise it expects at that point in the schedule.
Inputs and output
sigmas- the SIGMAS from your pass-2BasicScheduler. Wire the scheduler into both the video branch'sMiniMaxH3AddNoise(raw) and this node (for the audio branch).shift_video- default12.0. Match this to whatever video shift your sampler path uses; the default lines up with the checkpoint's own settings.shift_audio- default3.0. The schedule the audio stream actually runs on.- Output: SIGMAS - feed this into the audio branch's
MiniMaxH3AddNoiseinstead of the raw scheduler output. That's the whole placement: between the pass-2 scheduler and the audio branch's noise node.
Two properties worth knowing from the node's tests, so you can trust it blindly: the shift map leaves both ends of the array fixed (sigma=1 stays 1, sigma=0 stays 0), and if shift_video equals shift_audio it's an exact no-op. If your checkpoint or an upstream MiniMaxH3SigmaShift node uses non-default shifts, set the same values here - the defaults only match the standard checkpoint.
Installing and the usual mistake
Install as part of the pack - ComfyUI Manager search h3-latent-upscaler, or:
cd ComfyUI/custom_nodes
git clone https://github.com/rockerBOO/h3-latent-upscaler
then restart. No extra Python deps; you need a current ComfyUI with core H3 support.
The classic mistake is symmetry: someone reasons that if the video branch uses raw sigmas_pass2, the audio branch should too, and skips this node entirely. Symptom is audio-only degradation after pass 2 - picture crisp, sound mushy or distorted. The second mistake is the opposite, inserting it on the video branch as well; the video path runs on the scheduler's own video sigma and must not be shifted, or the picture quality takes the hit instead. One node, audio branch only, between the scheduler and the audio MiniMaxH3AddNoise. The pack's two example workflows in example_workflows/ show the correct split if you want the wiring laid out in front of you.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| sigmas | SIGMAS | — | |
| shift_video | FLOAT | 12.000.01–100 | — |
| shift_audio | FLOAT | 3.000.01–100 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SIGMAS | SIGMAS | — |