126 lines
6.0 KiB
Python
126 lines
6.0 KiB
Python
#!/usr/bin/env python3
|
||
"""D188 资产图生成脚本 - 即梦 Seedream 4.0"""
|
||
import os, json, time, urllib.request, urllib.error
|
||
|
||
# 读取API密钥
|
||
env_path = os.path.expanduser("~/Documents/guanghulab-local-secrets/shortdrama-api.env")
|
||
api_key = None
|
||
with open(env_path) as f:
|
||
for line in f:
|
||
if line.startswith("VOLCENGINE_API_KEY="):
|
||
api_key = line.strip().split("=", 1)[1]
|
||
break
|
||
|
||
if not api_key:
|
||
print("❌ 未找到API密钥")
|
||
exit(1)
|
||
|
||
API_URL = "https://ark.cn-beijing.volces.com/api/v3/images/generations"
|
||
HEADERS = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
|
||
SAVE_DIR = "/Volumes/JZAO/光湖项目/苏白短剧/生成图片/D188-资产测试"
|
||
|
||
# 资产列表
|
||
ASSETS = [
|
||
{
|
||
"id": "ENV-002",
|
||
"name": "百宗会广场俯瞰全景",
|
||
"prompt": "3D 国风仙侠漫剧风格,三渲二卡通渲染,高空俯瞰视角的巨大广场,广场上人山人海,沿路树立着众多豪华大气的宗门招牌,每个招牌下都有排队的人群,古风修仙建筑风格,热闹繁华的百宗大会场景,整体色调明亮,画面干净,无清晰可读文字,无水印。",
|
||
"negative": "真人,现代元素,俯视角度过低,画面拥挤杂乱,文字清晰可辨,水印,低画质",
|
||
},
|
||
{
|
||
"id": "ENV-003",
|
||
"name": "百宗会天道宗摊位近景",
|
||
"prompt": "3D 国风仙侠漫剧风格,三渲二卡通渲染,百宗会广场的角落位置,立着一块老旧破损的木质牌匾,旁边立着一块简易广告牌,地面有落叶,整体氛围略显寒酸冷清,背景是模糊的广场人群,前景留出人物站位空间,画面干净,无清晰可读文字,无水印。",
|
||
"negative": "豪华建筑,鎏金装饰,人群清晰占比过大,现代材质,文字清晰,水印,低画质",
|
||
},
|
||
{
|
||
"id": "ENV-004",
|
||
"name": "百宗会灵霄宗摊位近景",
|
||
"prompt": "3D 国风仙侠漫剧风格,三渲二卡通渲染,气派非凡的宗门摊位,上方悬挂着豪华牌匾,下方立着数块告示牌,摊位前排着一眼望不到头的长队,周围人群密集,整体华丽精致,与寒酸宗门形成强烈反差,画面干净,无清晰可读文字,无水印。",
|
||
"negative": "破旧简陋,人数稀少,材质廉价,文字清晰可辨,真人面孔,水印,低画质",
|
||
},
|
||
{
|
||
"id": "CHAR-001",
|
||
"name": "苏白-男主",
|
||
"prompt": "3D 国风仙侠漫剧风格,三渲二卡通渲染,18 岁少年男主,面容俊朗清秀,眼神明亮,身穿简约素白长衫,站姿挺拔,双手自然垂于身侧,全身立绘,纯色浅灰背景,服饰干净整洁,少年感十足,画面清晰,无文字,无水印。",
|
||
"negative": "真人写实,苍老油腻,衣物破损,复杂花纹,表情凶狠,背景杂乱,水印,低画质",
|
||
},
|
||
{
|
||
"id": "CHAR-002",
|
||
"name": "诸葛风-男二",
|
||
"prompt": "3D 国风仙侠漫剧风格,三渲二卡通渲染,18 岁少年,面容方正淳朴,眼神隐忍坚毅,身穿粗麻破旧布衣,身形挺拔,全身立绘,纯色浅灰背景,底层少年落魄感,肤色偏健康小麦色,画面清晰,无文字,无水印。",
|
||
"negative": "华丽服饰,油光满面,骄纵神态,锦衣玉食,真人质感,水印,低画质",
|
||
},
|
||
{
|
||
"id": "CHAR-003",
|
||
"name": "王执事-灵霄宗执事",
|
||
"prompt": "3D 国风仙侠漫剧风格,三渲二卡通渲染,中年男子,面色刻薄势利,眼神鄙夷,身穿蓝色修仙执事服,站姿倨傲,全身立绘,纯色浅灰背景,官吏感十足,画面清晰,无文字,无水印。",
|
||
"negative": "年轻俊朗,和善神态,破旧衣物,布衣材质,真人面孔,水印,低画质",
|
||
},
|
||
{
|
||
"id": "CHAR-004",
|
||
"name": "路人龙套组",
|
||
"prompt": "3D 国风仙侠漫剧风格,三渲二卡通渲染,三位不同样貌的成年男性路人,分别穿灰、青、棕三色普通修仙服饰,表情各异,嘲讽、好奇、疑惑,站姿自然,全身立绘,纯色浅灰背景,样貌普通无记忆点,画面清晰,无文字,无水印。",
|
||
"negative": "主角脸,华丽服饰,夸张表情,真人质感,背景杂乱,水印,低画质",
|
||
},
|
||
]
|
||
|
||
def generate_and_save(asset):
|
||
"""生成单张资产图并保存"""
|
||
filename = f"{asset['id']}-{asset['name']}.jpeg"
|
||
filepath = os.path.join(SAVE_DIR, filename)
|
||
|
||
print(f"\n{'='*50}")
|
||
print(f"🎨 生成: {asset['id']} - {asset['name']}")
|
||
|
||
payload = {
|
||
"model": "doubao-seedream-4-0-250828",
|
||
"prompt": asset["prompt"],
|
||
"negative_prompt": asset["negative"],
|
||
"size": "1280x720",
|
||
"n": 1,
|
||
}
|
||
|
||
try:
|
||
data = json.dumps(payload).encode("utf-8")
|
||
req = urllib.request.Request(API_URL, data=data, headers=HEADERS, method="POST")
|
||
with urllib.request.urlopen(req, timeout=120) as resp:
|
||
result = json.loads(resp.read().decode("utf-8"))
|
||
|
||
img_url = result["data"][0]["url"]
|
||
img_size = result["data"][0]["size"]
|
||
tokens = result["usage"]["total_tokens"]
|
||
|
||
print(f" 📐 尺寸: {img_size} | Token: {tokens}")
|
||
|
||
# 下载图片
|
||
urllib.request.urlretrieve(img_url, filepath)
|
||
|
||
print(f" ✅ 已保存: {filename}")
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f" ❌ 失败: {e}")
|
||
return False
|
||
|
||
# 主流程
|
||
print("🚀 D188 资产图批量生成")
|
||
print(f"📁 保存路径: {SAVE_DIR}")
|
||
print(f"🎯 共 {len(ASSETS)} 张待生成")
|
||
|
||
results = []
|
||
for asset in ASSETS:
|
||
ok = generate_and_save(asset)
|
||
results.append((asset["id"], asset["name"], ok))
|
||
time.sleep(1) # 避免请求过快
|
||
|
||
# 汇总
|
||
print(f"\n{'='*50}")
|
||
print("📋 生成结果汇总:")
|
||
for aid, name, ok in results:
|
||
status = "✅" if ok else "❌"
|
||
print(f" {status} {aid} - {name}")
|
||
|
||
success = sum(1 for _, _, ok in results if ok)
|
||
print(f"\n完成: {success}/{len(results)}")
|