Extensions/MiniMax H3 Preview
ComfyUI Extension

MiniMax H3 Preview

Live preview nodes for MiniMax H3 — hear the shot's stereo audio while it denoises, which ComfyUI's own preview discards.

By Brioch·Created 22 days ago·Updated 22 days ago· 2
Brioch/ComfyUI-MiniMaxH3-Preview
Nodes1
On cloudLocal install
CategoryMiniMax H3
Stars2
Updated22 days ago
Readme

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.