guanghulab/video-ai-system/tools/char003_v3_gen.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

96 lines
4.9 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-003 V3 · 苏白宗主风格重塑 · 不良人/万妖图录传写实风 · 仙风道骨"""
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/D163-VA-05-001-V3/CHAR-003-SuBai"
OUT.mkdir(parents=True, exist_ok=True)
# V3核心变更:
# 1. 风格: 3D国漫写实 → 不良人/万妖图录传真人向3D
# 更写实质感、皮肤真实、光影厚重、布料有重量
# 2. 气质: 少年痞气 → 年轻宗主·仙风道骨
# 内敛的笃定、不怒自威、飘逸但不浮夸
# 3. 年龄感: 仍保持18岁但更沉稳
# 4. 服饰: 白色交领长衫不变,但要有宗主服的质感
P = """中国古代仙侠年轻宗主,单人全身立绘,纯白背景。
18岁男性亚洲面孔五官清俊英挺剑眉星目眼神深邃内敛而笃定嘴角微扬带一丝淡然笑意。
年轻但气质沉稳,有不怒自威的宗主气度,仙风道骨,飘逸而不浮夸。
黑色长发半束半披,青色发带飘逸。
白色交领长衫,外罩轻薄青色纱质外袍,腰间束深青色丝绦玉带,衣袂自然垂落有重量感,布料纹理清晰有质感。
双手自然负于身后,身姿挺拔如松,下巴微收,目光平视。
真人向3D写实渲染光影厚重自然皮肤真实有质感不良人万妖图录传风格中国古代修仙写实画面有电影感。"""
N = """雀斑,麻子,痘痘,粉刺,面部斑点,痣,污渍,肮脏,皮肤瑕疵,浓妆,磨皮,美颜滤镜,网红脸,奶油小生,偶像剧男主。
真人写实照片,摄影棚打光,杂志写真,现代服装,西装,短发,染发,现代发型。
迪士尼皮克斯可爱娃娃脸圆脸大眼睛卖萌日系动漫Q版女性化面容长发辫子裙子女装头带。
畸形肢体,五官崩坏,模糊不清,水印,破损衣服,补丁,乞丐感,表情阴郁,凶狠愤怒。诸葛风脸。
过度油腻,头发油光,面部浮肿,双下巴,胡子。
过于苍老,中年大叔,白胡子老头,皱纹过多,衰老感。
卡通渲染塑料感游戏低模低多边形廉价3D光污染特效浮夸光环仙侠页游风土味特效。"""
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[: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)
print(f" Prompt: {full[:120]}...")
url = gen(full, N, seed)
if not url:
results.append({"c": i+1, "ok": False, "err": "api"})
continue
dst = OUT / f"CHAR-003-V3-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} (seed={seed})")
time.sleep(3)
ok = sum(1 for r in results if r["ok"])
print(f"\n完成: {ok}/4")
meta = {"spec": "VA-05-001-V3", "ts": ts, "char": "CHAR-003-SuBai",
"style": "不良人/万妖图录传·真人向3D写实·仙风道骨",
"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)