cang-ying/generate-assets.py

126 lines
6.0 KiB
Python
Raw Normal View History

#!/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)}")