feat(monitor): 抖音 Web 接口客户端 —— 绕开爬虫子进程,直接发 HTTP
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s

移植自 mac-agent-os 的 mediacrawler_adapter:不起子进程、不开页面,用浏览器里那份
登录态直接调抖音 Web 接口。产物键名照抄 store/douyin,所以 ingest 那条链路一个字不用改。

**目前能用的(真环境实测,非推断)**:

    profile/other : 200, 7075 字节  —— 博主主页指标(粉丝/获赞/作品数/昵称)
    aweme/detail  : 200, 45425 字节 —— 单条作品详情(含点赞/评论/收藏/分享)

**目前不能用的:作品列表 `aweme/post`。** 两个互相独立的原因:
  1. 这个接口被抖音单独升级成了真校验:不带 x-tt-argus 回 403「Uifid Not Found」,
     带上 dummy 值回 200 + **空 body**。也就是说「头在不在」骗得过,「真校验」过不了。
     同一套头打 profile/other 和 aweme/detail 都是通的 —— 抖音是挑着接口加保护的,
     挑中的恰好是「批量拉作品列表」这个最敏感的动作。
  2. 改走页面截获也不行:CDP 浏览器打开博主主页会落到「验证码中间页」(当天大量探测的
     代价,过几小时要重测)。

  所以现在的边界是:**已知作品的指标刷新能做,自动发现新作品做不了**。

**排查中控住变量后得到的两条事实**(都写进注释了):
  · `Accept` / `Accept-Language` / `Referer` 才是主页接口能返回真数据的原因 —— 只有
    UA+client hints+Cookie 时是 200 但仅 121 字节的空壳,补上这三个头变 7074 字节。
    (我先前猜的 sec-ch-ua 不是关键。)
  · 因此 UA 与 client hints 必须**成套地取自同一个浏览器**,所以 BrowserIdentity 一次
    从 CDP 取齐 cookie + UA + hints,而不是各自写死。

「200 + 空 body 必须当场报错」也是刻意写死的:放过去它会在下游变成「这个博主没作品」,
把一次失败伪装成一条正常结果 —— 爬虫那条路正是这么栽的,还被翻译成「账号被封」。

