VELVET VICE MiniMax H3 — Quality Refine Re-Encode AV Merge
The node that keeps H3's pass-1 audio when your refine pass rewrites the video
- base_latent
- refined_latent
- latent
MiniMax H3's whole trick is that audio isn't bolted on after the fact - the model generates sound in the same pass as the picture. That's exactly why its latents are tricky to refine. Run a second "quality" sampling pass over the whole AV latent and you can regenerate, drift, or outright lose the audio you already liked. This node is Velvet Vice's guard against that on its fanciest refine path.
What this node is guarding
The Quality Refine feature in this pack (added in v1.5.0) is a second sampler that runs after the primary H3 pass and before the final VAE decode. It's an img2img-style refinement at low denoise - LIGHT runs 0.12, HIGH runs 0.20, CUSTOM lets you pick 0.01–0.35 - so the pass-2 video gets coherent extra detail instead of a full rewrite. There are two routes to it:
- Direct latent refine - pass 2 re-samples the pass-1 latent as-is. Its merge helper is the plainer
VelvetViceMiniMaxH3AVRefineMerge. - Decode → Upscale → Re-Encode - pass-1 video is decoded to frames, upscaled, VAE-encoded again at higher resolution, then re-sampled. This is the hires-fix idea applied to video, and it's the route this node serves.
The re-encode leg shakes the latent structure: your "video" has been through pixels and back. Preserving pass-1 audio stops being automatic, which is why there's a dedicated merge node for it.
What it actually does
Three inputs: base_latent (the untouched pass-1 AV latent), refined_latent (the pass-2 output), and preserve_base_audio, a boolean that defaults to true. One output: latent, ready for the final VAE decode.
When preserve_base_audio is off, it just returns the refined latent untouched - that's the "joint AV refine" mode where pass 2 re-samples audio along with video (slower, and you're gambling on the new audio). When it's on, the node reaches into the pass-1 latent, pulls out its audio stream, and splices it into the refined result. If the refined latent came back video-only - which the re-encode path can do - it rebuilds the [video, audio] nested-tensor pair that H3 sampling expects. Failures are non-fatal: it prints a [VELVET VICE] warning to the console and passes the refined latent through rather than crashing mid-render.
Do you ever touch it?
Honestly? Almost never by hand. It's filed under VELVET VICE/MiniMax H3/Internal for a reason - inside the shipped v1.5.0 workflow it's pre-wired and driven by the System Hub's Preserve Base Audio toggle. What you actually decide is that toggle. Leave it on unless you actively want pass 2 to re-generate the audio; keeping it on is both faster and the point of a "video refine."
The one real gotcha: if you hand-wire this branch and see the "could not restore pass-1 H3 audio" warning, your base_latent isn't the true pass-1 AV latent (it needs the nested [video, audio] structure, not a video-only tensor). Easiest fix is loading the current workflow instead of splicing this plumbing yourself.
Installing the pack
This node ships with Velvet Vice's MiniMax H3 pack, not with ComfyUI. Easiest: ComfyUI Manager → Install Custom Nodes → search velvet-vice-minimax-h3 → install → restart. Manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/Velvet-Vice/velvet-vice-minimax-h3
Then restart ComfyUI. The pack is pure Python with no pip requirements, but it assumes your ComfyUI can already run MiniMax H3 (model plus the H3 video/audio VAEs in your models folders). If you're in the US, EU, UK or Korea, double-check the H3 Community License before going deep - the local-weights path is territory-restricted there.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| base_latent | LATENT | — | |
| refined_latent | LATENT | — | |
| preserve_base_audio | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |