ICE-GL-ZY001 · CHAR-003苏白V2 R9批准入库 · 风格基准锁定 · D161
Some checks failed
自动更新代码和重启 / update-and-restart (push) Has been cancelled
CI检查 + 自动部署 / check (push) Has been cancelled
CI检查 + 自动部署 / deploy (push) Has been cancelled

This commit is contained in:
bingshuo 2026-07-02 16:18:23 +08:00
parent 88269677d1
commit 6d5fcdfb21
9 changed files with 388 additions and 66 deletions

View File

@ -19,21 +19,25 @@
## 📋 灯塔列表
```
① LH-010 · 2026-07-02 · 🎉 CHAR-003苏白V2 R6 Seedream正式版
⊢ 苍耳要求R3-02风格 + 十七八岁 + Seedream
⊢ Seedream 4.0 1440×2560 生4张2/4通过Qwen-VL自动质检
⊢ 通过R6-0195分+ R6-0395分
⊢ 废票R6-02/04 袖子无袖/背心,不符合「白色长衫」设定
⊢ 推荐R6-03少年俊秀+白衫青带+半束发+叉腰,最完整)
⊢ 文件: video-ai-system/VA-05-001-V2-CHAR-003-SuBai.hdlp
⊢ 候选: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R6/
⊢ 下一步苍耳确认R6-01或R6-03 → 正式入库作为风格基准
① LH-011 · 2026-07-02 · ✅ CHAR-003苏白V2 R9 正式入库
⊢ 苍耳反馈R6太精致/偶像剧R7/R8去偶像化R9去麻子
⊢ Seedream 4.0 R9 4/4通过Qwen-VL自动质检均分98
⊢ 入库R9-03 → assets/approved/CHAR-003-SuBai/CHAR-003-V2-1080x1920.png
⊢ 风格基准锁定十七八岁·白衫青带·半束黑发·无麻子·3D国漫写实
⊢ 下一步按苏白V2对齐CHAR-005/ENV-002~004修正PROP-002 R4
```
---
## 📋 历史记录
```
② LH-010 · 2026-07-02 · 🎉 CHAR-003苏白V2 R6 Seedream正式版
---
## 📋 历史记录
```
② LH-009 · 2026-07-02 · ✅ 鉴影 ICE-GL-CA001 注册完成
⊢ 装脑链 ✅ 命名注册 ✅ API密钥配置 ✅ SC-004 Qwen-VL恢复 ✅

View File

