guanghulab/video-ai-system/tools/prop002_gen_r8.py
bingshuo 28e459e93e
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 · PROP-002牌匾R8 · 修仙世界场景·灵气仙雾·冷色调 · D169
2026-07-06 14:13:39 +08:00

92 lines
4.5 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
"""PROP-002 R8 · 修仙世界场景风格 · 对齐苏白 · 灵气飘渺而非古代集市"""
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/PROP-002-TDZ-Plaque/R8"
OUT.mkdir(parents=True, exist_ok=True)
# R8: 场景要从"古代乡村集市"升级为"修仙世界"
# 加灵气/仙雾/仙侠氛围,色调偏冷清雅
P = """中国修仙世界宗门招徒摊位场景,中景。一根刻有淡淡灵纹的仙木杆竖立,顶部悬绳挂一块破旧木牌匾,牌匾上刻"天道宗"三个古朴字迹。
木牌悬在空中随风微晃,牌下空出一人空间,淡淡仙雾在脚下缭绕。远处是其他修仙宗门的气派招牌若隐若现。
场景清冷雅致,不是世俗集市,而是修仙界百宗会一角,有灵气飘渺的氛围。
木杆旁是简陋的修仙摊位——一张粗糙灵木桌,铺着淡青色粗布。
色调偏冷清雅与CHAR-003苏白V3-R4同一修仙世界体系。
3D真人向写实渲染光影清冷自然有电影感。"""
N = """古代乡村集市,世俗菜市场,地摊,杂货铺,小吃摊,民间市集,乡镇庙会。
昏黄暖色调,烛光,黄昏色调,阳光暖金黄,日落光,金色阳光。
红灯笼,喜庆装饰,彩旗,节日气氛,热闹喧嚣,人群拥挤。
现代城市,现代建筑,水泥路,柏油路,现代灯柱,钢筋柱子。
新招牌干净板子光滑抛光现代广告板霓虹灯LED招牌。
横向牌匾,横幅招牌,平放在地上,靠墙的牌子,挂在门楣。
任何其他文字(除天道宗),无关汉字,标语。
卡通渲染赛璐璐塑料感游戏低模光污染页游风廉价3D。
人物占据主画面,面孔特写。
色调过于灰暗阴森,恐怖片氛围,黑暗色调,全黑背景。"""
VARIANTS = [
"正面中景,仙木杆灵纹微光,天道宗木牌悬绳挂空,脚下仙雾缭绕,远处百宗会远景,清冷色调",
"仰视角度,天道宗牌匾悬挂半空,背景修仙宗门远山飘渺,灵气粒子漂浮,清雅仙侠画风",
"中景侧面,仙木杆竖立,天道宗旧牌悬空微晃,脚下淡淡白雾,灵木桌铺青布,色调冷雅",
"中近景,天道宗破旧木牌特写,木杆麻绳清晰,背景虚化修仙集会远景,仙侠电影感光影"
]
SEEDS = [777, 888, 999, 111]
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"PROP-002-R8-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-PROP-002-R8", "ts": ts,
"change": "R7→R8: 古代集市→修仙世界·仙雾灵气·冷色调",
"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)