MiniMax H3 Skin Finish / H3肤质收尾 (Advanced)
A non-generative skin finish that never touches a pixel you didn't sign off
- frames
- skin_mask
- face_plan
- audio
- candidate
- source
- selected
- audio
- used_skin_mask
- rejected_mask
- difference
- skin_finish_state
- report_json
H3 close-ups come out of the sampler with skin that's sometimes waxy, sometimes blotchy, sometimes just off. Most people reach for a beauty filter or an upscaler and end up melting the texture along with the flaw. This node is the opposite approach: a non-generative skin finish. It builds a low-frequency skin-tone/oil-shine candidate inside a reliable mask, keeps everything outside that mask pixel-identical, and by default outputs the source - you have to explicitly accept the candidate before the "selected" output changes. It's the pack's P0 (preview/provenance) route, and it reads like it was written by someone who has watched too many filters ruin good footage.
How it works
The mechanics split into mask + process. mask_source is external_exact (default - you bring a skin_mask) or face_refine_plan (builds a conservative inner-face proxy mask from a face-refine plan; the description is careful that this is not a semantic face parser). Either way, the mask goes through gates: minimum_mask_area (0.002) and maximum_mask_area (0.45) reject masks that are too tiny or suspiciously huge, mask_feather_px (3) softens the edge, and temporal_mask_radius (0) can smooth the mask across frames.
Then the candidate is computed in CPU-bounded chunks (chunk_frames 4) on a proxy (proxy_long_side 640), which keeps VRAM flat. The tone is controlled by preset (subtle default), amount (0.35), texture_keep (0.9 - how much skin grain survives), shine_control (0.35), and tone_adjust (±). protect_features (true) keeps features safe inside the mask treatment.
The output selection is where its personality shows: candidate, source, and selected all come out. With accept_candidate false (default), selected = source. Flip it true and selected = candidate. Nothing is ever automatic. You also get used_skin_mask, rejected_mask (when a mask failed gates), difference, audio passthrough, a skin_finish_state handle for the resumable P1 route, and report_json.
Installing
Part of T8mars MiniMax H3 Audio T8:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8
or ComfyUI Manager → "MiniMax H3 Audio T8", restart. No pip deps for this node itself. The fancier semantic-mask siblings (separate nodes) need FaceXLib + a pinned ParseNet weight, but this core node just needs frames, a mask, and optionally an audio to pass through.
The take
This is the node to reach for when H3 skin texture is the complaint but you don't want to lose the face. Its honest limits are stated in the description: it doesn't fix facial features, blur, identity, or lip-sync - it evens out low-frequency skin tone and shine inside a bounded mask. Where people get burned: trusting a shaky mask (use the area gates and watch rejected_mask), or flipping accept_candidate and then re-running with different inputs. Set execution_mode to review_only first, look at candidate vs source side by side, and only then accept. It's a finishing tool, not a miracle worker, and it's refreshingly explicit about that.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| frames | IMAGE | — | |
| mask_source | COMBO | external_exact | 2 options: external_exact, face_refine_plan |
| preset | COMBO | subtle | 5 options: subtle, oil_control, tone_even, soft_portrait, custom |
| amount | FLOAT | 0.350–1 | — |
| texture_keep | FLOAT | 0.900–1 | — |
| shine_control | FLOAT | 0.350–1 | — |
| tone_adjust | FLOAT | 0.00-1–1 | — |
| execution_mode | COMBO | candidate_only | 3 options: candidate_only, review_only, bypass |
| accept_candidate | BOOLEAN | false | False preserves the source on selected output. Acceptance is always explicit and never automatic. |
| protect_features | BOOLEAN | true | — |
| minimum_mask_area | FLOAT | 0.0020–0.5 | — |
| maximum_mask_area | FLOAT | 0.450.01–1 | — |
| mask_feather_px | INT | 30–64 | — |
| temporal_mask_radius | INT | 00–8 | — |
| proxy_long_side | INT | 640128–1280 | — |
| chunk_frames | INT | 41–32 | — |
| skin_maskopt | MASK | — | |
| face_planopt | H3_T8_FACE_REFINE_PLAN | — | |
| audioopt | AUDIO | — |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| candidate | IMAGE | — |
| source | IMAGE | — |
| selected | IMAGE | — |
| audio | AUDIO | — |
| used_skin_mask | MASK | — |
| rejected_mask | MASK | — |
| difference | IMAGE | — |
| skin_finish_state | H3_T8_SKIN_FINISH_STATE | — |
| report_json | STRING | — |