Nodes/ComfyUI-OOP/OOP Mouth πŸ‘„
ComfyUI Node

OOP Mouth πŸ‘„

Mouth shape, size and openness as enums β€” expression without the typos

By 0xRavenBlackΒ·Created 2 years agoΒ·Updated about a year agoΒ· 15
OOP Mouth πŸ‘„
    • OOP_MOUTH
    β—„shapeNeutralβ–Ί
    β—„size β–Ί
    β—„opening β–Ί
    β—„randomizefalseβ–Ί

    A character's expression lives in the mouth, and "slightly open, full lips" is the kind of prompt line that gets flattened by the encoder into "lips open." OOP Mouth πŸ‘„ from the ComfyUI-OOP pack splits it into three clean controls - shape, size and openness - and writes the labeled string for you. It's the pack's expression workhorse.

    What it builds

    Standard pack architecture: a string builder outputting a custom OOP_MOUTH type. No pixels touched.

    • shape - required, 20 options: Round, Wide, Thin, Full, Heart, Smile, Frown, Neutral, Angled, Downturned, Oval, Pointed, and more. Default Neutral.
    • size - optional, 8 options: Small, Medium, Large, Tiny, Huge, Petite, Gigantic. Default " " (off - no size tag written).
    • opening - optional, 9 options: Closed, Slightly, Wide, Open, Partially Open, Fully Open, Gaping, Barely Open. Default " " (off).

    The two optional fields use the " " sentinel as their off switch - leave them blank and the node just won't write a size or openness tag. Set Full + Medium + Slightly and you get shape:Full, size:Medium, opened:Slightly, which is the exact mouth line from the README example. The output uses opened: (past tense, with the author's spelling) rather than open: - harmless, since it's just text the encoder reads, but don't be surprised to see it.

    randomize is available and re-rolls shape, size and opening on every queue run (IS_CHANGED returns fresh random bits). For batch expression study, it's great; for one specific look, keep it off.

    Where it goes

    OOP_MOUTH plugs into the mouth input on OOP Person πŸ‘€, which bundles it with hair, eyes, clothing and poses into a full character block. The OOP Node πŸ’« then assembles the scene and encodes it, exposing a STRING output so you can verify the mouth line survived. If Gaping reads wrong on your model, that string is where you fix it by hand.

    Install

    It ships with the pack:

    cd ComfyUI/custom_nodes
    git clone https://github.com/0xRavenBlack/ComfyUI-OOP
    

    Restart ComfyUI. Manager works too - search ComfyUI-OOP in the Custom Nodes Manager. No requirements.txt, no model files, nothing to download beyond the clone.

    Gotchas

    • Expression nuance is the weak spot. Smile and Frown are booru-style tags that SDXL and anime checkpoints read well; on photorealistic models, the size/openness split will do more work than the shape list.
    • SDXL-era again. The pack's aggregator hardcodes CLIP skip βˆ’2 and 1024Γ—1024 conditioning; the demo workflow is SDXL (euler/karras, cfg 8, 20 steps). These labels are tuned for that family.
    • The lists are a little unhinged at the edges. Gigantic and Gaping exist next to Petite and Barely Open. They're all valid strings; the model decides how literal to be.

    Small dormant pack (early 2025, ~15 stars). For keeping mouths consistent across a batch of character portraits - same shape, every render - this node is the reliable part of the pipeline.

    CategoryObject-Oriented Prompting

    Inputs (4)

    NameTypeDefaultDescription
    shapeCOMBONeutral20 options: Round, Wide, Thin, Full, Heart, Smile, +14
    sizeoptCOMBO 8 options: , Small, Medium, Large, Tiny, Huge, +2
    openingoptCOMBO 9 options: , Closed, Slightly, Wide, Open, Partially Open, +3
    randomizeoptBOOLEANfalseβ€”

    Outputs (1)

    NameTypeDescription
    OOP_MOUTHOOP_MOUTHβ€”