guanghulab/video-ai-system/tools/prop002_gen_r7.py
bingshuo 167fee1d85
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牌匾R7 · 风格对齐苏白V3-R4统一画面质感 · D169
2026-07-06 14:07:14 +08:00

92 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 R7 · 风格对齐CHAR-003苏白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/R7"
OUT.mkdir(parents=True, exist_ok=True)
P = """不良人硬核写实风格画面光影质感和色调与CHAR-003苏白V3-R4完全一致。
中国古代修仙市集角落,一根粗糙木杆竖在地面,麻绳悬挂一块普通大小的破旧木牌匾。
木牌约半人高,就是一块普通木板大小,上面刻有"天道宗"三个古朴的汉字。
木牌陈旧破败,暗色风化木纹清晰可见,表面开裂,边缘有磨损缺口,粗粝麻绳。
木杆插在简陋摊位旁地面,摊位是粗糙旧木简易桌台,铺着破旧麻布。
下方空出空间,一个成年人可以站在木牌下面。
3D写实渲染光影厚重有层次物体有真实重量感皮肤级逼真材质表现画面有电影级调色和光影。"""
N = """巨型招牌,超大牌匾,比人还高的巨幅招牌,广告牌,宽幅横匾,占据画面超过一半的大牌子。
平放在地上,横放在桌上,平躺的木板,靠在墙上的牌子,墙上的牌匾,门楣悬挂。
任何其他文字(除天道宗外),无关汉字,标语,广告语,对联,落款,小字。
新木板干净整洁光滑抛光现代广告牌霓虹灯LED招牌现代灯箱。
金属杆,不锈钢,塑料管,水泥杆,现代电线杆。
现代城市背景,街道,建筑,红墙白墙砖墙石墙水泥墙。
卡通渲染赛璐璐塑料感游戏低模廉价3D光污染特效仙侠页游风土味光效。
人物占主画面,面孔特写,半身像。竖墙背景为主。
竖长细条木牌,过窄的比例。
画面扁平光影单薄泛白泛亮光过度曝光HDR过度色调偏白偏亮偏冷。
明亮鲜艳色调,高饱和度,鲜艳夺目色彩,亮色调,日系清新色调。
与苏白CHAR-003风格不同违和感风格不统一不同画风。"""
VARIANTS = [
"正面中景,粗木杆摊位旁,麻绳挂天道宗木牌匾,木板纹理真实光影厚重,色调沉稳与苏白同风格",
"仰视微侧,悬空木牌天道宗三字,破旧木板质感如真实物体,光影有电影感,古朴色调统一",
"中景平视天道宗旧木牌普通大小皮肤级材质表现光影层次分明与CHAR-003同品牌画面",
"侧面视角,木杆竖立天道宗牌悬空,写实厚重质感,木纹裂缝真实,电影级光影调色统一"
]
SEEDS = [222, 333, 444, 555]
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-R7-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-R7", "ts": ts,
"change": "R6→R7: 风格对齐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)