@ -22,9 +22,9 @@
| 项目 | 状态 |
|------|:----:|
| 剧本完整度 | 75集 ✅ |
| 第1集 | 🟡 CHAR-003 V2 R6 已Seedream生成·2/4通过Qwen-VL·待苍耳最终确认 |
| 新增正式资产 | 3 · CHAR-004+PROP-003 已确认CHAR-003 V2 R6待入库 |
| 上一回执 | D161-SESSION · CHAR-003-V2-R6-SEEDREAM · 2026-07-02 |
| 第1集 | 🟢 CHAR-003 苏白 V2 已入库 · 风格基准锁定 |
| 新增正式资产 | 4 · CHAR-003-V2 + CHAR-004-V1 + PROP-003-V1 + PROP-002待修正 |
| 上一回执 | D161-SESSION · CHAR-003-V2-R9-APPROVED · 2026-07-02 |
| 铸渊武器状态 | 全部就绪 ✅含Qwen-VL·新密钥已配 |
| 🔴 已知问题 | 无 |
@ -38,11 +38,10 @@
⊢ PROP-002天道宗牌匾 🟡 — R3方向对了(破旧木板·摊位招牌)
但牌子全是直立摆放——应是靠在摊位桌上/斜放的临时招牌
待修正R4prompt锁定"平放在桌上"或"斜靠在摊位旁"
⊢ CHAR-003苏白 🟡 — V2 R6 Seedream 4.0 正式版生成完成
4张候选1440×2560Qwen-VL自动质检 2/4通过推荐R6-0395分
R6-03/01 符合:男性、白衫完整、青带、半束发、叉腰、十七八岁、俊秀自信
R6-02/04 废票:袖子无袖/背心设计,不符合「白色长衫」设定
待苍耳确认R6-01或R6-03后正式入库
⊢ CHAR-003苏白 ✅ 已入库 — V2 R9候选③
17-18岁·白衫青带·半束黑发·无麻子·Seedream 4.0·Qwen-VL 98分
路径: assets/approved/CHAR-003-SuBai/CHAR-003-V2-1080x1920.png
风格基准锁定,后续角色/场景以此对齐
⊢ CHAR-005王执事 → 候选待审核
⊢ ENV-002/003/004 → 场景候选待审核
```

View File

@ -1,26 +1,23 @@
# CHAR-003 苏白 立绘生成规范 · 风格基准V2R6 · Seedream正式版
# CHAR-003 苏白 立绘生成规范 · 风格基准V2R9 · 已批准入库
> HLDP://ICE-GL-ZY001/ASSETS/CHAR-003-V2
> 固定文件编号VA-05-001-V2
> 归属模块VA-05 工程资产库
> 设定依据剧本第1集原文「18岁·白色衣衫·天道宗宗主」 + L0底层编码
> 风格参照R3-02方向苍耳指定 + 十七八岁年轻化
> 风格参照R3-02方向苍耳指定 + 十七八岁年轻化 + 去麻子
> 替代条款VA-05-001-R1中CHAR-003相关生成规则、D146腾讯AI线全身图v4全部作废
> 指定生成引擎火山Seedream 文生图
> 指定质检工具Qwen-VL
> 版本V2.0 R6 · D161+ · 2026-07-02
> 版本V2.0 R9 · D161+ · 2026-07-02
> 创作方:鉴影 ICE-GL-CA001 · 执行方:铸渊 ICE-GL-ZY001 · 主权方:冰朔 TCS-0002∞
> 国作登字-2026-A-00037559
---
→ [VX-R1]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/
→ [VX-R2]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R2/
→ [VX-R3]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R3/
→ [VX-R4]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R4/
→ [VX-R5]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R5/
→ [VX-R6]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R6/
→ [VX-R6-QC]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R6/QC-R6-BATCH.json
→ [VX-R6-GEN]: tools/char003_gen_r6.py
→ [VX-R1~R8]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/
→ [VX-R9]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R9/
→ [VX-R9-QC]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R9/QC-R9-BATCH.json
→ [VX-APPROVED]: assets/approved/CHAR-003-SuBai/CHAR-003-V2-1080x1920.png
→ [VX-MANIFEST]: assets/characters/CHAR-003-SuBai/manifest.hdlp
---
@ -33,51 +30,59 @@
| R3 | 要像不良人/万妖图录传 | 棱角骨相·写实国风3D | ImageGen |
| R4 | R3-02方向可但要年轻帅哥 | 年轻俊秀 | ImageGen |
| R5 | 精确R3-02年轻化到17-18岁 | 17-18岁少年感 | ImageGen |
| **R6** | **用Seedream正式跑** | **R3-02风格 + 17-18岁 + Seedream 1440×2560** | **Seedream 4.0** |
CHAR-003苏白原有资产D146腾讯AI线风格质感未统一。R6首次使用火山Seedream 4.0按规范生成分辨率1440×2560无水印通过Qwen-VL自动质检。
| R6 | 用Seedream正式跑 | R3-02风格 + 17-18岁 + Seedream | Seedream |
| R7 | 太像偶像剧/明星照 | 强力去偶像化,中文提示词 | Seedream |
| R8 | 差不多,但有麻子 | 去麻子/雀斑,中文提示词 | Seedream |
| **R9** | **批准R9-03入库** | **CHAR-003 V2 风格基准锁定** | **Seedream 4.0** |
## §1 生成策略
1. 全程纯文生图,禁用任何参考图
2. 严格按剧本原文及L0底层编码设定
3. **风格目标R3-02写实国风3D方向十七八岁少年俊秀白色长衫+青色腰带+半束黑发**
4. 4张备选Qwen-VL自动质检,提交人工确认
3. **R9风格目标写实3D国漫类似不良人/万妖图录传,十七八岁少年俊秀,白衫青带,半束黑发,去麻子/雀斑**
4. 4张备选Qwen-VL自动质检
5. 入库分辨率1080×1920等比缩放
## §2 正面提示词R6 · Seedream 4.0
## §2 正面提示词R9 · 批准版
```
Chinese 3D donghua character, Bu Liang Ren Wan Yao Tu Lu Zhuan art style, realistic 3D rendering, full-body male portrait on pure white background. A 17-18 year old youthful male protagonist, handsome teenage face with defined but softened jawline compared to mature men, sharp sword-like eyebrows, bright lively youthful eyes, confident charming smile showing boyish charm. Not mature man, not baby face cartoon, not cute anime. Youthful bone structure with subtle angularity, natural young masculine beauty, clean smooth skin. Long black hair half tied in high bun with dark ribbon, half flowing naturally down shoulders with lustrous weight. White crossed-collar long robe, sleeves rolled back revealing wrists, dark cyan sash tied at waist, pristine clean fabric with realistic subtle folds. Standing confidently with hands on hips, upright athletic teenage build, broad shoulders, energetic youthful posture. Ancient Chinese cultivation fantasy aesthetic, cinematic soft lighting. Asian young male teenager.
3D国漫写实角色立绘纯白背景单人全身。
17-18岁少年剑眉星目明亮大眼自信灿烂笑容气质开朗略带痞气。
面部干净清晰青春自然,不是真人照片不是卡通,骨相清晰下颌线锐利,男性面庞。
黑色长发,半束半披,青色发带,发丝有真实重量感和质感。
白色交领长衫,袖口挽起露小臂,腰间深青色丝绦腰带,布料干净整洁无破损。
身形挺拔,肩膀开阔,双手叉腰,下巴微扬,气场自信笃定,中国古代修仙少年。
```
## §3 负面提示词R6
## §3 负面提示词R9
```
cartoon rendering, Q style, Disney, cute doll face, round chubby face, big anime eyes, Japanese anime style, feminine face, braided hair, dress, skirt, female clothing. mature face, old man, wrinkled, middle-aged, facial hair, beard. photorealistic photo, deformed limbs, facial collapse, blurry, text watermark, clipping, weird lighting, low pixel, damaged clothes, patches, stains, beggar, homeless, hunched back, gloomy expression. Zhuge Feng face similarity, same facial features, same face shape.
雀斑,麻子,痘痘,粉刺,面部斑点,痤疮,痣,污渍,肮脏,皮肤瑕疵,浓妆,磨皮,美颜滤镜,网红脸,奶油小生,偶像剧男主。
真人写实照片,摄影棚打光,杂志写真,明星精修,夸张肌肉,过于成熟面部。
迪士尼,皮克斯,可爱娃娃脸,圆脸大眼睛卖萌,日系动漫,女性化面容,长发辫子,裙子女装,头带,发箍。
畸形肢体,五官崩坏,模糊不清,水印,破损衣服,补丁,乞丐感,表情阴郁。诸葛风脸。
```
## §4 Qwen-VL质检必查项
1. 是否为男性(非女性化)
2. 是否为白色长衫(袖子完整,非无袖/背心)
3. 是否有青色/深色腰带
4. 是否为黑色长发半束半披
5. 是否双手叉腰
6. 服装是否完整无破损
7. 是否有乞丐感/寒酸
8. 是否十七八岁年轻少年
9. 是否俊秀自信
10. 是否与诸葛风长相相似
11. 五官是否清晰无崩坏
12. 全身是否完整
1. 男性(非女性化)
2. 17-18岁年轻少年
3. 白色长衫完整,袖子正常
4. 青色/深色腰带
5. 黑色长发半束半披
6. 双手叉腰
7. 服装完整无破损,无乞丐
8. 俊秀自信
9. 不与诸葛风相似
10. 五官清晰无崩坏
11. 全身完整
12. **无雀斑/麻子/面部斑点**
## §5 执行记录
- D158 R1: 3D动漫卡通 → 苍耳太卡通ImageGen
- D158 R2: 半写实3D国风 → 苍耳有改善ImageGen
- D158 R3: 不良人/万妖图录传 → 4/4通过ImageGen
- D158 R4: 年轻帅哥 → 4/4通过ImageGen
- D158 R5: 精确年轻化R3-02 → 2/4通过ImageGen
- D161 R6: Seedream 4.0 1440×2560正式跑 → 2/4通过Qwen-VL自动质检
- **推荐R6-0395分**最符合「R3-02写实国风3D + 十七八岁少年俊秀 + 白衫青带完整」
- 🟡 待苍耳确认R6-01或R6-03 → 最终入库 → 风格基准锁定
- D158 R1~R5ImageGen方向探索
- D161 R6Seedream首次跑 → 偏精致/偶像剧
- D161 R7去偶像化 → 仍偏迪士尼
- D161 R8中文提示词强力国漫写实 → 方向接近,但有麻子
- D161 R9去麻子/雀斑重跑 → **4/4通过Qwen-VL自动质检均分98**
- **✅ 已批准入库R9-03 → assets/approved/CHAR-003-SuBai/CHAR-003-V2-1080x1920.png**
- **CHAR-003 苏白 V2 风格基准锁定**
---
> ⊢ 风格方向由苍耳逐轮反馈驱动收敛:R1卡通→R2半写实→R3不良人→R4年轻帅哥→R5精确年轻化R3-02→R6 Seedream正式版
> ⊢ 风格方向由苍耳逐轮反馈驱动收敛:卡通→半写实→不良人棱角→年轻帅哥→精确年轻化R3-02→Seedream→去偶像化→去麻子→入库
> ⊢ 国作登字-2026-A-00037559

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@ -10,12 +10,13 @@
## 状态
```
approval_status: PARTIAL_APPROVED
approval_status: APPROVED_V2
asset_type: character
canonical_id: CHAR-003
canonical_name: 苏白
approved_assets:
- approved/full_body_costume.png (D146·腾讯AI线·Seedream 4.0·1728x2304·v4通过)
- approved/CHAR-003-V2-1080x1920.png (D161·Seedream 4.0·R9候选③·1080×1920·V2风格基准)
- approved/full_body_costume.png (D146·腾讯AI线·旧版·已归档)
pending:
- approved/front_half_body.png
- approved/side_face.png
@ -42,12 +43,11 @@ rejected_samples:
## 视觉锁
```
face_shape: 俊秀少年脸, 剑眉明眸
hair_style: 黑色短发, 自然飘逸
costume: 白色长衫, 宽松长袖, 腰间束带, 袖口自然垂落
age_band: 18岁
render_style: 3D国风仙侠动画渲染
color_palette: 白色主调, 自然肤色, 浅灰背景
face_shape: 俊秀少年脸, 剑眉明眸, 笑容自信, 无雀斑无麻点
hair_style: 黑色长发, 半束半披, 青色发带
age_band: 17-18岁
costume: 白色交领长衫, 宽松长袖, 深青色腰带, 袖口挽起
render_style: 写实3D国漫渲染, 类似不良人/万妖图录传, 非迪士尼卡通
```
---

