guanghulab/video-ai-system/tools/prop003_gen_v2.py
Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

89 lines
4.3 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-003 免费招徒广告牌 V2 · 修仙世界风格升级 · 对齐苏白+牌匾"""
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/V2"
OUT.mkdir(parents=True, exist_ok=True)
P = """中国修仙世界百宗会天道宗摊位旁正面中景。一个古风绳系A架立式广告牌两根灵木杆顶部用麻绳捆扎成A形支架。
支架上撑开一幅粗麻布料画布,画布微微皱起但完整无文字留白待书写。
广告牌竖立在简陋天道宗摊位旁地面,摊位是粗糙灵木桌铺着淡青色粗布。
背景是修仙百宗会一角,远处有其他宗门的气派招牌若隐若现,淡淡仙雾缭绕脚下。
3D真人向写实渲染光影清冷自然与CHAR-003苏白V3-R4、PROP-002天道宗牌匾R8同一风格体系。
画面有电影级光影和修仙世界氛围。"""
N = """任何文字,汉字,书法,标语,广告语,招生信息,价格,包吃包住,三十两,天道宗。
石墙,石板路,青砖墙,砖墙,红墙,白墙,现代墙面,城市街道,小巷,胡同。
古代世俗集市,菜市场,杂货铺,小吃摊,庙会,民间集会。
现代广告架金属广告牌LED灯箱霓虹灯易拉宝展架现代海报架。
新画布,白布,干净整洁,塑料布,防水布,现代材质。
人物占主画面,面孔特写。
卡通渲染塑料感游戏低模廉价3D光污染页游风。
昏黄暖色调,金色阳光,日落光,烛光。
黑暗阴森色调,全黑背景。
任何挂在墙上的东西,靠墙。"""
VARIANTS = [
"正面中景绳系A架广告牌在天道宗摊位旁粗麻画布无字灵木杆捆扎仙雾脚下冷雅色调",
"微侧视角A架广告牌斜放在摊位旁画布微皱完整背景百宗会修仙集会远景清冷光影",
"中景正面A架画布占画面主体但留白无文字摊位一角露出灵木桌青布修仙氛围",
"半侧面A架广告牌绳结清晰画布材质粗糙可见背景虚化修仙宗门招牌电影级调色"
]
SEEDS = [111, 222, 333, 444]
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-V2-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-003-V2", "ts": ts,
"change": "V1→V2: 世俗石墙→修仙百宗会·灵木A架·仙雾·风格对齐苏白和牌匾",
"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)