ComfyUI Node

肖像大师:基础角色设定

Portrait Master's Base Character Module, in Chinese

By DropFan·Created 2 years ago·Updated about a year ago· 5
肖像大师:基础角色设定
    • text_out
    镜头-
    镜头权重1.00
    性别-
    跨性别程度0.00
    丑陋程度0.00
    大众脸0.00
    年龄22
    国籍_1-
    国籍_2-
    国籍混血0.50
    体型-
    体型权重1.00
    眼睛颜色-
    眼睛形状-
    唇色-
    唇形-
    面部表情-
    面部表情权重1.00
    脸型-
    脸型权重1.00
    面部不对称0.00
    发型-
    发色-
    头发长度-
    凌乱程度0.00
    胡子-
    胡子颜色-
    启用true
    text_in
    seed

    If you've ever stared at a bare CLIPTextEncode box and tried to describe a person with words, you know the pain: "Chinese woman, 25 years old, almond eyes, oval face…" - and it comes out looking like nobody in particular. This node is the answer to that, except it's in Chinese and it hands you a dozen dropdowns instead of a blank text field. PortraitMasterBaseCharacterCN (肖像大师:基础角色设定) is the "who is this person" half of the Portrait Master v3 split: it turns widget values into prompt text for the core character - shot type, gender, age, ethnicity, body type, eyes, lips, face, hair, beard.

    It's part of comfyui-portrait-master-cn, a Chinese localization of Stefano Flore's well-known Portrait Master. The name is a lie in the best way: this is a pure prompt-builder, no model downloads, no API key, no GPU cost. The only "processing" is string assembly.

    How it works

    The node reads text lists from the pack's lists/ folder - each file holds lines in Chinese/English pairs, which is the whole trick of the localization: you pick 黑发 from a dropdown and it quietly inserts (black hair:1.05) into the prompt. Every selector with a - value is skipped entirely. Every weight slider above 0 gets applied as ComfyUI's (token:weight) syntax. The 随机 🎲 entry picks a random option from that list.

    That's it. It's not doing anything clever - and that's the appeal. You get the consistency of a real prompt-writing system instead of trusting your memory for what "hazel eyes" is called this week.

    The inputs that matter

    The node has a wall of required inputs, but you genuinely only set a handful:

    • 镜头 (shot) + 镜头权重 - headshot, bust, full body, close-up, and more. This frames everything else, so it's usually the first thing you pick.
    • 性别, 年龄, 国籍_1 / 国籍_2 + 国籍混血 - the person. Age is an integer that emits 22-years-old.
    • 发型 / 发色 / 头发长度, 眼睛颜色 / 眼睛形状, 脸型, 体型 - the details that stop the "who is this person" problem.

    There's also 启用 (enable), a master toggle, plus two optional inputs: text_in (chain another module's output in) and seed (make the 🎲 randomizers reproducible). The single output, text_out (STRING), is what you feed into CLIPTextEncode.

    Wiring it up

    The v3 modules are designed to chain: each takes text_in and emits text_out, so you can run BaseCharacter → SkinDetails → StylePose → Makeup in any order and they concatenate. One output string goes to the positive prompt. In the Chinese fork, all the widget names stay Chinese but the emitted prompt text is English - so your SDXL checkpoint sees normal tags.

    Installing it

    cd ComfyUI/custom_nodes
    git clone https://github.com/DropFan/comfyui-portrait-master-cn
    

    Then restart ComfyUI. Or use ComfyUI Manager and search for comfyui-portrait-master-cn. There's no requirements.txt and nothing to download - it's just Python text files. (ComfyUI Manager may list it as the CN fork, not the original florestefano1975 pack; make sure you grab the DropFan one if you want the Chinese UI.)

    Where people get burned

    • The nationality mix syntax. With both 国籍_1 and 国籍_2 set, the node emits [chinese:spanish:0.5] - ComfyUI's standard CLIPTextEncode doesn't natively understand that weighted-alternation syntax, so it'll be treated literally or ignored. The README recommends comfyui-prompt-control for this. If you're mixing ethnicities, install that or just pick one nationality and skip the feature.
    • 🎲 needs a seed. The randomizers are useless unless you connect a seed input; otherwise they re-roll every run.
    • Weights only mean something on CLIP encoders. (token:1.2) works on SD1.5/SDXL-lineage checkpoints. If your model uses an LLM text encoder (Flux, Z-Image), the emitted (...) syntax is mostly ignored - the structure still helps, the weights don't.
    • The output is lowercased and comma-joined, which is fine for tags but worth knowing before you diff two prompts.

    If your checkpoint is weak at faces, no prompt node will save it - Portrait Master's own docs point at FormulaXL 2.0 for realism, and honestly the checkpoint matters more than any of these sliders. But once you have a decent model, this is the fastest way to get a repeatable, hand-tuned character instead of typing your way through it.

    Category肖像大师中文版 Portrait Master CN

    Inputs (30)

    NameTypeDefaultDescription
    镜头COMBO-13 options: -, 随机 🎲, 头像, 头肩像, 半身肖像, 全身肖像, +7
    镜头权重FLOAT1.000–2
    性别COMBO-6 options: -, 随机 🎲, 男, 女, 男孩, 女孩
    跨性别程度FLOAT0.000–2
    丑陋程度FLOAT0.000–2
    大众脸FLOAT0.000–2
    年龄INT221–120
    国籍_1COMBO-194 options: -, 随机 🎲, 阿富汗人, 阿尔巴尼亚人, 阿尔及利亚人, 安道尔人, +188
    国籍_2COMBO-194 options: -, 随机 🎲, 阿富汗人, 阿尔巴尼亚人, 阿尔及利亚人, 安道尔人, +188
    国籍混血FLOAT0.500–1
    体型COMBO-36 options: -, 随机 🎲, 强壮的, 丰满的, 健壮的, 胖乎乎的, +30
    体型权重FLOAT1.000–2
    眼睛颜色COMBO-19 options: -, 随机 🎲, 白化外观, 琥珀色, 琥珀棕色, 黑色, +13
    眼睛形状COMBO-14 options: -, 随机 🎲, 杏仁眼形状, 亚洲人眼睛形状, 眼距近的眼睛形状, 深陷的眼睛形状, +8
    唇色COMBO-35 options: -, 随机 🎲, 浆果色唇, 黑色唇, 蓝色唇, 古铜色唇, +29
    唇形COMBO-24 options: -, 随机 🎲, 咬唇, 弓形唇, 闭唇, 丘比特弓唇, +18
    面部表情COMBO-44 options: -, 随机 🎲, 愉快的, 愤怒的, 焦虑的, 吃惊的, +38
    面部表情权重FLOAT1.000–2
    脸型COMBO-26 options: -, 随机 🎲, 圆形, 娃娃脸, 菱形, 心形, +20
    脸型权重FLOAT1.000–2
    面部不对称FLOAT0.000–2
    发型COMBO-122 options: -, 随机 🎲, 爆炸头, A 字波波头, 不对称发型, 挑染, +116
    发色COMBO-26 options: -, 随机 🎲, 赤褐色, 米色 (浅褐色), 黑色, 金色(女)/浅黄色(男), +20
    头发长度COMBO-9 options: -, 随机 🎲, 光头, 超短发, 短, 中, +3
    凌乱程度FLOAT0.000–2
    胡子COMBO-35 options: -, 随机 🎲, 胡茬, 山羊胡, 络腮胡, 凡戴克胡, +29
    胡子颜色COMBO-26 options: -, 随机 🎲, 赤褐色, 米色 (浅褐色), 黑色, 金黄色, +20
    启用BOOLEANtrue
    text_inoptSTRING
    seedoptINT

    Outputs (1)

    NameTypeDescription
    text_outSTRING