140 lines
8.0 KiB
Python
140 lines
8.0 KiB
Python
|
|
#!/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}")
|