Nodes/ComfyUI-PromptMaker-PNGTuber/PNGTuber Video Eye Builder (blink)
ComfyUI Node

PNGTuber Video Eye Builder (blink)

Don't expect finished eye sprites from this one — it's the planner that sets up the blink pass

By hobi2k·Created 3 months ago·Updated 3 months ago· 0
PNGTuber Video Eye Builder (blink)
    • bundle_manifest
    • eye_sprite_atlas
    • eye_generation_plan
    • reference_eye_crop
    video
    asset_idpngtuber_eyes
    max_frames600
    min_confidence0.30
    quad_scale2.2
    angle_range_degrees45
    angle_step_degrees15

    Set expectations early: PNGTuberVideoEyeBuilder does not hand you finished blink sprites. It's the front half of a two-stage pipeline - the stage that watches your character video, tracks the eyes, measures how open they are, and writes a generation plan plus a reference crop. The actual open/half/closed eye art comes from a Qwen edit pass you run afterward, and the companion PNGTuber Generated Eye Sprite Applier is what drops those generated eyes back into the bundle. That split is deliberate: blink needs believable half-closed and closed eyelids, and no amount of frame-picking from a video reliably gives you those, so the node marks requiresModelEyeGeneration: true on every run rather than pretending.

    How it works

    It decodes your video, runs MediaPipe face tracking per frame, and builds eye records - position, openness ratio, confidence. It finds the most-open frame for the reference crop, then writes a pngtuber.eyeSpriteAtlas.v1 skeleton with the angle bins laid out (-45° to +45° in 15° steps by default) and, crucially, the eye_generation_plan and reference_eye_crop files that tell you exactly what to feed the edit model. The manifest is pngtuber.videoEyeBundle.v1 with requiresModelEyeGeneration: true.

    Inputs and outputs

    • video - selector, same upload/drag-drop treatment as the mouth upload node.
    • max_frames (600 default, 0 = all) - blink tracking doesn't need the whole clip; 600 frames is usually plenty to characterize aperture.
    • min_confidence (0.3) - raise it if tracking is jittery on noise, lower it if eyes are being skipped.
    • quad_scale (2.2) - how much padding around the eyes the tracking quad keeps; bigger covers more head motion, smaller keeps the sprite tight.
    • angle_range_degrees (45) / angle_step_degrees (15) - the atlas granularity for head-turning.

    Outputs are four strings: bundle_manifest, eye_sprite_atlas, eye_generation_plan, reference_eye_crop. Nothing visual leaves this node - the plan and crop are the payload.

    Install

    Same pack, same drill:

    cd /path/to/ComfyUI/custom_nodes
    git clone https://github.com/hobi2k/ComfyUI-PromptMaker-PNGTuber.git
    cd /path/to/ComfyUI
    python -m pip install -r custom_nodes/ComfyUI-PromptMaker-PNGTuber/requirements.txt
    

    Then restart ComfyUI. This node itself only needs the base deps (MediaPipe is the workhorse here), but the second stage of the pipeline - the applier - needs you to generate eye images, and the natural way is the local Qwen image-edit stack the whole pack leans on.

    Where people trip

    • "No eyes detected" - the node's own message suggests the fix: lower min_confidence, or feed it a clip where the character is actually looking toward camera. It's stricter than the mouth path because eye landmarks are small.
    • Expecting sprites out - you'll get paths to JSON and a crop, not PNGs. If you wanted one-click, this isn't it; the image eye builder is the one-node path, for a static transparent PNG rather than a video.
    • Feeding the plan nowhere - the plan file is a contract, not a magic wand: it describes the reference crop and what to generate, and you still have to run the Qwen pass and connect the results to the applier. Skipping the applier leaves you with an atlas skeleton and no art.
    CategoryPNGTuber/Video Eyes

    Inputs (7)

    NameTypeDefaultDescription
    videoCOMBO1 options:
    asset_idSTRINGpngtuber_eyes
    max_framesINT6000–100000
    min_confidenceFLOAT0.300.05–0.95
    quad_scaleFLOAT2.21–5
    angle_range_degreesINT450–90
    angle_step_degreesINT155–45

    Outputs (4)

    NameTypeDescription
    bundle_manifestSTRING
    eye_sprite_atlasSTRING
    eye_generation_planSTRING
    reference_eye_cropSTRING