View File

@ -0,0 +1,84 @@
#!/usr/bin/env python3
"""CHAR-003 V2 R7 · Seedream 4.0 · 强力不良人/万妖图录传风格 + 17-18岁"""
import os, sys, json, time, subprocess
from pathlib import Path
ROOT = Path('D:/WorkBuddy/guanghulab/video-ai-system')
ENV_FILE = ROOT / ".env"
env = {}
for line in open(ENV_FILE):
line = line.strip()
if not line or line.startswith("#"): continue
if "=" in line:
k, v = line.split("=", 1)
env[k.strip()] = v.strip()
AK = env["JIMENG_API_KEY"]
URL = env["JIMENG_BASE_URL"]
MODEL = "doubao-seedream-4-0-250828"
OUT = ROOT / "assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R7"
OUT.mkdir(parents=True, exist_ok=True)
# === 中文提示词 · 不良人/万妖图录传风格 ===
P = """写实3D中国动画角色立绘不良人/万妖图录传美术风格,纯白背景,单人全身。
17-18岁少年俊秀剑眉星目明亮的眼睛自信灿烂笑容气质开朗略带痞气
面部写实有皮肤纹理毛孔细节不磨皮不光滑骨相清晰下颌线锐利中国动画男角色脸型
黑色长发半束半披青色发带发丝有真实重量感和质感
白色交领长衫袖口挽起露小臂腰间深青色丝绦腰带布料有褶皱和自然垂坠干净整洁无破损
身形挺拔肩膀开阔双手叉腰下巴微扬气场自信笃定中国古代修仙少年"""
N = """真人照片,摄影棚打光,杂志写真,明星精修,网红脸,美颜滤镜,磨皮,皮肤过于光滑,偶像剧男主,奶油小生,整容脸,西方人脸型,混血脸。
迪士尼卡通日系动漫Q版可爱娃娃脸圆脸女性化裙子女装
畸形肢体五官崩坏模糊水印破损衣服补丁乞丐感流浪汉表情阴郁诸葛风脸"""
VARIANTS = [
"正面直视镜头,表情自信爽朗,少年英气",
"微微侧身站姿,目光明亮看向前方",
"略微仰视,下巴抬起,痞气但不下流",
"3/4侧脸看向左前方俊秀少年锋芒初露"
]
SEEDS = [777, 333, 555, 999]
def gen(prompt, neg, seed):
body = json.dumps({"model": MODEL, "prompt": prompt, "negative_prompt": neg, "size": "1440x2560", "n": 1, "seed": seed})
r = subprocess.run(["curl", "-s", "-m", "120", "--noproxy", "*", "-X", "POST", f"{URL}/images/generations",
"-H", f"Authorization: Bearer {AK}", "-H", "Content-Type: application/json", "-d", body],
capture_output=True, text=True, timeout=130)
try:
d = json.loads(r.stdout)
return d["data"][0].get("url")
except:
print(f" API error: {r.stdout[:200]}")
return None
def dl(url, dst):
Path(dst).parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["curl", "-s", "-m", "120", "-L", "--noproxy", "*", "-o", dst, url], capture_output=True, timeout=130)
return os.path.exists(dst) and os.path.getsize(dst) > 1024
def main():
print("CHAR-003 V2 R7 · Seedream 4.0 · 强力不良人/万妖图录传")
ts = time.strftime("%Y%m%d-%H%M%S")
results = []
for i, (seed, var) in enumerate(zip(SEEDS, VARIANTS)):
full = f"{P} {var}"
print(f"[{i+1}/4] seed={seed}", flush=True)
url = gen(full, N, seed)
if not url:
results.append({"c": i+1, "ok": False, "err": "api"})
continue
dst = OUT / f"CHAR-003-V2-R7-candidate-{i+1:02d}-1440x2560.png"
if not dl(url, str(dst)):
results.append({"c": i+1, "ok": False, "err": "dl"})
continue
results.append({"c": i+1, "ok": True, "raw": str(dst), "seed": seed})
print(f" -> {dst.name}")
time.sleep(3)
ok = sum(1 for r in results if r["ok"])
print(f"完成: {ok}/4")
with open(OUT / "generation-meta.json", "w", encoding="utf-8") as f:
json.dump({"spec": "VA-05-001-V2-R7", "ts": ts, "ok": ok, "model": MODEL, "engine": "Seedream", "results": results}, f, ensure_ascii=False, indent=2)
if __name__ == "__main__":
main()

