137 lines
8.0 KiB
Python
137 lines
8.0 KiB
Python
#!/usr/bin/env python3
|
||
"""ENV-002/003/004 R2 · 摊位→宗门招生点 · 大气仙气缥缈"""
|
||
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": """集市摊位,地摊,菜市场,小吃摊,杂货铺,庙会,赶集,路边摊,小摊小贩。
|
||
卡通渲染,塑料感,游戏低模,页游风,光污染,土味特效。
|
||
现代建筑,高楼大厦,现代广场,水泥地,柏油路。
|
||
冷清无人,空旷孤寂场景。
|
||
任何文字,汉字。
|
||
人物特写,单人占主体。
|
||
白天正午过曝,画面扁平。""",
|
||
"variants": [
|
||
"极致高空俯瞰,仙云翻涌如海,宗门招生宫殿星罗棋布,御剑流光万千穿梭,恢弘史诗级修仙界招生大会",
|
||
"鸟瞰修仙盛会,各宗招生殿宇阵列仙山环抱,灵云蒸腾仙鹤群飞,宏大场景仙气扑面,电影级大场面",
|
||
"广角高空远眺百宗会,云海之上招生处若隐若现,灵光流转山脉间,修仙者御剑如星河流动",
|
||
"极远高空修仙招生广场全景,千宗万派招生殿林立,仙雾缭绕如仙境,史诗级修仙世界观宏大场景"
|
||
]
|
||
},
|
||
"ENV-003": {
|
||
"name": "天道宗招生点·角落破旧",
|
||
"prompt": """中国修仙世界百宗会角落,天道宗简陋招生点中近景。
|
||
不是集市摊位,而是天道宗唯一的招生报名处——一根旧仙木杆悬挂刻有天道宗三字的破旧牌匾。
|
||
旁边绳系A架粗麻广告牌竖立,一张粗糙灵木桌铺青布就是全部的报名台,桌上空无一物没有一个人来报名。
|
||
角落位置荒凉冷清,远处其他宗门的豪华招生殿隐约可见,仙雾在脚边缭绕。
|
||
画面突出破败对比:别人是金光闪闪的招生殿,天道宗只有一块破牌匾和一张破桌子。
|
||
3D真人向写实渲染,清淡冷雅色调,不良人硬核写实风格,与苏白V3-R4同一体系,电影感构图。""",
|
||
"neg": """集市摊位,地摊,菜市场,小吃铺,杂货铺,庙会摊位,路边摆摊,小贩推车。
|
||
卡通渲染,塑料感,游戏低模,页游风,光污染。
|
||
现代建筑,现代招牌,现代家具。
|
||
任何人,人物,报名者,围观群众。
|
||
鲜艳暖黄色调,金黄阳光,高饱和度。
|
||
任何无关汉字,其他宗门名称。""",
|
||
"variants": [
|
||
"天道宗角落招生点,破旧牌匾广告牌灵木报名台,孤零零无人,仙雾缭绕远焦豪华招生殿对比强烈",
|
||
"冷清天道宗招生报名处,一杆牌匾一桌一广告牌就是全部家当,脚下仙雾远焦金光,清寂氛围",
|
||
"天道宗最寒酸招生点,破木牌匾悬空广告牌旁立,灵木台青布空无一物,修仙界最冷清的报名处",
|
||
"角落天道宗招生点中景,牌匾广告牌报名台简陋到极致,虚化远方豪华招生殿,冷雅仙侠电影感"
|
||
]
|
||
},
|
||
"ENV-004": {
|
||
"name": "灵霄宗招生殿·气派宏伟",
|
||
"prompt": """中国修仙世界百宗会,灵霄宗招生殿中全景。
|
||
不是集市摊位,而是灵霄宗正式的招生报名大殿——飞檐翘角三层楼阁,鎏金牌匾灵光流转庄严肃穆。
|
||
宽阔的汉白玉台阶从大殿延伸至广场,排队报名的修仙者队伍蜿蜒有序,殿前灵石法阵散发柔和灵光。
|
||
大殿两侧丝绸垂幔随风轻扬,紫檀木报名案台排列整齐,宗门执事正襟危坐。
|
||
整个招生殿仙气浓郁灵光环绕,大气磅礴尽显顶级宗门气派。
|
||
3D真人向写实渲染,清冷中有灵气光晕,不良人硬核写实风格,与苏白V3-R4同一风格体系,电影级画面。""",
|
||
"neg": """集市摊位,地摊,菜市场,小吃部,杂货铺,庙会,路边摊,小摊,简陋摊点,临时帐篷,简易大棚。
|
||
卡通渲染,塑料感,游戏低模,页游风,光污染过度,土味光效。
|
||
现代建筑,现代办公楼,现代排队栏杆,现代招牌。
|
||
空无一人,冷清单薄。
|
||
暴发户土黄金,过度鲜艳,粗俗俗气装饰,过于明亮刺眼。
|
||
任何无关文字。""",
|
||
"variants": [
|
||
"灵霄宗招生大殿全景,飞檐楼阁三层鎏金牌匾,汉白玉台阶排队蜿蜒,灵石法阵灵光流转,顶级宗门气派",
|
||
"灵霄宗招生殿中景,紫檀案台执事正坐,丝绸垂幔飘动,殿前修仙者长队庄严肃穆,仙气浓郁",
|
||
"恢弘灵霄宗招生处,三层飞檐大殿灵光环绕,数百修仙者排队报名,牌匾鎏金流转,大气磅礴",
|
||
"灵霄宗正式招生殿,飞檐翘角庄严肃穆,排队修仙者蜿蜒如龙,灵石法器灵光点缀仙气缥缈,电影级构图"
|
||
]
|
||
}
|
||
}
|
||
|
||
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[: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}/R2"
|
||
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}-R2-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}-R2", "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}")
|