guanghulab/video-ai-system/tools/char005_gen_v1.py
Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

91 lines
4.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""CHAR-005 王执事 · 对齐CHAR-003苏白V3-R4风格基准 · 不良人硬核写实"""
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/D169-VA-05-001/CHAR-005-WangZhiShi"
OUT.mkdir(parents=True, exist_ok=True)
# 风格基准: CHAR-003 V3-R4 (不良人/万妖图录传硬核写实)
# 角色定义: 灵霄宗招生执事·中年男性·蓝色执事服·冷漠势利
# 镜号: 镜04/06/07
P = """中国古代修仙宗门执事,单人全身立绘,纯白背景。
中年男性约40岁亚洲面孔骨相清晰面部有岁月痕迹眉毛微挑傲慢神情嘴角微抿带一丝冷笑眼神冷漠势利看人下菜碟。
身着蓝色灵霄宗执事长袍,胸前别执事徽章,腰间束带,衣料质地考究但不浮夸。
一手持毛笔一手拿鉴定册,站姿端正,下巴微抬目中无人,一股高人一等的傲慢。
真人向3D写实渲染光影厚重自然皮肤有真实质感不良人万妖图录传硬核写实风格。
与中国古代修仙年轻宗主苏白同风格体系CHAR-003-V3-R4画面有电影级光影。"""
N = """雀斑,麻子,痘痘,粉刺,面部斑点,痣,磨皮,美颜滤镜,网红脸,奶油小生,偶像剧。
现代服装,西装,短发,染发,现代眼镜,现代道具,手机,钢笔。
迪士尼皮克斯可爱娃娃脸圆脸日系动漫Q版女性化。
畸形肢体,五官崩坏,模糊不清,水印,破损衣服,乞丐感。
表情友好,微笑,和善,慈祥,友好,热情,善良。
过于苍老白胡子老头皱纹过多70岁以上。
卡通渲染塑料感游戏低模低多边形廉价3D光污染特效仙侠页游风。
苏白脸年轻少年18岁青年。"""
VARIANTS = [
"正面直立,一手持笔一手拿册,下巴微抬,眼神冷漠傲慢,蓝色执事服徽章清晰",
"半侧身站立,低头看手中鉴定册,嘴角冷笑,势利刻薄,有电影级光影",
"正面微侧,抬眉毛挑审视前方,执事服考究,骨相清晰中年男性",
"半侧身面带审视,手握鉴定册,蓝色执事袍衣纹可见,写实质感面部纹理"
]
SEEDS = [101, 213, 337, 449]
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[:300]}")
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] 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-005-V1-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, "variant": var})
print(f" -> {dst.name}")
time.sleep(3)
ok = sum(1 for r in results if r["ok"])
print(f"\n完成: {ok}/4")
meta = {"spec": "VA-05-001-CHAR-005-V1", "ts": ts, "char": "CHAR-005-WangZhiShi",
"style": "对齐CHAR-003 V3-R4 · 不良人硬核写实",
"ok": ok, "model": MODEL, "engine": "Seedream",
"results": results}
json.dump(meta, open(OUT/"generation-meta.json","w",encoding="utf-8"), ensure_ascii=False, indent=2)