guanghulab/video-ai-system/tools/prop002_gen_r5.py
bingshuo 0e47c7cdaa
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牌匾R5 · 杆挂竖牌匾悬空·主角可站牌下 · D169
2026-07-06 14:02:17 +08:00

90 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 天道宗牌匾 R5 · 杆挂竖牌匾 · 破旧悬空 · 主角可站牌下"""
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/R5"
OUT.mkdir(parents=True, exist_ok=True)
# 剧本理解纠正:
# 牌匾不是平放在桌上→是竖着挂起来→破旧悬在半空→主角能站在牌下→有杆子挂它
# 类似: 一根木杆立在摊位旁,顶部悬挂破旧牌匾随风微晃
P = """中国修仙世界破旧宗门摊位场景,正面中景,一根粗糙木杆竖立在地面,木杆顶部横出一根短竿,用麻绳悬挂着一块古旧破败的木质竖招牌。
木牌竖挂悬在半空中暗色风化木纹表面开裂斑驳边缘有磨损缺口牌匾下方空出一人高的空间约1.8米一名年轻修仙者约18岁可以站在木牌下面。
木杆插在简陋修仙摊位旁地面,摊位是粗糙旧木板搭建的简易桌台,铺着破旧麻布,地面是粗砂泥土。
3D写实渲染不良人万妖图录传硬核写实风格光影厚重自然中国古代修仙市集氛围画面有电影感。"""
N = """平放桌面,平躺木板,水平放置,横放桌面,放在桌上的木板,桌面上的牌子,摊在桌上的招牌。
靠墙直立,靠在墙上,墙上的招牌,红墙,白墙,砖墙,石墙,水泥墙。
新招牌干净整洁光滑木板抛光木板新刷漆霓虹灯现代灯箱LED招牌。
任何文字,任何汉字,任何书法,刻字,天道宗三个字,宗门名称。
现代城市,街道标志,现代灯杆,金属杆,不锈钢杆,塑料管。
卡通渲染塑料感游戏低模廉价3D光污染特效。
人物面部清晰,人物五官,面孔特写,人物占画面主体。
横幅,横挂招牌,横向牌匾,横匾,横着的木板。
竖墙,墙面背景为主,背景是墙。"""
VARIANTS = [
"正面中景,粗木杆插在摊位旁,顶部麻绳悬挂破旧木牌匾,牌下空出站位空间,摊位旧桌可见",
"仰视角度,牌匾悬在木杆顶部半空,破旧木纹裂缝清晰,麻绳缠绕木杆,下方可见摊位",
"中近景,木牌匾悬挂角度微晃,表面风化斑驳,木杆粗糙有树皮纹理",
"侧面角度,木杆竖立在摊位旁,牌匾悬空挂起,牌下空间可站一人,破旧感强烈"
]
SEEDS = [303, 404, 505, 606]
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-R5-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-R5", "ts": ts,
"change": "R4(平放桌上)→R5(杆挂竖牌匾·悬空·可站人)",
"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)