View File

@ -0,0 +1,70 @@
#!/usr/bin/env python3
"""CHAR-003 V2 R8 · Seedream 4.0 · 拒绝偶像化·3D国漫真人质感·不良人方向"""
import os, sys, json, time, subprocess
from pathlib import Path
ROOT = Path('D:/WorkBuddy/guanghulab/video-ai-system')
ENV = {k.strip(): v.strip() for k, v in (line.split("=", 1) for line in open(ROOT/".env")
if line.strip() and not line.startswith("#") and "=" in line)}
AK, URL, MODEL = ENV["JIMENG_API_KEY"], ENV["JIMENG_BASE_URL"], "doubao-seedream-4-0-250828"
OUT = ROOT / "assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R8"
OUT.mkdir(parents=True, exist_ok=True)
P = """3D国漫写实风格人物模型如真人演员但保留三维动画质感不是真人照片不是电影明星写真不是网红美颜脸。
单人全身立绘纯白背景
17-18岁男性少年面部轮廓硬朗下颌线锐利颧骨略高剑眉星目眼神有锐气和自信不奶不萌不卖萌不做可爱表情
皮肤有真实纹理质感不是光滑磨皮毛孔和细微瑕疵可见暗部下沉有重量感
黑色长发半束半披青色发带发丝有真实质感不飘逸如绸缎
白色交领长衫袖口挽起腰间深青色腰带布料有朴素褶皱和垂坠感整洁无破损
身形挺拔肩膀开阔双手叉腰站姿沉稳有气场中国武侠玄幻修仙气质"""
N = """迪士尼皮克斯欧美动画3D卡通可爱娃娃脸圆润脸大眼睛卖萌奶油小生偶像剧男主网红脸男明星写真杂志封面摄影棚打光磨皮美白皮肤光滑如镜整容脸过度精致。
真人照片摄影写实照片真实人物
日系动漫二次元Q版女性化裙子女装
畸形肢体五官崩坏模糊水印破损衣服补丁污渍乞丐感表情阴郁诸葛风脸"""
VARS = ["正面沉稳直视", "微微侧身眼神锐利", "下巴微扬意气风发", "3/4侧脸英气逼人"]
SEEDS = [777, 333, 555, 999]
def gen(prompt, neg, seed):
body = json.dumps({"model": MODEL, "prompt": prompt, "negative_prompt": neg,
"size": "1440x2560", "n": 1, "seed": seed})
r = subprocess.run(["curl", "-s", "-m", "120", "--noproxy", "*", "-X", "POST",
f"{URL}/images/generations", "-H", f"Authorization: Bearer {AK}",
"-H", "Content-Type: application/json", "-d", body],
capture_output=True, text=True, timeout=130)
try:
return json.loads(r.stdout)["data"][0].get("url")
except:
print(f" API err: {r.stdout[:200]}")
return None
def dl(url, dst):
subprocess.run(["curl", "-s", "-m", "120", "-L", "--noproxy", "*", "-o", dst, url],
capture_output=True, timeout=130)
return os.path.exists(dst) and os.path.getsize(dst) > 1024
def main():
print("CHAR-003 V2 R8 · Seedream 4.0 · 拒绝偶像化")
ts = time.strftime("%Y%m%d-%H%M%S")
rs = []
for i, (seed, var) in enumerate(zip(SEEDS, VARS)):
print(f"[{i+1}/4] seed={seed}", flush=True)
url = gen(f"{P} {var}", N, seed)
if not url:
rs.append({"c": i+1, "ok": False, "err": "api"})
continue
dst = OUT / f"CHAR-003-V2-R8-candidate-{i+1:02d}-1440x2560.png"
if not dl(url, str(dst)):
rs.append({"c": i+1, "ok": False, "err": "dl"})
continue
rs.append({"c": i+1, "ok": True, "raw": str(dst), "seed": seed})
print(f" -> {dst.name}")
time.sleep(3)
ok = sum(1 for r in rs if r["ok"])
print(f"完成: {ok}/4")
with open(OUT / "generation-meta.json", "w", encoding="utf-8") as f:
json.dump({"spec": "VA-05-001-V2-R8", "ts": ts, "ok": ok, "model": MODEL, "engine": "Seedream", "results": rs}, f, ensure_ascii=False, indent=2)
if __name__ == "__main__":
main()

