JR MiniMax H3 Split AV Latent
Splitting an H3 AV latent so you can actually edit the video stream
- av_latent
- video_latent
- audio_latent
Here's the thing about the packed H3 AV latent: it's a NestedTensor with a video stream and an audio stream bundled together, and most standard latent nodes have no idea what to do with it. You can't run it through a spatial upscaler, you can't interpolate it, you can't inspect one stream without the other. JR_H3_SplitAVLatent is the un-bundler: it takes an official H3 AV LATENT and splits it into a standalone video_latent and audio_latent, both as ordinary ComfyUI LATENT dictionaries.
The design is deliberately cheap. The split uses the public unbind() on the nested tensor, outputs reference the original tensors directly - no cloning, no casting, no device moves, no forced contiguous(). That's not laziness, it's correctness: copying a 33B-class model's latent stream just to split it would be a waste of VRAM for zero benefit. The validation is where it spends its effort - it checks stream count, tensor types, video [B,24,T,H,W], audio [B,32,2,T], matching batch and finite values.
What it unlocks
The whole point is the two streams diverge from here:
video_latent→ spatial latent ops (upscaling, interpolation, resizing) → back into an AV builder.audio_latent→ carried through untouched → back into an AV builder.
The canonical pattern is the two-pass upscale: split the sampled AV latent, upscale only the video stream with the Neural Latent Upscaler, then rebuild with the AV Latent Builder and run a pass-2 sampler. You can also Save Latent each stream independently, Load Latent them in another workflow, and rebuild - that's the persistence path for partially-processed generations.
The one rule that burns people
The audio latent has no spatial axes. It's [B,32,2,T] - no H, no W. Spatial upscalers and interpolators can only ever touch the video_latent output. Feed the audio stream into a spatial chain and you'll get a shape error or silently meaningless output. Keep them separate until you rebuild.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Goldlionren/ComfyUI_JR_MiniMaxH3Node
<your-comfyui-python> -m pip install -r ComfyUI_JR_MiniMaxH3Node/requirements.txt
or ComfyUI Manager → search ComfyUI_JR_MiniMaxH3Node. Pack-wide install; same Python as ComfyUI, restart.
Troubleshooting
- "Not a NestedTensor" or stream-count errors - the input must be an official H3 AV latent from the native conditioning/sampler path. A plain image or video latent won't split.
- Batch mismatch between streams - the builder paired them, so if you've been moving things around between split and rebuild, keep the batch axes consistent.
- Video stream looks wrong after spatial ops - confirm you only ran spatial nodes on
video_latent, and that any save/load round-trip preserved the[B,24,T,H,W]layout. Contiguity is handled by the save node's own path, so that's not your problem to babysit.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| av_latent | LATENT | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video_latent | LATENT | — |
| audio_latent | LATENT | — |