MiniMax H3 Preview
Live preview nodes for MiniMax H3 — hear the shot's stereo audio while it denoises, which ComfyUI's own preview discards.
Nodes (1)
ComfyUI-MiniMaxH3-Preview
MiniMax H3 generates stereo audio in the same forward pass as the picture, and every live preview in the ecosystem throws it away. MiniMax H3 Audio Preview decodes that half of the latent and draws a waveform you can play, alongside whatever draws your frames.
Install
Clone into ComfyUI/custom_nodes/ and restart ComfyUI. No dependencies beyond what ComfyUI
already installs; needs ComfyUI 0.30.0 or newer, where H3's packed audio+video latent landed.
You also need H3's audio VAE, the same file the finished render decodes with:
minimax_h3_audio_vae_fp32.safetensors in ComfyUI/models/vae/.
Use
Drop the node anywhere between your model source and the sampler, and wire
minimax_h3_audio_vae into audio_vae:
… → MiniMax H3 Audio Preview → KSampler
audio_vae ↑
Its model output must be the one the sampler reads, or nothing happens — a node whose output
goes nowhere is never executed. The panel then shows a waveform strip per update, with a sound
button and ↻ replay.
| Widget | What it does |
|---|---|
| audio_vae | minimax_h3_audio_vae. Its latent channel count is what identifies the audio stream in the pack, so wiring the video VAE here decodes nothing and logs which two channel counts didn't match. |
| window_seconds | Seconds to decode, from the start of the shot. Cost scales with it. 0 decodes the whole clip. |
| start_at_percent | Skip decoding until this share of the steps is done (default 50). |
| every_n_steps | Never update more often than every N sampler steps. |
| max_preview_overhead | Share of render time this may use, in percent (default 15). |
H3 is what this is for and what it is tested against. It just doesn't hard-code H3's numbers to
get there: the audio stream is found by matching the VAE's latent channel count rather than by
its position in the pack, the sample rate comes from the decode, and the latent frame rate
behind window_seconds is measured from the first decode — frames in versus samples out. So a
VAE variant at another rate or channel count is read correctly instead of quietly decoding
nonsense, and mono is kept mono rather than doubled.
Sound is off until you ask for it. Browsers refuse to play audio on a page that has not
been clicked, and a queued render should not suddenly start talking, so the strip is drawn and
the clip waits. The button says which of the two is happening: 🔇 click for sound is the
autoplay policy, and a click fixes it; ⚠ clip unplayable means the browser refused the
audio itself, and the console says why.
Tests
<ComfyUI>/venv/bin/python test_audio_preview.py
Offline checks — no GPU, no server, no model: which packed stream gets picked up, the audio
scale lookup, seconds-to-latent-frames at a measured rate, the gate and throttle arithmetic,
and the WAV bytes that reach the browser. Fake VAEs with their own channel count, sample rate
and frame rate stand in for a model that isn't H3. Add --write-clip to drop the encoded tone
next to the test so you can play it in a media player.