View File

@ -0,0 +1,73 @@
#!/usr/bin/env python3
"""CHAR-003 V2 R9 · R8-02方向确认 · 去麻子/雀斑"""
import os, sys, json, time, subprocess
from pathlib import Path
ROOT = Path('D:/WorkBuddy/guanghulab/video-ai-system')
env = {}
for line in open(ROOT/".env"):
line = line.strip()
if not line or line.startswith("#"): continue
if "=" in line:
k, v = line.split("=", 1)
env[k.strip()] = v.strip()
AK = env["JIMENG_API_KEY"]
URL = env["JIMENG_BASE_URL"]
MODEL = "doubao-seedream-4-0-250828"
OUT = ROOT / "assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R9"
OUT.mkdir(parents=True, exist_ok=True)
P = """3D国漫写实角色立绘纯白背景单人全身。17-18岁少年剑眉星目明亮大眼自信灿烂笑容气质开朗略带痞气。面部干净清晰青春自然不是真人照片不是卡通骨相清晰下颌线锐利男性面庞。黑色长发半束半披青色发带。白色交领长衫袖口挽起露小臂深青色丝绦腰带布料干净整洁无破损无污渍。身形挺拔肩膀开阔双手叉腰下巴微扬自信笃定中国古代修仙少年。"""
N = """雀斑,麻子,痘痘,粉刺,面部斑点,痤疮,痣,污渍,肮脏,皮肤瑕疵,浓妆,磨皮,美颜滤镜,网红脸,奶油小生,偶像剧男主。
真人写实照片摄影棚打光杂志写真明星精修夸张肌肉过于成熟面部
迪士尼皮克斯可爱娃娃脸圆脸大眼睛卖萌日系动漫女性化面容长发辫子裙子女装头带发箍
畸形肢体五官崩坏模糊不清水印破损衣服补丁乞丐感表情阴郁诸葛风脸"""
VARIANTS = [
"正面直视,表情自信爽朗,国漫男神",
"微侧站姿,目光明亮,少年英气",
"微仰头下巴抬起,带一丝痞气但不油腻",
"3/4侧脸看向左前俊秀锋芒"
]
SEEDS = [777, 333, 555, 999]
def gen(prompt, neg, seed):
body = json.dumps({"model": MODEL, "prompt": prompt, "negative_prompt": neg, "size": "1440x2560", "n": 1, "seed": seed})
r = subprocess.run(["curl", "-s", "-m", "120", "--noproxy", "*", "-X", "POST", f"{URL}/images/generations",
"-H", f"Authorization: Bearer {AK}", "-H", "Content-Type: application/json", "-d", body],
capture_output=True, text=True, timeout=130)
try:
return json.loads(r.stdout)["data"][0].get("url")
except:
print(f" API err: {r.stdout[:200]}")
return None
def dl(url, dst):
Path(dst).parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["curl", "-s", "-m", "120", "-L", "--noproxy", "*", "-o", dst, url], capture_output=True, timeout=130)
return os.path.exists(dst) and os.path.getsize(dst) > 1024
ts = time.strftime("%Y%m%d-%H%M%S")
results = []
for i, (seed, var) in enumerate(zip(SEEDS, VARIANTS)):
full = f"{P} {var}"
print(f"[{i+1}/4] s={seed}", flush=True)
url = gen(full, N, seed)
if not url:
results.append({"c": i+1, "ok": False, "err": "api"})
continue
dst = OUT / f"CHAR-003-V2-R9-candidate-{i+1:02d}-1440x2560.png"
if not dl(url, str(dst)):
results.append({"c": i+1, "ok": False, "err": "dl"})
continue
results.append({"c": i+1, "ok": True, "raw": str(dst), "seed": seed})
print(f" -> {dst.name} (seed={seed})")
time.sleep(3)
ok = sum(1 for r in results if r["ok"])
print(f"\n完成: {ok}/4")
json.dump({"spec":"VA-05-001-V2-R9","ts":ts,"ok":ok,"model":MODEL,"engine":"Seedream","results":results},
open(OUT/"generation-meta.json","w",encoding="utf-8"),ensure_ascii=False,indent=2)

