guanghulab/video-ai-system/tools/prop002_gen_r6.py
bingshuo 512abae3c6
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牌匾R6 · 加天道宗三字+缩小木板比例 · D169
2026-07-06 14:05:07 +08:00

93 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 R6 · 杆挂小木牌【天道宗】· 真实木板比例 · 不是广告大招牌"""
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/R6"
OUT.mkdir(parents=True, exist_ok=True)
# R6修正:
# 1. 牌匾上有"天道宗"三个汉字
# 2. 比例缩小→普通木板大小(不是巨型广告招牌)
# 3. 仍保持杆挂悬空+牌下可站人
P = """中国古代修仙市集角落,一根粗糙木杆竖在地面,麻绳悬挂一块普通大小的破旧木牌匾。
木牌约半人高,就是一块普通木板大小,不是巨型招牌,上面刻有"天道宗"三个古朴的汉字。
木牌陈旧破败,暗色风化木纹表面开裂,边缘有磨损缺口,挂牌的麻绳粗糙。
木杆插在简陋摊位旁地面,摊位是粗糙旧木简易桌台,铺着破旧麻布。
下方空出足够空间,一个成年人可以站在木牌下面。
3D写实渲染不良人写实风格光影自然中国古代修仙市集写实质感。"""
N = """巨型招牌,超大牌匾,比人还高的巨幅招牌,广告牌,宽幅横匾,占据画面超过一半的大牌子。
平放在地上,横放在桌上,平躺的木板,靠在墙上的牌子,墙上的牌匾,门楣悬挂。
任何其他文字(除天道宗外),无关汉字,标语,广告语,对联,落款,小字。
新木板干净整洁光滑抛光现代广告牌霓虹灯LED招牌现代灯箱。
金属杆,不锈钢,塑料管,水泥杆,现代电线杆。
现代城市背景,街道,建筑,红墙白墙砖墙石墙水泥墙。
卡通渲染塑料感游戏低模廉价3D光污染特效页游风。
人物占主画面,面孔特写,半身像。竖墙背景为主。
竖长细条木牌,过窄的比例,像筷子一样细长的牌子。"""
VARIANTS = [
"正面中景,粗木杆摊旁,麻绳挂普通木板牌匾,板上'天道宗'三字古朴,摊位旧桌可见,牌匾大小适中",
"仰视微侧,木牌悬挂半空,板上刻'天道宗'三个楷体汉字,木牌破旧开裂,麻绳粗粝,下方摊位一角",
"中景平视,一块普通木板大小的旧牌匾悬挂,'天道宗'三字风化斑驳,木杆树皮纹理,摊位元素可见",
"侧面视角,木杆竖立,旧木牌悬空,'天道宗'字样清晰但古朴磨损,牌下空出站位空间"
]
SEEDS = [333, 444, 555, 666]
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-R6-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-R6", "ts": ts,
"change": "R5→R6: 缩小木牌比例+加【天道宗】三字",
"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)