140 lines
8.0 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
"""ENV-002/003/004 三场景批量生成 · 对齐苏白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"
SCENES = {
"ENV-002": {
"name": "百宗会广场全景",
"prompt": """中国修仙世界百宗会广场高空俯瞰,大远景。
从云端俯瞰修仙界盛大集会巨大广场人山人海数不清的修仙者如蚂蚁般穿梭其间
多个豪华宗门招牌林立鎏金牌匾灵气光环飞檐楼阁帐篷御剑飞行的修仙者化作流光划过天际
广场中央灵雾缭绕远处群山环抱仙鹤翱翔
场景宏大震撼每个宗门摊位都有独特风格和招牌
3D真人向写实渲染光影清冷自然不良人硬核写实风格与CHAR-003苏白V3-R4同一风格体系电影级大场面""",
"neg": """卡通渲染赛璐璐塑料感游戏低模廉价3D页游风光污染浮夸光环土味特效。
现代城市高楼大厦现代建筑水泥广场柏油路现代人群西装革履
空无一人的广场荒凉无人的场景空旷寂寥
任何文字汉字标语
人物面部特写单一人物占主体
白天正午艳阳过曝惨白画面扁平无层次
黑暗阴森恐怖末日废墟
这个场景是远景俯瞰不要近景""",
"variants": [
"高空俯瞰百宗会全景,人山人海修仙盛会,豪华宗门招牌阵列,御剑流光划过天空,仙雾缭绕宏大场面",
"云端俯视修仙广场,万人集会宗门林立,飞檐帐篷金碧辉煌,仙鹤翱翔远山环抱,电影级鸟瞰",
"百宗会广场高空全景,密集修仙者人流穿行,各宗招牌灵气环绕,御剑飞行轨迹优美,震撼修仙界盛况",
"俯瞰修仙界盛典,广角大远景,层叠宗门帐篷招牌如星罗棋布,人潮涌动灵雾飘渺,史诗级构图"
]
},
"ENV-003": {
"name": "天道宗摊位近景",
"prompt": """中国修仙世界百宗会角落,天道宗简陋摊位中近景。
角落位置破旧感强烈一根仙木杆悬挂刻有天道宗的破旧木牌匾旁边是绳系A架粗麻画布广告牌
摊位是粗糙灵木桌铺着淡青色粗布桌面上空无一物十分简陋
与远处豪华宗门摊位形成鲜明对比远处可见气派帐篷和排队人群
脚下淡淡仙雾缭绕色调偏冷暗清寂氛围孤独但不阴森
3D真人向写实渲染不良人硬核写实风格与CHAR-003苏白V3-R4同一风格体系画面有电影感""",
"neg": """卡通渲染塑料感游戏低模廉价3D页游风光污染。
现代建筑水泥地柏油路现代家具金属桌椅塑料凳子
豪华摊位气派装饰金碧辉煌华丽场景热闹喜庆氛围
任何人人物角色修行者顾客围观群众
任何文字除天道宗无关汉字标语
晴天艳阳高饱和度暖黄色调金色阳光鲜艳色彩
过于黑暗完全漆黑的角落恐怖片氛围""",
"variants": [
"天道宗破旧摊位中景,杆挂牌匾和广告牌清晰,灵木桌青布简陋,远处豪华摊位虚化,冷寂修仙氛围",
"角落天道宗摊位,破旧灵木桌铺青布,牌匾广告牌一左一右,脚下仙雾,远焦豪华宗门对比强烈",
"天道宗摊位中近景,简陋灵木台上空无一物,牌匾悬空广告牌旁立,冷色调清寂氛围,写实修仙场景",
"百宗会最角落的天道宗摊位,破败冷清,牌匾广告牌灵木桌青布,虚化远处的气派宗门摊位,电影感对比"
]
},
"ENV-004": {
"name": "灵霄宗摊位近景",
"prompt": """中国修仙世界百宗会灵霄宗豪华摊位中近景。
气派华丽摊位占据显眼位置鎏金灵霄宗牌匾悬挂高处光芒流转牌下豪华帐篷飞檐翘角
排队等候的修仙者队伍蜿蜒如龙人群拥挤热闹非凡
摊位装饰奢华丝绸帷幕紫檀木桌案灵石法器点缀其间灵光流转仙气浓郁
与其他简陋摊位如天道宗形成强烈视觉对比
3D真人向写实渲染光影清冷但有灵气光晕点缀不良人硬核写实风格与CHAR-003苏白V3-R4同一风格体系电影级画面""",
"neg": """卡通渲染塑料感游戏低模廉价3D页游风光污染过度土味光效特效。
现代建筑现代广告牌LED灯箱霓虹灯现代排队栏杆现代装修
简陋摊位破旧摊位寒酸场景贫困感
任何文字除灵霄宗无关汉字标语
空无一人冷清寥落
过于鲜艳高饱和过于金黄暴发户土豪金粗俗俗气装饰
过于黑暗阴森""",
"variants": [
"灵霄宗豪华摊位中景,鎏金牌匾光芒流转,丝绸帐篷飞檐,修仙者长队蜿蜒,灵光点缀华丽场景",
"灵霄宗气派摊位,紫檀木桌案灵石法器,排队人群熙攘,华贵装饰灵光流转,与天道宗对比鲜明",
"百宗会黄金位置灵霄宗摊位,鎏金招牌醒目,豪华帐篷飞檐翘角,人群涌动络绎不绝,修仙界顶级摊位",
"灵霄宗摊位中近景,灵光流转仙气浓郁,丝绸帷幕豪华装饰,队伍排长修仙者众多,电影级光影"
]
}
}
SEEDS = [777, 888, 999, 111]
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[:200]}")
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")
all_meta = {}
for env_id, cfg in SCENES.items():
print(f"\n{'='*40}\n{env_id} · {cfg['name']}\n{'='*40}")
OUT = ROOT / f"assets/candidates/D169-VA-05-001/{env_id}"
OUT.mkdir(parents=True, exist_ok=True)
results = []
for i, seed in enumerate(SEEDS):
var = cfg["variants"][i]
full = f"{cfg['prompt']} {var}"
print(f" [{i+1}/4] seed={seed}", flush=True)
url = gen(full, cfg["neg"], seed)
if not url:
results.append({"c": i+1, "ok": False, "err": "api"})
continue
dst = OUT / f"{env_id}-V1-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" {env_id} 完成: {ok}/4")
all_meta[env_id] = {"name": cfg["name"], "ok": ok, "results": results}
json.dump({"spec": f"VA-05-001-{env_id}-V1", "ts": ts, **all_meta[env_id], "model": MODEL, "engine": "Seedream"},
open(OUT/"generation-meta.json","w",encoding="utf-8"), ensure_ascii=False, indent=2)
print(f"\n{'='*40}")
for env_id, m in all_meta.items():
print(f" {env_id} · {m['name']}: {m['ok']}/4")
print(f"{'='*40}")