cang-ying/generate-assets.py
Guanghu Domestic Migration a2fa7d57d8 chore: import sanitized domestic snapshot for REPO-005
Source snapshot: 23037fa3a2e9b0597162735755e92fc763bf4d94
2026-07-17 15:55:48 +08:00

126 lines
6.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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