测试 +11:cookie 解析、请求头成套性(含 uifid 缺失/回退)、产物键名与 store 对齐、
以及 _get 的三条失败路径(空 body / 403 带网关原话 / 正常返回)。
This commit is contained in:
2026-10-10 17:12:25 +08:00
parent 21ff01b894
commit 2112c1a870
1601 changed files with 367425 additions and 0 deletions
@@ -0,0 +1,318 @@
"""
角色注册中心 (Character Registry) — 漫剧视频工厂
功能:
- 注册/管理/切换主角
- 存储角色描述、外观、性格、音色、画风
- 生成角色描述块 (character block),供角色适配器和视觉生成模块注入
- 支持多角色切换
用法:
from character_registry import CharacterRegistry
registry = CharacterRegistry()
char = registry.get_active_character()
block = char.build_prompt_block(style="manhua", expression="微笑", scene="咖啡馆")
"""
import os
import json
import yaml
from pathlib import Path
from typing import Optional
# ── 默认路径 ──
SCRIPTS_DIR = Path(__file__).resolve().parent
AVE_ROOT = SCRIPTS_DIR.parent
CACHE_DIR = Path(os.environ.get(
"AVE_CACHE_DIR",
str(Path.home() / "workbuddy-agent-os/agent-local/tools/ave/cache/character_registry")
))
CACHE_DIR.mkdir(parents=True, exist_ok=True)
REGISTRY_FILE = SCRIPTS_DIR / "registry.yaml"
CHARACTERS_DIR = CACHE_DIR / "characters"
CHARACTERS_DIR.mkdir(parents=True, exist_ok=True)
# ═══════════════════════════════════════════════════════════
# 角色类
# ═══════════════════════════════════════════════════════════
class Character:
"""单个角色的完整定义"""
def __init__(self, data: dict):
self.name: str = data.get("name", "未命名")
self.description: str = data.get("description", "")
self.appearance: list[str] = data.get("appearance", [])
self.personality: str = data.get("personality", "")
self.voice_style: str = data.get("voice_style", "默认")
self.art_style: str = data.get("art_style", "")
self.default_bgm_style: str = data.get("default_bgm_style", "治愈")
self.preferred_bgm_tags: list[str] = data.get("preferred_bgm_tags", [])
self.reference_images: dict = data.get("reference_images", {})
self.prompt_template: dict = data.get("prompt_template", {})
self._raw = data
# ── 角色描述块生成 ──
def build_prompt_block(self, style: str = "manhua", expression: str = "中性",
scene: str = "", camera_angle: str = "中景") -> str:
"""
构建角色描述块,用于注入视觉生成 prompt
参数:
style: "manhua" | "realistic"
expression: 角色当前表情/情绪
scene: 场景描述
camera_angle: 镜头角度
返回:
格式化的角色描述块字符串
"""
app_desc = ",".join(self.appearance[:3]) # 取前3个外观特征
char_desc = f"{self.name},{app_desc}"
template = self.prompt_template.get(style, "")
if template:
return template.format(
character_desc=char_desc,
scene_desc=scene,
expression=expression,
camera_angle=camera_angle,
)
# 默认模板
if style == "manhua":
return (
f"[角色] {char_desc}\n"
f"[场景] {scene}\n"
f"[表情] {expression}\n"
f"[画风] {self.art_style}\n"
f"[镜头] {camera_angle}"
)
else:
return (
f"[角色] {char_desc}\n"
f"[场景] {scene}\n"
f"[表情] {expression}\n"
f"[画风] 电影级摄影,写实风格\n"
f"[镜头] {camera_angle}"
)
def to_storyboard_block(self) -> dict:
"""生成角色描述块 JSON(供分镜引用)"""
return {
"character_name": self.name,
"appearance": self.appearance,
"personality": self.personality,
"voice_style": self.voice_style,
"art_style": self.art_style,
"reference_images": self.reference_images,
"default_bgm_style": self.default_bgm_style,
}
def to_dict(self) -> dict:
return self._raw
def __repr__(self) -> str:
return f"<Character: {self.name}>"
# ═══════════════════════════════════════════════════════════
# 角色注册中心
# ═══════════════════════════════════════════════════════════
class CharacterRegistry:
"""角色注册中心 — 管理所有已注册角色"""
def __init__(self, registry_path: Optional[str] = None):
self._registry_path = Path(registry_path or REGISTRY_FILE)
self._characters: dict[str, Character] = {}
self._active_name: str = ""
self._load()
# ── 加载/刷新 ──
def _load(self):
"""从 registry.yaml 加载角色"""
if not self._registry_path.exists():
raise FileNotFoundError(f"角色注册文件不存在: {self._registry_path}")
with open(self._registry_path, encoding="utf-8") as f:
data = yaml.safe_load(f) or {}
self._active_name = data.get("active_character", "")
chars = data.get("characters", {})
for name, char_data in chars.items():
char_data["name"] = name
self._characters[name] = Character(char_data)
if not self._active_name and self._characters:
self._active_name = list(self._characters.keys())[0]
def reload(self):
"""重新加载注册文件"""
self._load()
# ── 查询 ──
def get_active_character(self) -> Character:
"""获取当前激活的角色"""
if self._active_name in self._characters:
return self._characters[self._active_name]
raise KeyError(f"未找到激活角色: {self._active_name}")
def get_character(self, name: str) -> Character:
"""按名字获取角色"""
if name in self._characters:
return self._characters[name]
raise KeyError(f"未找到角色: {name}")
def list_characters(self) -> list[str]:
"""列出所有已注册角色名"""
return list(self._characters.keys())
def get_active_name(self) -> str:
return self._active_name
# ── 参考图管理 ──
def set_reference_image(self, name: str, key: str, path: str) -> bool:
"""
设置角色的单张参考图路径
参数:
name: 角色名
key: 参考图类型 (portrait / grid / full_body / expressions.happy 等)
path: 图片文件路径
使用嵌套 key 的示例: set_reference_image("小漫", "expressions.happy", "...")
"""
char = self.get_character(name)
if "." in key:
# 嵌套 key: "expressions.happy" → reference_images["expressions"]["happy"]
parts = key.split(".", 1)
if parts[0] not in char.reference_images:
char.reference_images[parts[0]] = {}
char.reference_images[parts[0]][parts[1]] = path
else:
char.reference_images[key] = path
# 同步到 _raw 以持久化
char._raw["reference_images"] = char.reference_images
self._save()
return True
def update_reference_images(self, name: str, images: dict) -> bool:
"""
批量更新角色的参考图路径
参数:
name: 角色名
images: {
"portrait": "path/to/portrait.png",
"grid": "path/to/grid.png",
"expressions": {"happy": "...", "sad": "...", "angry": "..."}
}
"""
char = self.get_character(name)
# 深度合并
for key, value in images.items():
if isinstance(value, dict) and key in char.reference_images and isinstance(char.reference_images[key], dict):
char.reference_images[key].update(value)
else:
char.reference_images[key] = value
char._raw["reference_images"] = char.reference_images
self._save()
return True
def get_reference_images(self, name: str) -> dict:
"""获取角色的所有参考图路径"""
char = self.get_character(name)
return dict(char.reference_images)
def clear_reference_images(self, name: str) -> bool:
"""清空角色的参考图路径"""
char = self.get_character(name)
char.reference_images = {}
char._raw["reference_images"] = {}
self._save()
return True
# ── 切换/注册 ──
def switch_to(self, name: str) -> bool:
"""切换到指定角色"""
if name not in self._characters:
raise KeyError(f"未找到角色: {name}")
self._active_name = name
self._save()
return True
def register(self, character_data: dict) -> Character:
"""注册新角色"""
name = character_data.get("name", "")
if not name:
raise ValueError("角色必须包含 name 字段")
self._characters[name] = Character(character_data)
if not self._active_name:
self._active_name = name
self._save()
return self._characters[name]
def delete(self, name: str) -> bool:
"""删除角色"""
if name not in self._characters:
return False
del self._characters[name]
if self._active_name == name:
self._active_name = list(self._characters.keys())[0] if self._characters else ""
self._save()
return True
# ── 持久化 ──
def _save(self):
"""保存当前状态到 registry.yaml"""
chars_dict = {}
for name, char in self._characters.items():
chars_dict[name] = char.to_dict()
data = {
"active_character": self._active_name,
"characters": chars_dict,
}
with open(self._registry_path, "w", encoding="utf-8") as f:
yaml.dump(data, f, allow_unicode=True, default_flow_style=False, sort_keys=False)
def __len__(self) -> int:
return len(self._characters)
def __repr__(self) -> str:
return f"<CharacterRegistry: {self._active_name} active, {len(self)} total>"
# ═══════════════════════════════════════════════════════════
# 独立使用入口
# ═══════════════════════════════════════════════════════════
if __name__ == "__main__":
registry = CharacterRegistry()
print(f"角色注册中心: {registry}")
print(f"活跃角色: {registry.get_active_name()}")
char = registry.get_active_character()
print(f"\n角色详情:")
print(f" 名字: {char.name}")
print(f" 描述: {char.description}")
print(f" 外观: {char.appearance}")
print(f" 性格: {char.personality}")
print(f" 音色: {char.voice_style}")
print(f" 画风: {char.art_style}")
print(f"\n角色描述块 (漫剧):")
print(char.build_prompt_block(style="manhua", expression="微笑", scene="清晨的咖啡馆"))
@@ -0,0 +1,700 @@
active_character: 阿远
characters:
小漫:
description: 活泼可爱的少女漫画家,短发,大眼睛,总是带着画板和笔
appearance:
- 短发,齐刘海
- 大眼睛,瞳孔呈深棕色
- 常穿白色连衣裙配红色蝴蝶结
- 身高约160cm,偏瘦
personality: 开朗、好奇、偶尔冒失
voice_style: 活泼少女音
art_style: 日系漫画风格,明亮色调,线条简洁
default_bgm_style: 治愈
preferred_bgm_tags:
- 治愈
- 温暖
- 轻快
reference_images:
full_body: ''
portrait: ''
expressions:
happy: ''
sad: ''
angry: ''
prompt_template:
manhua: 日系漫画风格,{character_desc},{scene_desc},表情{expression},{camera_angle}
realistic: '{character_desc},{scene_desc},表情{expression},电影级摄影,{camera_angle}'
name: 小漫
阿远:
name: 阿远
description: 一位25岁的城市程序员,黑短发,戴细框金属眼镜,身高178cm偏瘦,常穿浅灰色卫衣和深蓝色牛仔裤,性格温和内敛有点宅,但在熟悉的人面前也会露出温暖的笑容
appearance:
- 黑短发,三七分
- 细框金属眼镜,单眼皮
- 身高约178cm,偏瘦体型
- 常穿浅灰色连帽卫衣
- 戴一块简约的黑色电子手表
personality: 温和、内敛、偶尔倔强、专注、在熟悉的人面前温暖
voice_style: 温柔青年音
art_style: 日系清新漫画风格,柔和色调,线条干净
default_bgm_style: 温暖
preferred_bgm_tags:
- 温暖
- 安静
- 治愈
- 轻快
prompt_template:
manhua: 日系清新漫画风格,{character_desc},{scene_desc},表情{expression},{camera_angle}
realistic: '{character_desc},{scene_desc},表情{expression},电影级摄影风格,柔和自然光线,{camera_angle}'
reference_images:
grid: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/阿远/阿远_grid.png
portrait: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/阿远/阿远_grid_face_neutral.png
expressions:
neutral: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/阿远/阿远_grid_face_neutral.png
smile: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/阿远/阿远_grid_face_smile.png
angry: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/阿远/阿远_grid_face_angry.png
ghai_sports:
name: ghai_sports
base: 一位中国男性,约42岁,体型健壮肩宽,黑色短发利落,国字脸,单眼皮眼尾微垂,鼻梁挺直鼻翼略宽,嘴唇厚度中等嘴角微收,神态沉稳内敛,肤色健康自然
description: 一位中国男性,约42岁,体型健壮肩宽,黑色短发利落,国字脸单眼皮,神态沉稳内敛,肤色健康自然,身穿深灰色运动夹克配白色速干内衬,右耳戴着蓝色无线运动耳机。
appearance:
- 黑色短发,略长顶部,两侧收短,整洁干练
- 圆润饱满的国字脸,单眼皮
- 体型健壮,肩宽,稳重感强
- 深灰色拉链运动夹克,白色圆领速干内衬
- 右耳蓝色无线运动耳机
personality: 沉稳、专注、坚韧
voice_style: 成熟稳重男声
art_style: 写实摄影风格,运动场景,自然光线
default_bgm_style: 激励
preferred_bgm_tags:
- 激励
- 热血
- 节奏感
- 运动
sheet_mode: sport
seed: 42
reference_images:
real_photo_portrait: /Users/7kecheng/workbuddy-agent-os/agent-sync/05_tools/09_ave/scripts/character_registry/assets/ghai_sports/reference_portrait.jpg
real_photo_fullbody: /Users/7kecheng/workbuddy-agent-os/agent-sync/05_tools/09_ave/scripts/character_registry/assets/ghai_sports/reference_fullbody.png
face_anchor: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/ghai_sports/face_anchor.png
grid: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/ghai_sports/ghai_sports_grid.png
portrait: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/ghai_sports/ghai_sports_grid_face_front.png
expressions:
front: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/ghai_sports/ghai_sports_grid_face_front.png
3qL: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/ghai_sports/ghai_sports_grid_face_3qL.png
profile: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/ghai_sports/ghai_sports_grid_face_profile.png
3qR: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/ghai_sports/ghai_sports_grid_face_3qR.png
focus: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/ghai_sports/ghai_sports_grid_face_focus.png
intense: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/ghai_sports/ghai_sports_grid_face_intense.png
body:
front: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/ghai_sports/ghai_sports_grid_body_front.png
side: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_sheet/ghai_sports/ghai_sports_grid_body_side.png
seed: null
outfit_presets:
running:
outfit: 透气速干T恤和跑步短裤
accessories: 右耳戴着蓝色无线运动耳机
prompt_suffix: 晨跑场景,动态模糊,清晨自然光线
gym:
outfit: 深色运动背心和训练短裤
accessories: ''
prompt_suffix: 健身房场景,力量训练,金属器械背景,侧光
basketball:
outfit: 篮球运动背心和短裤
accessories: 运动护腕
prompt_suffix: 街头篮球场,水泥地,傍晚光线
outdoor_fitness:
outfit: 白色健身T恤和运动长裤
accessories: ''
prompt_suffix: 户外健身,单杠器械,城市公园,午后阳光
prompt_template:
realistic: '{base},{outfit},{scene_desc},{camera_angle},写实摄影风格,自然光线'
sport: '{base},{outfit},{scene_desc},运动摄影风格,高速快门,{camera_angle}'
裔年轻:
name: 裔年轻
description: 中景镜头,一位气质干净清澈的亚裔年轻男性,长相温润正派,五官端正立体,眼神真诚温暖带笑。身着燕麦色羊绒衫(袖口微微挽起)外搭深藏蓝亚麻外套,直身微侧,姿态挺拔舒展。背景是雨后湿润的江南古巷,斑驳青砖墙,脚下石板路反着水光。他一手拎着一袋用褐色纸袋包着、微微冒着热气的桂花糕,低头看向纸袋,嘴角带着温柔的笑意。
高清细节,暖色调,湿漉漉的地面映照天色,整体呈现胶片般柔和细腻的质感。
base: 中景镜头,一位气质干净清澈的亚裔年轻男性,长相温润正派,五官端正立体,眼神真诚温暖带笑。身着燕麦色羊绒衫外搭深藏蓝亚麻外套,直身微侧,姿态挺拔舒展。背景是雨后湿润的江南古巷,斑驳青砖墙,脚下石板路反着水光。他一手拎着一袋用褐色纸袋包着、微微冒着热气的桂花糕,低头看向纸袋,嘴角带着温柔的笑意。
高清细节,暖色调,湿漉漉的地面映照天色,整体呈现胶片般柔和细腻的质感
personality: 气质干净清澈的亚裔年轻男性
voice_style: 默认
art_style: 写实摄影风格
appearance:
- 中景镜头
- 一位气质干净清澈的亚裔年轻男性
- 长相温润正派
- 五官端正立体
- 眼神真诚温暖带笑
face:
shape: ''
eyes: ''
nose: ''
lips: 嘴角
hair: ''
skin: ''
facial_hair: ''
glasses: ''
distinctive: ''
body:
build: ''
height: ''
posture: 挺拔
age_group: ''
clothing:
top: 身着燕麦色羊绒衫(袖口微微挽起)外搭深藏蓝亚麻外套
inner: 背景是雨后湿润的江南古巷
bottom: ''
shoes: ''
style: ''
prompt_template:
realistic: '{base},{scene_desc},{camera_angle},写实摄影风格,自然光线'
preferred_bgm_tags:
- 温暖
reference_images:
face_anchor: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_portrait/裔年轻/front_face.png
baseline: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_portrait/裔年轻/front_face.png
body:
front: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_portrait/裔年轻/multi_angle_front.png
side: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_portrait/裔年轻/multi_angle_side.png
right_three_quarter: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_portrait/裔年轻/multi_angle_right_three_quarter.png
right_side: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_portrait/裔年轻/multi_angle_right_side.png
back: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_portrait/裔年轻/multi_angle_back.png
expressions:
neutral: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_portrait/裔年轻/expression_neutral.png
smile: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_portrait/裔年轻/expression_smile.png
focused: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_portrait/裔年轻/expression_focused.png
laugh: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_portrait/裔年轻/expression_laugh.png
serious: /Users/7kecheng/workbuddy-agent-os/agent-local/tools/ave/cache/character_portrait/裔年轻/expression_serious.png
夺:
name: 夺
description: 奇才
base: 奇才
personality: 默认
voice_style: 默认
art_style: 写实摄影风格
face:
shape: ''
eyes: ''
nose: ''
lips: ''
hair: ''
skin: ''
facial_hair: ''
glasses: ''
distinctive: ''
body:
build: ''
height: ''
posture: ''
age_group: ''
clothing:
top: ''
inner: ''
bottom: ''
shoes: ''
style: ''
中国:
name: 中国
description: '【身份】女性、青年、中国、姐三
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
base: '【身份】女性、青年、中国、姐三
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
personality: 默认
voice_style: 默认
art_style: 写实摄影风格
appearance:
- 体型:标准
face:
shape: ''
eyes: ''
nose: ''
lips: ''
hair: '【身份】女性、青年、中国、姐三
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
skin: '健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
facial_hair: ''
glasses: ''
distinctive: ''
body:
build: 标准
height: ''
posture: 自然
age_group: ''
clothing:
top: ''
inner: '【身份】女性、青年、中国、姐三
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
bottom: '【身份】女性、青年、中国、姐三
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
shoes: ''
style: ''
测试:
name: 测试
description: 测试角色
base: 测试角色
personality: 默认
voice_style: 默认
art_style: 写实摄影风格
face:
shape: ''
eyes: ''
nose: ''
lips: ''
hair: ''
skin: ''
facial_hair: ''
glasses: ''
distinctive: ''
body:
build: ''
height: ''
posture: ''
age_group: ''
clothing:
top: ''
inner: ''
bottom: ''
shoes: ''
style: ''
测试复杂:
name: 测试复杂
description: '【身份】男性、青年、中国
【面部轮廓】鹅蛋脸、清晰分明
【五官细节】丹凤眼、深褐、高挺
【头发&皮肤】短发、黑色、健康小麦'
base: '【身份】男性、青年、中国
【面部轮廓】鹅蛋脸、清晰分明
【五官细节】丹凤眼、深褐、高挺
【头发&皮肤】短发、黑色、健康小麦'
personality: 默认
voice_style: 默认
art_style: 写实摄影风格
face:
shape: ''
eyes: ''
nose: ''
lips: ''
hair: '【身份】男性、青年、中国
【面部轮廓】鹅蛋脸、清晰分明
【五官细节】丹凤眼、深褐、高挺
【头发&皮肤】短发、黑色、健康小麦'
skin: 健康小麦
facial_hair: ''
glasses: ''
distinctive: ''
body:
build: ''
height: ''
posture: ''
age_group: ''
clothing:
top: ''
inner: ''
bottom: '【身份】男性、青年、中国
【面部轮廓】鹅蛋脸、清晰分明
【五官细节】丹凤眼、深褐、高挺
【头发&皮肤】短发、黑色、健康小麦'
shoes: ''
style: ''
测试角色:
name: 测试角色
description: '【身份】男性、青年、中国
【面部轮廓】鹅蛋脸
【五官细节】丹凤眼、深褐
【头发&皮肤】短发、黑色
【体型姿态】中等、标准匀称
【服装配饰】深灰色夹克'
base: '【身份】男性、青年、中国
【面部轮廓】鹅蛋脸
【五官细节】丹凤眼、深褐
【头发&皮肤】短发、黑色
【体型姿态】中等、标准匀称
【服装配饰】深灰色夹克'
personality: 默认
voice_style: 默认
art_style: 写实摄影风格
face:
shape: ''
eyes: ''
nose: ''
lips: ''
hair: '【身份】男性、青年、中国
【面部轮廓】鹅蛋脸
【五官细节】丹凤眼、深褐
【头发&皮肤】短发、黑色
【体型姿态】中等、标准匀称
【服装配饰】深灰色夹克'
skin: ''
facial_hair: ''
glasses: ''
distinctive: ''
body:
build: 标准
height: ''
posture: ''
age_group: ''
clothing:
top: '【身份】男性、青年、中国
【面部轮廓】鹅蛋脸
【五官细节】丹凤眼、深褐
【头发&皮肤】短发、黑色
【体型姿态】中等、标准匀称
【服装配饰】深灰色夹克'
inner: ''
bottom: '【身份】男性、青年、中国
【面部轮廓】鹅蛋脸
【五官细节】丹凤眼、深褐
【头发&皮肤】短发、黑色
【体型姿态】中等、标准匀称
【服装配饰】深灰色夹克'
shoes: ''
style: ''
appearance:
- 体型:标准
- 服装:深灰色夹克
测试角色2:
name: 测试角色2
description: 测试方向描述
base: 测试方向描述
personality: 默认
voice_style: 默认
art_style: 写实摄影风格
face:
shape: ''
eyes: ''
nose: ''
lips: ''
hair: ''
skin: ''
facial_hair: ''
glasses: ''
distinctive: ''
body:
build: ''
height: ''
posture: ''
age_group: ''
clothing:
top: ''
inner: ''
bottom: ''
shoes: ''
style: ''
台湾:
name: 台湾
description: '【身份】青年、中国、少女
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
base: '【身份】青年、中国、少女
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
personality: 默认
voice_style: 默认
art_style: 写实摄影风格
appearance:
- 体型:标准
face:
shape: ''
eyes: ''
nose: ''
lips: ''
hair: '【身份】青年、中国、少女
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
skin: '健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
facial_hair: ''
glasses: ''
distinctive: ''
body:
build: 标准
height: ''
posture: 自然
age_group: ''
clothing:
top: ''
inner: '【身份】青年、中国、少女
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
bottom: '【身份】青年、中国、少女
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
shoes: ''
style: ''
test:
name: test
description: '【身份】男性
【面部】标准'
base: '【身份】男性
【面部】标准'
personality: 默认
voice_style: 默认
art_style: 写实摄影风格
appearance:
- 体型:标准
face:
shape: ''
eyes: ''
nose: ''
lips: ''
hair: ''
skin: ''
facial_hair: ''
glasses: ''
distinctive: ''
body:
build: 标准
height: ''
posture: ''
age_group: ''
clothing:
top: ''
inner: ''
bottom: ''
shoes: ''
style: ''
顺:
name: 顺
description: '【身份】女性、青年、中国、止
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
base: '【身份】女性、青年、中国、止
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
personality: 默认
voice_style: 默认
art_style: 写实摄影风格
appearance:
- 体型:标准
face:
shape: ''
eyes: ''
nose: ''
lips: ''
hair: '【身份】女性、青年、中国、止
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
skin: '健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
facial_hair: ''
glasses: ''
distinctive: ''
body:
build: 标准
height: ''
posture: 自然
age_group: ''
clothing:
top: ''
inner: '【身份】女性、青年、中国、止
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
bottom: '【身份】女性、青年、中国、止
【面部轮廓】适中自然、适中
【五官细节】深褐、高挺、适中、自然闭合
【头发&皮肤】短发、黑色、健康小麦、自然肌理、红润健康、素颜
【体型姿态】标准、挺拔
【神态&场景】柔光箱均匀布光、中焦85mm、纯灰色专业背景'
shoes: ''
style: ''
t:
name: t
description: 测试
base: 测试
personality: 默认
voice_style: 默认
art_style: 写实摄影风格
face:
shape: ''
eyes: ''
nose: ''
lips: ''
hair: ''
skin: ''
facial_hair: ''
glasses: ''
distinctive: ''
body:
build: ''
height: ''
posture: ''
age_group: ''
clothing:
top: ''
inner: ''
bottom: ''
shoes: ''
style: ''