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