H3 Audio Refine · Load Verified First Pass (T8 EXP)
Resume H3 Audio Refine From A Checkpoint Someone Can Actually Prove
- av_latent
- status
- resume_verified
- checkpoint_id
- content_sha256
- file_sha256
- manifest_json
- report_json
- video_width
- video_height
Iterating on H3 audio the sane way means generating the video once, freezing it, and then re-running only the four-step audio tail as many times as you like. That's a big win: the expensive part stops being in the loop. It only works if the frozen file you're resuming from is provably the one you froze, and this node is where that gets enforced.
It's paranoid on purpose
Four inputs, and three of them are evidence.
checkpoint_path is a string you type, not a dropdown - the file must live under output/MiniMaxH3/latent_checkpoints. expected_file_sha256 is the whole-file hash, validated against the actual bytes on disk. expected_manifest_json is the external manifest, multiline, and it must be valid JSON describing an object. hash_chunk_megabytes (1–64, default 8) is the chunk size used for hashing - speed and temporary memory only, never a change in the verification.
Leave any of them blank and the node fails immediately, before a single sampling step. The pack's position on this is consistent and I've come to respect it: an empty hash is not a lenient default, it's a lie you'd tell yourself later. The loader even verifies the embedded manifest inside the file first, then checks your external copy against it.
On top of that, the checkpoint must declare the ID audio_refine_firstpass. That's the specific ID the Audio Refine resume route is looking for - a generic timeline checkpoint won't satisfy it, and the error message says so explicitly.
The outputs
You get av_latent - the frozen joint AV latent - plus a pile of receipts: status, resume_verified (BOOLEAN), checkpoint_id, content_sha256, file_sha256, manifest_json, report_json, and video_width / video_height as INTs.
resume_verified is the one to actually look at. Wire it where you'll notice it, and pair status with MiniMaxH3AudioRefineContextCommitGateEXPT8 if you're on the long-video route - that gate only lets a context save through when the status is exactly SAVED_VERIFIED, and refuses to guess otherwise.
The two INT outputs are convenient for feeding size fields downstream: the node derives them from the latent's geometry rather than your widgets, which is exactly what you want on a resume graph where a stale size field is a very easy mistake. Put MiniMaxH3AudioRefineFrozenAVFrameGuardEXPT8 right after this node to catch a duration mismatch before the tail pass runs.
Getting the path, manifest and SHA
The same pack's native AV latent checkpoint save node produces this file, and its outputs are where the three evidence strings come from - don't hand-write them and don't scrape them out of a terminal if you can avoid it, because a single character off in a SHA produces a mismatch that's genuinely hard to eyeball. Note that the save node's confirm_save defaults to false: it will happily compute a manifest, write nothing, and let you believe you saved something. Turn it on deliberately.
Two hard requirements from the save side that matter here: checkpoints are never overwritten, and they're no-pickle .h3latent.safetensors files written atomically. So each generation gets its own file, and your resume graph needs to point at the right one.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8.git minimax-h3-audio-T8
Manager also works - search MiniMax H3 Audio T8 - but note the author tracks GitHub and Registry releases separately, so clone if you need a specific version. Quit ComfyUI completely and restart; refreshing the browser does not re-register nodes. No pip step: the pack declares no extra packages so it can't disturb ComfyUI's Torch/CUDA stack. It needs a recent ComfyUI with native H3 support, and no weights are bundled - those are separate downloads into models/diffusion_models, models/text_encoders and models/vae.
What goes wrong
checkpoint ID is not audio_refine_firstpass. Your save used a differentcheckpoint_id. Fix it on the save side; the loader is right.- File SHA mismatch after you "just opened" the file in another tool. Don't. Any rewrite changes the hash and the loader will refuse it, correctly.
- Empty manifest or malformed JSON. Fails before sampling, by design.
- Hashing a large checkpoint on the default 8MB chunks and wondering why the node sits there. Raise
hash_chunk_megabytes; it's a throughput knob, not a correctness one. - Two installs of the pack. Old copies have shadowed the live module before. One copy only.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| checkpoint_path | STRING | — | |
| expected_manifest_json | STRING | — | |
| expected_file_sha256 | STRING | — | |
| hash_chunk_megabytes | INT | 81–64 | — |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| av_latent | LATENT | — |
| status | STRING | — |
| resume_verified | BOOLEAN | — |
| checkpoint_id | STRING | — |
| content_sha256 | STRING | — |
| file_sha256 | STRING | — |
| manifest_json | STRING | — |
| report_json | STRING | — |
| video_width | INT | — |
| video_height | INT | — |