guanghulab/video-ai-system/tools/char005_gen_v1_r2.py
bingshuo 5f7e8f8506
Some checks failed
自动更新代码和重启 / update-and-restart (push) Has been cancelled
CI检查 + 自动部署 / check (push) Has been cancelled
CI检查 + 自动部署 / deploy (push) Has been cancelled
ICE-GL-ZY001 · CHAR-005王执事V1-R2 · 强化修仙世界感·灵力卷轴+灵纹执事袍 · D169
2026-07-06 10:26:35 +08:00

95 lines
4.8 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 王执事 V1-R2 · 修仙世界感强化 · 对齐苏白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/R2"
OUT.mkdir(parents=True, exist_ok=True)
# R2修正R1太像古代官吏/书生 → 加修仙世界元素
# 1. 服饰:蓝袍加灵力刺绣纹样、腰间挂身份玉牌(非毛笔)
# 2. 道具:鉴定册→灵力卷轴/玉简
# 3. 氛围:修仙宗门执事感而非古代官吏
P = """中国古代修仙宗门执事,单人全身立绘,淡灰白背景。
中年男性约40岁亚洲面孔骨相清晰面部有岁月痕迹眉毛微挑傲慢神情嘴角微抿带一丝不屑冷笑眼神冷漠势利。
身着蓝色灵霄宗执事长袍,衣领袖口镶银色灵力纹绣,腰间束暗蓝丝绦带,悬挂灵霄宗执事身份玉牌。
一手持灵力卷轴玉简(散发淡淡微光),一手握朱砂灵笔,站姿端正微仰下巴,目中无人的宗门执事傲气。
修仙世界中年修炼者,面容有灵力修炼留下的细微痕迹。
真人向3D写实渲染光影厚重自然不良人万妖图录传硬核写实风格。
风格对齐CHAR-003苏白V3-R4同一修仙世界观体系画面有电影级光影。"""
N = """现代服装西装衬衫领带短发染发现代眼镜手机钢笔圆珠笔现代办公桌A4纸文件夹。
古代官服,官帽,乌纱帽,朝服,补子,科举考场,文房四宝(毛笔/砚台/墨块/宣纸全套),古代官吏,书吏。
迪士尼皮克斯可爱娃娃脸圆脸日系动漫Q版女性化。
畸形肢体,五官崩坏,模糊不清,水印,破损衣服,乞丐感,破布烂衫。
表情友好,微笑,和善,慈祥,笑容,热情,善良,友好可亲。
过于苍老白胡子老头70岁以上衰弱老迈。
过于年轻20岁以下少年青年偶像。
卡通渲染塑料感游戏低模廉价3D光污染特效浮夸光环仙侠页游风土味光效。
苏白脸,诸葛风脸。"""
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-R2-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-R2", "ts": ts, "char": "CHAR-005-WangZhiShi",
"change": "R1→R2: 强化修仙世界感·灵力卷轴替换鉴定册·蓝袍加灵纹·挂玉牌",
"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)