Nodes/BSAI-ComfyUI-MiniMax-H3-PDD-Acc/MiniMax H3 AV Latent Upscale By
ComfyUI Node

MiniMax H3 AV Latent Upscale By

Core LatentUpscale Can't Touch an H3 Latent — Here's the Node That Can

By xm6018924·Created about a month ago·Updated 8 days ago· 4
MiniMax H3 AV Latent Upscale By
  • samples
  • LATENT
◄upscale_method▾►
◄scale_by1.50►

You rendered a decent 896x512 clip with MiniMax-H3, you want it at 1344x768, you drop in the Latent Upscale By node you've used a thousand times - and it falls over. That's not a broken install. MiniMax H3 generates picture and sound in one pass, and ComfyUI stores that as a nested latent: a video tensor and an audio tensor travelling together in the same LATENT. Core LatentUpscale assumes one plain tensor in samples["samples"], so it either chokes or does something you don't want.

This node is the small fix for that one job, and it's the hinge of the pack's two-pass hi-res workflow.

What it actually does

The video half gets resized per frame: the node unfolds the frame axis into the batch, runs ComfyUI's own comfy.utils.common_upscale over it, then folds it back. The audio half is passed through untouched - byte for byte. New dimensions are snapped to even numbers on each axis, because H3 packs 2x2 spatial patches, which keeps your pixel dimensions on the 32px grid. Then it repacks both halves into a nested latent and returns it.

One quiet detail worth knowing: it drops any noise_mask in the latent, because a mask sized for the old resolution is worse than no mask. If your graph was carrying an inpaint-style mask into pass two, it's gone now.

The inputs that matter

scale_by is the one you'll actually think about. The author's tooltip is blunt about it: 1.5 on an 896x512 pass-1 render lands exactly on the model-native 1344x768 - a 2x2-ish patch multiple with no rounding slop. The field takes 0.25 to 4 in 0.05 steps, but staying near the model's native range is the whole point; going 2x or 3x takes you into territory the refiner has no trained behaviour for.

upscale_method is the familiar five (bislerp, bicubic, bilinear, nearest-exact, area). The shipped example uses bislerp, and that's where I'd leave it. nearest-exact on a latent is how you get blocky structure that the refine pass then faithfully preserves. samples is the pass-1 LATENT, usually straight off your first SamplerCustomAdvanced.

You get one output: LATENT. Wire it into the pass-2 sampler's latent input, and drive that sampler with sigmas from MiniMax H3 PDD Acc Scheduler at denoise 0.25 - the two trained blocks (resume sigma 0.8) that sharpen without repainting your composition. The pack's pdd_acc_t2v_latent_upscale.json example is exactly this graph, so steal it before hand-wiring anything.

Install

Search the pack title in ComfyUI Manager, or:

cd ComfyUI/custom_nodes
git clone https://github.com/xm6018924/BSAI-ComfyUI-MiniMax-H3-PDD-Acc

Restart ComfyUI. Nothing to download for this node specifically, and the pack declares only torch, safetensors and numpy - all of which a ComfyUI install already has. The real requirement is the core: this needs a ComfyUI new enough to carry H3's nested video+audio latent (the pack states v0.33.0+ for the carried-audio rework), because before that the latent shape this node expects doesn't exist.

Where people get burned

The loud one is the guard: hand this node a normal image latent and you get expected a MiniMax-H3 AV latent (nested video+audio pair…). That error means you're feeding it a plain VAE-encoded latent, not that the node is broken - in a hi-res fix you need the sampler's output, which is where the nested pair lives.

The quiet one is expectation. The audio isn't upscaled, improved, or touched. In the pack's example the soundtrack is decoded from pass 1 and the refine pass discards its own audio entirely - pass 2 re-noises an audio copy purely as joint-attention context. So don't go hunting for a better-sounding mix out of the second pass. It's identical to the low-res render, by design.

Last thing, and it's the same trap every distill hits: this upscaler only makes sense paired with a sampler that's still on the trained grid. A 0.25 denoise on a PDD-partitioned schedule is two whole blocks. A 0.4 on a generic Karras schedule is a bunch of sigma values the PDD heads have never seen, and no upscaler can save that. Keep nfe on the scheduler matched to your Apply node and keep the sampler on euler.

Categorymodel/latent/minimax

Inputs (3)

NameTypeDefaultDescription
samplesLATENT—
upscale_methodCOMBO5 options: bislerp, bicubic, bilinear, nearest-exact, area
scale_byFLOAT1.500.25–41.5 on a 896x512 pass-1 render lands exactly on the model-native 1344x768.

Outputs (1)

NameTypeDescription
LATENTLATENT—