Nodes/MiniMax H3 Audio T8/MiniMax H3 Skin Finish Multi-Person / 多人肤质收尾 (Advanced)
ComfyUI Node

MiniMax H3 Skin Finish Multi-Person / 多人肤质收尾 (Advanced)

Finish two people's skin in a long clip without loading SAM twice

By T8mars·Created 20 days ago·Updated a day ago· 807
MiniMax H3 Skin Finish Multi-Person / 多人肤质收尾 (Advanced)
  • frames
  • track_plan
  • previous_state
  • audio
  • candidate
  • source
  • selected
  • audio
  • used_skin_mask
  • rejected_mask
  • difference
  • sequence_state
  • report_json
  • emitted_absolute_start
  • emitted_frame_count
absolute_start_frame0
presetsubtle
amount0.35
texture_keep0.90
shine_control0.35
detection_threshold0.45
minimum_face_height_px24
minimum_detail0.010
bbox_ema_alpha0.55
max_missing_frames2
protect_featurestrue
include_neckfalse
maximum_overlap_frames8
mask_feather_px3
proxy_long_side640
chunk_frames4
accept_candidatefalse

MiniMaxH3SkinFinishMultiPersonT8Advanced is the workhorse of the pack's multi-person Skin Finish route: it takes the frames and the SAM3.1 track plan you already generated, and applies the conservative skin finishing per person - each person's skin gets smoothed within their own track, so person A's finish never bleeds into person B's face.

The headline feature is that it does not reload SAM. The track plan (H3_T8_SAM31_MULTIFACE_TRACK_PLAN) is already computed and unloaded by the time this node runs; all it needs is the plan object and the frames. A hashed causal sequence state lets you feed it overlapped chunks of a long video and continue without temporal averaging smearing the result.

How it works

For every frame chunk, CPU YuNet finds faces inside each shot-local person mask, then the node intersects a conservative face region with that person's track. Small, profile, blurred or occluded faces get downweighted rather than processed aggressively - remember this node never sharpens or reconstructs missing detail, it only finishes what's reliably there.

The inputs that matter:

  • frames and track_plan - the batch and its plan; mismatched hashes mean ABSTAIN.
  • absolute_start_frame - the zero-based frame where this chunk starts. First chunk must start at 0; later chunks may overlap a reviewed tail (up to maximum_overlap_frames, default 8).
  • preset - deliberately limited to subtle and oil_control. The author's rule: multi-person finishing is shared and color-neutral, no per-person hue/saturation fiddling.
  • amount (0.35), texture_keep (0.9), shine_control (0.35) - same mix as the single-person node.
  • detection_threshold (0.45), minimum_face_height_px (24), minimum_detail (0.01) - face-quality gates; minimum_detail only downweights already-blurred faces.
  • protect_features (True), include_neck (False) - keep features safe and keep the finish off necks/clothing.
  • accept_candidate - the big one. Source stays selected until you flip it.

Optional previous_state feeds the sequence_state from a prior chunk so long clips continue cleanly; audio passes through as the same AUDIO object. The pack's own warning: don't concatenate duplicated audio from overlapped chunks - that's what the Video Finalize node is for.

Outputs: candidate, source, selected, audio, used_skin_mask, rejected_mask, difference, sequence_state, plus emitted_absolute_start and emitted_frame_count so you know exactly what a chunk covered.

Where it sits

The reference chain is examples/workflows/17-skin-finish/2026-08-24_H3_Skin_Finish_MultiPerson_Video_Finalize_Advanced_EXP.json: SAM tracks once and unloads → this node finishes → Texture Guard hardens → Video Finalize re-encodes and copies the original audio packets. Keep accept_candidate=false until you've reviewed.

Install is the pack standard - Manager search "MiniMax H3 Audio T8" or

cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8

then restart. No extra pip packages for this node; the SAM3.1 track plan and local YuNet are all it consumes.

Gotchas

  • The plan must be from the same frames. Feed it a plan built on a different batch and it fails closed rather than guessing.
  • It won't fix what isn't there. If a face is turned away or blurred for half a shot, those frames get downweighted, not regenerated.
  • Audio passthrough is identity, not remix. If you need file-level audio handling, go through Video Finalize, not this node's audio output.

This is the node to reach for when your clip has more than one face and you want the same careful, conservative finish as the basic node - without paying for a second SAM load.

CategoryT8/MiniMax H3/Post FX/Experimental

Inputs (21)

NameTypeDefaultDescription
framesIMAGE
track_planH3_T8_SAM31_MULTIFACE_TRACK_PLAN
absolute_start_frameINT00–10000000Absolute zero-based frame index of this chunk. The first chunk must start at 0; later chunks may overlap a reviewed bounded tail.
presetCOMBOsubtleMulti-person mode intentionally exposes only shared color-neutral finishing. Per-person hue/saturation changes are not automatic.
amountFLOAT0.350–1
texture_keepFLOAT0.900–1
shine_controlFLOAT0.350–1
detection_thresholdFLOAT0.450.1–0.95
minimum_face_height_pxFLOAT244–512
minimum_detailFLOAT0.0100.001–0.1Gradient-detail floor used only to downweight already blurred faces. Skin Finish does not sharpen or reconstruct them.
bbox_ema_alphaFLOAT0.550–1Causal current-observation weight; resets naturally at shot-local tracks.
max_missing_framesINT20–8
protect_featuresBOOLEANtrue
include_neckBOOLEANfalseOff by default. A conservative neck strip is still clipped to the person track.
maximum_overlap_framesINT80–32
mask_feather_pxINT30–64
proxy_long_sideINT640128–1280
chunk_framesINT41–32
accept_candidateBOOLEANfalseSource remains selected until the candidate has been reviewed.
previous_stateoptH3_T8_SKIN_FINISH_SEQUENCE_STATE
audiooptAUDIOPassed through as the same AUDIO object. Do not concatenate duplicate audio from overlapped chunks; use Video Finalize for file-level audio.

Outputs (11)

NameTypeDescription
candidateIMAGE
sourceIMAGE
selectedIMAGE
audioAUDIO
used_skin_maskMASK
rejected_maskMASK
differenceIMAGE
sequence_stateH3_T8_SKIN_FINISH_SEQUENCE_STATE
report_jsonSTRING
emitted_absolute_startINT
emitted_frame_countINT