guanghulab/video-ai-system/tools/prop002_gen_r4.py
bingshuo 2a8d976990
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天道宗牌匾R4 · 平放摊位桌面 · D169
2026-07-06 10:42:01 +08:00

93 lines
4.7 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 天道宗牌匾 R4 · 平放在摊位桌上 · 对齐苏白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/PROP-002-TDZ-Plaque/R4"
OUT.mkdir(parents=True, exist_ok=True)
# R4修正
# 1. 去掉"靠墙直立"→改为平放或歪放在摊位桌上
# 2. 背景从石墙→修仙集市/宗门摊位桌面
# 3. 仍是破旧木板但姿态是躺平/半斜躺
P = """中国古代修仙宗门摊位上的破旧木质招牌,正面特写,无背景干扰。
一块古老破旧的木板招牌,暗色风化木纹,表面开裂斑驳,边缘有磨损缺口,木纹肌理清晰真实。
木板横躺平放在粗糙木质摊位桌面上,或半斜靠在摊位桌边(绝不竖直立起,绝不靠墙)。
摊位桌面是粗糙旧木板,带缝隙和旧漆痕迹,可见摊位边缘布料一角。
3D写实渲染光影厚重自然不良人万妖图录传硬核写实风格。
画面有电影级光影,旧木板有真实重量感和岁月痕迹。"""
N = """竖直摆放,靠墙直立,挂起悬挂,钉在墙上,墙上挂着的招牌,门楣上悬挂。
竖着放,竖直木板,直立木板,木板垂直地面,木板立在墙边。
白墙,红墙,砖墙,石墙,水泥墙,古代城墙,门框,门口,建筑物墙面。
干净整洁的木板,新木板,抛光木板,光滑木板,新刷漆的招牌,现代广告板。
竖屏构图,人物,全身立绘,角色,面孔,五官,眼睛,嘴巴,手,手臂,肢体。
卡通渲染塑料感游戏低模低多边形廉价3D光污染特效浮夸光环仙侠页游风。
背景有文字,招牌有文字,木板上有刻字,木板上写有天道宗,任何文字,任何汉字,任何书法。
木纹模糊,木质纹理不清晰,不真实的木头。"""
VARIANTS = [
"木板平放在粗糙木质摊位桌面上,横躺角度,从左上方打侧光,摊位桌面缝隙可见,木板裂痕清晰",
"木板半斜靠在摊位桌边底部平放桌面边缘上部倚在桌沿形成约45度倾斜摊位布料一角露出",
"木板横躺放在摊位桌面上,略微倾斜角度,摊位桌面有旧漆脱落痕迹,木板表面风化开裂可见",
"木板正面朝上平放在摊位桌面,边缘有缺口,底部可见摊位桌面木纹,光线从一侧照来木板纹理清晰可见"
]
SEEDS = [202, 303, 404, 505]
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-R4-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-R4", "ts": ts, "prop": "PROP-002-TDZ-Plaque",
"change": "R3→R4: 靠墙直立→平放/半斜靠摊位桌面",
"style": "对齐CHAR-003 V3-R4 · 不良人硬核写实",
"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)