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

93 lines
4.6 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-004 诸葛风 V2 · 对齐苏白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-004-ZhugeFeng/V2"
OUT.mkdir(parents=True, exist_ok=True)
# V2升级: 对齐苏白V3-R4不良人硬核写实
# 诸葛风18岁·粗麻布衣·补丁·剑眉星目·眼底有火·身形清瘦·复仇少年
P = """中国古代修仙世界复仇少年,单人全身立绘,纯白背景。
18岁男性亚洲面孔剑眉星目骨相清晰下颌线锐利苍白肤色面无血色眼底深处燃烧着压抑的仇恨之火。
身形清瘦但脊背挺直如弓弦紧绷,站姿倔强不服输。
身着粗糙灰褐色粗麻布衣,手肘膝盖处有补丁,腰间系旧布带,衣着寒酸但整洁。
双手自然垂于身侧,指甲因长期掐入掌心留下旧疤痕。
神情安静内敛,嘴唇紧抿,眼神偶尔爆发出灼烧感,不是懦弱是憋着。
真人向3D写实渲染光影清冷有层次不良人硬核写实风格。
与CHAR-003苏白V3-R4同一风格体系画面有电影级光影。"""
N = """笑容,微笑,开心,快乐表情,阳光少年,自信表情,开朗活泼。
现代服装西装T恤卫衣牛仔裤运动鞋短发染发现代发型。
干净精致偶像剧男主美颜滤镜奶油小生AI写真网红脸浓妆。
华丽服饰,丝绸锦衣,富贵公子,金线刺绣,玉佩装饰,贵气打扮。
迪士尼皮克斯可爱娃娃脸圆脸日系动漫Q版女性化。
畸形肢体,五官崩坏,模糊不清,水印,表情阴险狡猾,猥琐奸诈。
肥胖,发福,肌肉壮汉,过于健壮,过于高大。
卡通渲染塑料感游戏低模廉价3D光污染页游风。
温暖色调,金黄阳光,暖色滤镜,鲜艳色彩,高饱和度。
苏白脸,王执事脸。"""
VARIANTS = [
"正面直立,脊背挺直如弓弦,眼神压抑仇恨之火,苍白肤色粗麻布衣补丁,倔强少年",
"半侧身站立,双手自然垂放,指甲旧疤痕可见,嘴唇紧抿安静内敛,不良人写实风格",
"微侧3/4面眼底火焰般灼烧感身形清瘦但不服输粗麻衣补丁清晰电影级光影",
"正面特写感全身,剑眉星目骨相清晰,倔强神情憋着不屈服,寒酸布衣旧布带,硬核写实"
]
SEEDS = [666, 777, 888, 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] 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-004-V2-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")
json.dump({"spec": "VA-05-001-CHAR-004-V2", "ts": ts, "char": "CHAR-004-ZhugeFeng",
"change": "V1→V2: 对齐苏白V3-R4不良人硬核写实风格",
"ok": ok, "model": MODEL, "engine": "Seedream", "results": results},
open(OUT/"generation-meta.json","w",encoding="utf-8"), ensure_ascii=False, indent=2)