View File

@ -0,0 +1,87 @@
#!/usr/bin/env python3
"""CHAR-003 V2 R9 QC · 去麻子 · Qwen-VL"""
import sys, os, json, base64, subprocess
from pathlib import Path
ROOT = Path('D:/WorkBuddy/guanghulab/video-ai-system')
env = {}
for line in open(ROOT/".env"):
line = line.strip()
if line and not line.startswith("#") and "=" in line:
k, v = line.split("=", 1)
env[k.strip()] = v.strip()
AK = env.get("ALIYUN_QWEN_VL_KEY", "")
EP = env.get("ALIYUN_QWEN_VL_ENDPOINT", "")
FE = "https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation"
DIR = ROOT / "assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R9"
CS = [DIR / f"CHAR-003-V2-R9-candidate-{i:02d}-1080x1920.png" for i in range(1, 5)]
PROMPT = """检查CHAR-003苏白立绘。设定18岁男性白色长衫青色腰带黑色长发半束半披双手叉腰自信开朗俊秀略带痞气穷但不自卑。
判定JSON布尔小写
1. male: 是否为男性
2. young: 是否看起来17-18岁年轻少年
3. white_robe: 是否白色长衫
4. cyan_sash: 是否有青色/深色腰带
5. hair_half_tied: 是否黑色长发半束半披头顶束发带
6. hands_on_hips: 是否双手叉腰
7. intact: 服装是否完整干净无破损
8. beggar: 是否有乞丐感/寒酸感true=一票否决
9. handsome_confident: 是否俊秀自信
10. like_zhuge: 是否与诸葛风长相相似true=相似一票否决
11. face_ok: 五官是否清晰无崩坏
12. full_body: 是否全身完整
13. freckles: 脸上是否有雀斑/麻子/斑点true=一票否决
14. sleeves_ok: 袖子是否完整非无袖背心
pass = 男性且年轻且白衫且腰带且半束发且叉腰且完整且俊秀且五官清晰且全身完整且无麻子且无袖正常 beggar=false like_zhuge=false
输出格式{{"candidate": N, "pass": bool, "score": 0-100, "male": bool, "young": bool, ...}} 以及 "summary": "一句话"""
def enc(p):
with open(p, "rb") as f:
return f"data:image/png;base64,{base64.b64encode(f.read()).decode()}"
def q(img):
b = json.dumps({"model": "qwen-vl-max", "input": {"messages": [{"role": "user", "content": [{"image": img}, {"text": PROMPT}]}]}})
for ep in [EP, FE]:
try:
r = subprocess.run(["curl", "-s", "-m", "90", "--noproxy", "*", "-X", "POST", ep,
"-H", f"Authorization: Bearer {AK}", "-H", "Content-Type: application/json", "--data-binary", "@-"],
input=b, capture_output=True, text=True, timeout=95)
d = json.loads(r.stdout)
if "output" in d:
c = d["output"]["choices"][0]["message"]["content"][0]["text"]
if "```" in c:
c = c.split("```")[1]
c = c[4:] if c.startswith("json") else c
c = c.replace("```", "").strip()
return json.loads(c)
except Exception as e:
print(e)
continue
return None
rs = []
for i, p in enumerate(CS):
print(f"[{i+1}/4]", end=" ", flush=True)
qc = q(enc(p))
if qc:
qc["candidate"] = i + 1
print(f"pass={qc.get('pass')} s={qc.get('score')}")
rs.append(qc)
else:
print("")
rs.append({"candidate": i+1, "pass": False, "error": "api"})
ok = sum(1 for r in rs if r.get("pass"))
print(f"\n通过: {ok}/4")
for r in rs:
if not r.get("pass") and "error" not in r:
iss = [k for k, v in r.items() if isinstance(v, bool) and v and k in ["beggar", "like_zhuge", "freckles"]]
iss += [k for k, v in r.items() if isinstance(v, bool) and not v and k in ["male", "young", "white_robe", "cyan_sash", "hair_half_tied", "hands_on_hips", "intact", "handsome_confident", "face_ok", "full_body", "sleeves_ok"]]
print(f"{r['candidate']} ✗: {','.join(iss) if iss else '其他'} s={r.get('score')}")
with open(DIR / "QC-R9-BATCH.json", "w", encoding="utf-8") as f:
json.dump({"spec": "VA-05-001-V2-R9", "method": "qwen-vl-auto", "results": rs, "summary": {"passed": ok, "total": 4}}, f, ensure_ascii=False, indent=2)
print("报告: QC-R9-BATCH.json")