From d02d7a99a04833cd2ed7c6474fe1b997f5ba691b Mon Sep 17 00:00:00 2001 From: liuwei Date: Wed, 29 Apr 2026 15:43:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4Dota2=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E7=94=9F=E5=9B=BE=E8=84=9A=E6=9C=AC=E4=B8=BA=E4=B8=AD=E6=97=A5?= =?UTF-8?q?=E6=96=87=E5=8F=8C=E7=89=88=E6=9C=AC=E8=BE=93=E5=87=BA\n\n-=20?= =?UTF-8?q?=E5=B0=86=E6=AF=8F=E4=B8=AA=E8=8B=B1=E9=9B=84=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=95=B0=E9=87=8F=E8=B0=83=E6=95=B4=E4=B8=BA?= =?UTF-8?q?4=E5=BC=A0\n-=20=E5=9B=BA=E5=AE=9A=E5=89=8D2=E5=BC=A0=E4=B8=BA?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E6=8E=92=E7=89=88=E3=80=81=E5=90=8E2?= =?UTF-8?q?=E5=BC=A0=E4=B8=BA=E6=97=A5=E6=96=87=E6=8E=92=E7=89=88\n-=20?= =?UTF-8?q?=E5=9C=A8=E7=BB=9F=E4=B8=80=E6=8F=90=E7=A4=BA=E8=AF=8D=E4=B8=AD?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC=E7=BA=A6?= =?UTF-8?q?=E6=9D=9F=EF=BC=8C=E4=BF=9D=E8=AF=81=E7=B3=BB=E5=88=97=E9=A3=8E?= =?UTF-8?q?=E6=A0=BC=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/generate_dota2_douyin_images.py | 36 ++++++++++++++++++++----- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/scripts/generate_dota2_douyin_images.py b/scripts/generate_dota2_douyin_images.py index 2b1290b..86103c5 100644 --- a/scripts/generate_dota2_douyin_images.py +++ b/scripts/generate_dota2_douyin_images.py @@ -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()