MiniMax H3 One-click Face Repair - Star7
Your H3 video's face is a 60px smudge. Fix it with a local re-sample pass.
- sampled_av_latent
- refine_context
- refined_images
Your H3 render's face isn't bad because the model is weak. It's bad because of pixel budget. A 10-second, multi-subject scene gives one character's face maybe 60×60 pixels of latent to work with, and at that size no video model reliably separates eyes from a smear. On stills, the community fixed this years ago with ADetailer - detect the face, crop it, re-run the region at real resolution, stitch it back. MiniMaxH3FaceRefineStar7 is that loop rebuilt for H3's packed audio-video latent, and it does the whole thing in one node without ever loading a second model.
It ships in the minimax-h3-chunk-star7 pack from star7code, the same pack that brings the H3 activation-chunking core node. It's a companion piece: where the All-in-one Conditioning node front-loads your H3 gen, this one cleans up the back end. The name says "one-click" and it mostly means it.
What it actually does
Wire two things in and you're done:
sampled_av_latent- the packed H3 audio-video latent straight off your sampler. Not the decoded image, not a normal SD latent.refine_context- theSTAR7_H3_REFINE_CONTEXToutput from MiniMax H3 All-in-one Conditioning - Star7 (the sibling node in this same pack). That context carries the model, VAE, and conditioning, so this node reuses the exact MODEL you already LoRA'd and chunked. No second model loader, no duplicate LoRA stack, no redownloading H3's ~40GB of weights.
Inside, it decodes the video, runs a YOLO face detector over the frames, splits the clip into shots (it uses pyscenedetect under the hood), tracks each face per-shot, crops each track to its own local canvas, runs a short re-sample pass (default 4 steps, tuned for the H3 Turbo 4-step LoRA) over just that region, and GPU-stitches the result back with feathering and blending. The audio latent is only copied through to H3's packaging - it's never decoded or altered. If it finds no usable face, or you flip enable_refine off, you get the original VAE-decoded frames back and pay nothing.
The inputs that matter
enable_refine- the kill switch. Off = plain decode, zero second-pass cost.face_count(1–4) - how many faces to fix. Each extra face costs roughly one more local sampling pass, so don't set it to 4 "just in case."preset- 自动平衡 (auto-balance, default), 真人保真 (realistic fidelity), 远景小脸 (small distant faces), 动漫角色 (anime), or 自定义 (custom). Presets directly show their step count, strength, canvas, framing, blend and feather; tweak any of thecustom_*values and you've moved to custom, but your values survive switching presets and back.target_face- 主人物 (largest-area main subject), 画面中央 (closest to frame centre), or 参考图匹配 (match the identity in your reference image). The reference-match option wants aninsightface-equipped environment; if that Python package isn't installed, the node warns and falls back to main-subject tracking rather than crashing.refine_steps- default 4 is right for Turbo. Cranking it raises second-pass time without a guarantee of linear quality.seed- deterministic local passes, handy for A/B testing presets.
Output is refined_images (an IMAGE) that you encode or save exactly as you would the normal VAE decode.
Getting it running
Install the pack once - every node in it arrives together:
cd ComfyUI/custom_nodes
git clone https://github.com/star7code/minimax-h3-chunk-star7.git
…then restart ComfyUI (or search "MiniMax H3 Activation Chunk - Star7" in ComfyUI Manager). Its real dependencies are scipy, scenedetect, and ultralytics, all handled on install. The only extra model the face node needs is face_yolov8m.pt, which downloads itself on first run (HF mirror, then HuggingFace) into ComfyUI/models/ultralytics/bbox after a SHA-256 check. That detector is the same Bingsu/adetailer face model the SD face-repair world already trusts.
Where people get burned
- "refine_context is incomplete" errors mean you skipped the All-in-one node or disconnected it - this node doesn't build context itself, it consumes it.
- It needs the packed H3 latent. Feed it a normal video latent and it'll refuse with a clear message.
- 主人物 is not a semantic identity. After a hard cut it re-picks the biggest face, and it doesn't know a character's story role. Only reference matching carries identity across new shots (and it can still stumble on crowds, crossings, side profiles and tiny faces).
- If the model download fails, check your proxy/network rather than the node - or drop
face_yolov8m.ptintomodels/ultralytics/bboxyourself.
If you're already running H3 locally, this is the highest-leverage upgrade to your output quality per added second of render time. If you're not running H3 yet, note the pack runs the real local weights - no MiniMax API key anywhere in this workflow.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| sampled_av_latent | LATENT | — | |
| refine_context | STAR7_H3_REFINE_CONTEXT | — | |
| enable_refine | BOOLEAN | true | — |
| face_count | INT | 11–4 | — |
| preset | COMBO | 自动平衡 | 5 options: 自动平衡, 真人保真, 远景小脸, 动漫角色, 自定义 |
| target_face | COMBO | 主人物 | 3 options: 主人物, 画面中央, 参考图匹配 |
| refine_steps | INT | 41–12 | — |
| custom_strength | FLOAT | 0.300.05–0.8 | — |
| custom_canvas | COMBO | 自动 | 3 options: 自动, 512, 768 |
| custom_crop_context | FLOAT | 2.61.8–4 | — |
| custom_blend | FLOAT | 0.900–1 | — |
| custom_feather | INT | 200–64 | — |
| seed | INT | 00–18446744073709550000 | — |
| preserve_repair_detail | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| refined_images | IMAGE | — |