调整Dota2批量生图脚本为中日文双版本输出\n\n- 将每个英雄默认生成数量调整为4张\n- 固定前2张为中文排版、后2张为日文排版\n- 在统一提示词中增加语言版本约束,保证系列风格一致

This commit is contained in:
liuwei
2026-04-29 15:43:18 +08:00
parent e75562aaca
commit d02d7a99a0

View File

@@ -7,7 +7,7 @@
设计目标:
1. 这是一个一次性本地脚本,不依赖机器人运行时,直接走 HTTP 调用 OpenAI 兼容图片接口。
2. 脚本会自动从 OpenDota 拉取全部英雄列表,避免手工维护英雄名称。
3. 每个英雄默认生成 3 张图片,统一使用相同的画面结构与风格模板,尽量保证成片风格一致。
3. 每个英雄默认生成 4 张图片,其中 2 张中文排版、2 张日文排版,统一使用相同的画面结构与风格模板,尽量保证成片风格一致。
4. 脚本支持断点续跑:如果目标文件已经存在,则默认跳过,避免重复计费。
"""
@@ -36,6 +36,9 @@ DEFAULT_IMAGE_SIZE = "1024x1792"
# 这里统一定义输出根目录,方便后续在一个目录里筛图、剪辑、上传抖音。
DEFAULT_OUTPUT_DIR = Path("temp") / "dota2_douyin_images"
# 这里固定每个英雄的 4 张图的语言分布,避免每次运行时还要手动指定。
DEFAULT_LANGUAGE_VARIANTS = ["zh", "zh", "ja", "ja"]
def parse_args() -> argparse.Namespace:
"""解析命令行参数。"""
@@ -60,8 +63,8 @@ def parse_args() -> argparse.Namespace:
parser.add_argument(
"--count-per-hero",
type=int,
default=3,
help="每个英雄生成的图片数量,默认 3 张",
default=4,
help="每个英雄生成的图片数量,默认 4 张2 张中文、2 张日文)",
)
parser.add_argument(
"--size",
@@ -207,17 +210,37 @@ def fetch_dota2_heroes() -> List[Dict[str, str]]:
return heroes
def resolve_text_language(image_index: int) -> str:
"""
根据图片序号确定当前文案语言。
约定规则:
1. 第 1、2 张固定走中文排版;
2. 第 3、4 张固定走日文排版;
3. 如果用户把 count 调大,则从头循环复用这套语言分布。
"""
variant_index = (image_index - 1) % len(DEFAULT_LANGUAGE_VARIANTS)
return DEFAULT_LANGUAGE_VARIANTS[variant_index]
def build_consistent_prompt(hero: Dict[str, str], image_index: int) -> str:
"""
构造统一风格的提示词。
提示词策略:
1. 固定所有英雄共用的版式、镜头语言、色彩、文排版、雷达图要求;
1. 固定所有英雄共用的版式、镜头语言、色彩、文排版、雷达图要求;
2. 只替换英雄身份信息,尽量让最终成片拥有统一系列感;
3. 用“偏 JOJO 气质、夸张漫画表现”来强化目标风格。
"""
hero_name_cn = hero["localized_name"]
hero_name_en = hero["english_name"]
text_language = resolve_text_language(image_index)
if text_language == "zh":
text_language_desc = "画面中的标题、副标题、能力说明文字统一使用中文排版,字体要有热血漫画海报感,禁止出现日文。"
text_language_label = "中文"
else:
text_language_desc = "画面中的标题、副标题、能力说明文字统一使用日文排版,字体要有热血漫画海报感,禁止出现中文。"
text_language_label = "日文"
return f"""
请为短视频封面创作一张高完成度竖版插画,主体是 Dota2 英雄 {hero_name_cn}{hero_name_en})。
@@ -227,14 +250,15 @@ def build_consistent_prompt(hero: Dict[str, str], image_index: int) -> str:
2. 画面整体要强烈偏向 JOJO 气质:夸张肌肉与体块、强烈明暗对比、戏剧化姿势、锐利线条、张力十足的漫画分镜感、厚重阴影、速度线、压迫感构图。
3. 需要比普通日漫更偏 JOJO 风,风格统一、成熟、硬朗、华丽,视觉冲击力强。
4. 画面左下角固定放一个“能力雷达图”,用日式游戏 UI 风格表现,半透明发光面板,结构清晰。
5. 画面中加入醒目的日语文字排版,像热血漫画标题与角色名字幕,排版要高级,不能乱码。
5. 画面中加入醒目的文字排版,像热血漫画标题与角色名字幕,排版要高级,不能乱码。
6. 构图固定为 9:16 竖版海报,适合抖音封面,角色居中偏上,保留底部与左下角的信息区。
7. 背景使用史诗感能量、替身感氛围、漫画速度线、粒子、光效,但不要遮挡主体脸和武器。
8. 质感统一为高细节、高完成度、商业海报、收藏级插画。
9. {text_language_desc}
稳定性要求:
1. 全系列都保持相同的版式语言、相同的信息层级、相同的雷达图位置、相同的标题风格。
2. 当前是同一英雄的第 {image_index} 张候选图,请只在姿势、镜头角度、背景能量流向上做有限变化,不要改变整体系列风格。
2. 当前是同一英雄的第 {image_index} 张候选图,本张必须输出{text_language_label}版本;请只在姿势、镜头角度、背景能量流向上做有限变化,不要改变整体系列风格。
3. 不要出现水印、签名、Logo、拼贴、多角色、手部崩坏、脸部畸形、文字糊成乱码。
""".strip()