A simple and robust LLM workflow for anime subtitle file translation.
简单而稳定的动画字幕翻译脚本。
老实说翻译魔芋这东西我是真想要,吃一口直接能阅片无数了,畅游全球啊有木有 (ง ื▿ ื)ว
konnyaku20250213.mp4
自动应对以下问题:
- LLM 批量翻译字幕时的输出截断问题(分批翻译字幕,如果仍然过长则自动缩减每一批送入的台词数量)。
- API 的 TPM/RPM 以及并发限制(自动退避等待)。
- 漏翻字幕(通过编号进行确认,有问题则重新翻译片段,自动调节每批翻译的台词数)。
- 未知的片假名名字(对于人名,直接替换成罗马音;其余的音译)。
- 翻译结果脱离番剧背景(通过
bgm.tv接口获取番剧背景信息,使翻译结果更加贴切)。
因为本程序几乎没有涉及并发,一般不用担心 API 的并发限制。
-
克隆本项目,安装依赖。
git clone https://github.com/SomeBottle/Konnyaku.git cd Konnyaku pip install -r requirements.txt或者直接通过
pip安装。pip install konnyaku
-
新建启动脚本。
cp run.example.sh run.sh chmod +x run.sh
编辑启动脚本,配置环境变量,详见下方说明。
-
运行。
./run.sh [-o <output file path>] <srt or ass file> [bangumi subject id] # 例: # - 直接翻译字幕,不提供背景信息,不指定输出路径: # ./run.sh ./demo/zenshuu_06.ass # (不指定输出路径则默认输出到同目录下 output_chs.ass) # # - 提供背景信息(来自 bgm.tv, 例如 https://bgm.tv/subject/486039 中 subject id 为 486039 ),翻译字幕: # ./run.sh ./demo/zenshuu_06.ass 486039 # # - 指定输出路径: # ./run.sh -o ./demo/my.ass ./demo/zenshuu_06.ass 486039
本翻译脚本需通过环境变量进行配置,可配置项及其说明如下。
| 变量名 | 是否必须 | 说明 | 默认值 |
|---|---|---|---|
KYK_LLM_API_KEY |
是 | (用于翻译字幕) LLM API KEY | 无 |
KYK_LLM_API_BASE_URL |
是 | (用于翻译字幕) LLM API 终结点 URL | 无 |
KYK_LLM_MODEL |
是 | (用于翻译字幕) 选用的 LLM 模型 ID | 无 |
KYK_LLM_TEMPERATURE |
否 | (用于翻译字幕) LLM 温度,如果调高了翻译结果可能不可控 | 1.0 |
KYK_LLM_API_STREAMING |
否 | (用于翻译字幕)是否流式接收 LLM 输出(1 - 是,0 - 否),建议为 1 |
0 |
KYK_SUM_LLM_API_KEY |
否 | (用于字幕总结) LLM API KEY。💡 如果不指定则不会进行字幕总结 | 无 |
KYK_SUM_LLM_API_BASE_URL |
否 | (用于字幕总结) LLM API 终结点 URL | 无 |
KYK_SUM_LLM_MODEL |
否 | (用于字幕总结) 选用的 LLM 模型 ID | 无 |
KYK_SUM_LLM_TEMPERATURE |
否 | (用于字幕总结) LLM 温度 | 1.0 |
KYK_SUM_LLM_API_STREAMING |
否 | (用于字幕总结)是否流式接收 LLM 输出(1 - 是,0 - 否),建议为 1 |
0 |
KYK_BANGUMI_API_TOKEN |
否 | (用于获得番剧背景信息)bgm.tv API Token。💡 如果不指定则不会获取背景信息,可能影响翻译准确性 |
无 |
KYK_MAX_RETRY_TIMES |
否 | LLM API 请求异常时的最多重试次数 | 3 |
KYK_TRANSLATE_LINES_PER_REQUEST |
否 | 每一批翻译的台词行数,不可少于 20(太多可能会因为 LLM 幻觉而漏翻,程序会自动尝试解决这点) |
40 |
- LLM API 需要支持 OpenAI 接口风格。
- 字幕总结可以用稍差一些的模型,有财力 (
$ω$ ) 的话还是建议用和翻译模型同等级的模型。 -
bgm.tvAPI Token 可以在 这里 申请。
# 查看媒体信息
ffmpeg -i <媒体文件路径>
# 提取字幕流
ffmpeg -i <媒体文件路径> -map 0:<流索引> <输出字幕文件路径>
# 比如你可能会看到类似这样的输出:
# Stream #0:2: Subtitle: subrip (default)
# - 这里的 2 就是字幕流索引
# 提取字幕流为 ass 文件:
# ffmpeg -i <媒体文件路径> -map 0:2 output.ass咱追了 2025 年 1 月新番《全修。》来着,问题是这部被 Crunchyroll 拿下了,中文字幕时有时无,大陆也没代理商或平台买。民间字幕组产能有限,想第一时间看最多只能啃英肉。
下载动画资源时咱发现有生肉资源附有日文字幕,于是就想着能不能用 LLM 翻译一下。找了几个相关项目感觉都不太满意,没怎么考虑到 API 限制以及翻译的稳定性。
为什么不拿英文字幕来翻译?Crunchyroll 的英文翻译...我不好说...
真拿你没办法,那我就自己写一个吧!懒到抽筋的我没有整并发编程,至少这样挺稳定的不是吗
也希望这个脚本能帮助到有同样需求的朋友们。

