feat(monitor): 抖音 Web 接口客户端 —— 绕开爬虫子进程,直接发 HTTP
移植自 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:
@@ -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: ''
|
||||
Reference in New Issue
Block a user