guanghulab/video-ai-system/tools/prop003_v3_gen.py
bingshuo c6c62e0b73
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-003广告牌V3·带完整招生文字·6行 · D169
2026-07-06 17:20:32 +08:00

90 lines
4.2 KiB
Python
Raw 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-003 广告牌 V3 · 带完整招生文字 · 对齐苏白风格"""
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-003-FreeAdBoard/V3"
OUT.mkdir(parents=True, exist_ok=True)
P = """中国修仙世界百宗会天道宗招生点旁正面中景。一个古风绳系A架立式广告牌两根灵木杆顶部用麻绳捆扎成A形支架。
支架上撑开一幅粗麻布料画布,画布上用古朴墨迹写着几行招生信息竖排:
天道宗
未来第一宗
名额:一位
包吃包住
每月基础银子:三十两
入宗即可学习仙法
粗麻画布微微皱起,墨迹古朴有风化磨损感,整体陈旧但字迹清晰可读。
广告牌竖立在简陋天道宗摊位旁地面,灵木桌铺淡青色粗布。背景修仙百宗会一角仙雾缭绕。
3D真人向写实渲染不良人硬核写实风格与CHAR-003苏白V3-R4、PROP-002牌匾R8同一风格体系。"""
N = """无文字的广告牌,空白画布,空白的布,没有任何字的牌子,留白的广告板,无字招牌。
新招牌干净整洁现代广告架金属广告牌LED灯箱霓虹灯易拉宝展架。
石墙,石板路,砖墙,红墙白墙,现代城市街道。
人物占主画面,面孔特写,人物半身像。
卡通渲染,塑料感,游戏低模,页游风,光污染。
暖黄阳光色调,昏黄色调,金色阳光。
任何错误文字、乱码、无关文字、拼音、英文。
文本排列混乱,文字方向错误,横排文字。"""
VARIANTS = [
"正面A架广告牌天道宗+未来第一宗+名额一位+包吃包住+三十两+入宗学仙法六行墨字清晰朴拙灵木A架麻绳捆扎",
"微侧视角A架画布古朴墨迹招生信息完整可见背景百宗会修仙远景仙雾缭绕",
"正面中景广告牌主体,粗麻画布上六行招生信息竖排工整,字体古朴有风化磨损,摊位灵木桌旁",
"半侧面A架绳结清晰画布招生语句完整可读字体斑驳但内容齐全修仙百宗会氛围"
]
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-003-V3-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})
print(f" -> {dst.name}")
time.sleep(3)
ok = sum(1 for r in results if r["ok"])
print(f"\n完成: {ok}/4")
json.dump({"spec": "VA-05-001-PROP-003-V3", "ts": ts, "change": "V2→V3: 加完整招生文字",
"ok": ok, "model": MODEL, "engine": "Seedream", "results": results},
open(OUT/"generation-meta.json","w",encoding="utf-8"), ensure_ascii=False, indent=2)