字幕翻译时间码零漂移:TranslateBooksWithLLMs处理SRT文件实战指南
【免费下载链接】TranslateBooksWithLLMsTranslate full-length books and documents with Ollama, OpenAI-compatible, Gemini, Mistral, DeepSeek, Poe or OpenRouter. Preserves formatting. Resumes where you left off. No file size limits.项目地址: https://gitcode.com/gh_mirrors/tr/TranslateBooksWithLLMs
TranslateBooksWithLLMs是一款免费的开源图书与文档翻译工具,也能高质量处理SRT 字幕文件批量翻译:它把时间码和字幕文本彻底分离,只把文字发给大模型,因此翻译结果时间码零漂移、条目零丢失。支持 Ollama、OpenAI、Gemini、Mistral、DeepSeek、Poe、OpenRouter 等多种模型后端,无文件大小限制,还带断点续传与双语字幕输出。本文带你快速跑通 SRT 字幕翻译的完整流程。
为什么字幕翻译最怕时间码错位
一个 SRT 文件由三部分组成:序号、时间码(如00:00:01,000 --> 00:00:04,000)、字幕文本。很多"整文件喂给大模型"的做法,一旦模型多输出或少输出一行、改错一个逗号,后面所有字幕的时间码就集体错位——视频画面和字幕对不上,只能手动返工。
TranslateBooksWithLLMs 的思路完全不同:
- 解析阶段:把时间码、序号、文本拆成独立字段(见 parse_srt),时间码从始至终只读不译,永远不会进入提示词;
- 翻译阶段:只翻译文本字段,用
[N]索引标记保证每条译文能精确对号入座; - 重建阶段:用原始时间码 + 新文本重新拼装 SRT(见 reconstruct_srt)。
三道工序保证:输出条数与输入一致,时间码逐字节原样保留。
零漂移背后的关键设计
分块翻译 + 局部索引回映射
文件再大也不怕。工具按固定条数(默认 10 条/块,由SRT_LINES_PER_BLOCK控制,见 src/config.py)把字幕分块,块内使用0, 1, 2...局部编号,翻译完成后通过映射表回写到全局索引(核心逻辑在 extract_block_translations_with_remapping)。
标记校验 + 自动重试
模型偶尔会漏掉某条[N]标记。适配器会先校验(validate_unit_translation),发现缺失标记就带着明确的修复指令重试,而不是带着残缺结果继续。另有 tests/test_srt_marker_retry.py 等测试锁定这一行为。
保留格式标签
多行字幕、<i>、<b>、\an8等内联格式标签都会原样保留,不会因翻译被抹掉。
三步跑通:SRT字幕翻译实战
第 1 步:安装与启动
pip install -r requirements.txt python translate.py(Windows 用户可直接运行 start.bat,Linux/macOS 运行 start.sh;也支持 Docker 部署,参考 deployment/。)
第 2 步:上传 SRT 文件并选择模型
打开 Web 界面,上传.srt文件,选择源语言、目标语言和模型(本地 Ollama 免费离线,或云端 API 追求质量)。点击翻译后,进度条按"字幕条数"实时推进。
第 3 步:选择输出模式
- 纯译文:文本被译文替换,时间码不动;
- 双语模式:每条字幕上方保留原文、下方显示译文(实现在 _reconstruct_bilingual_srt),非常适合做语言学习材料。
断点续传:长字幕文件不怕中断
几小时的剧集字幕可能有上千条。中途断网、换模型都不必从头再来:
- 每完成一个块就写入检查点,
resume_from_checkpoint会恢复已完成块的译文(src/core/adapters/srt_adapter.py); - 暂停后可在面板中直接Resume继续,或Change model换模型接着翻(见上图);
- 单条翻译失败时保留原文兜底,不会留空条目拖垮时间轴(src/core/subtitle_translator.py)。
进阶技巧清单
- 精调第二遍(Refine):开启后对译文再做一轮打磨,专门针对字幕口语化、长度控制优化(refine_subtitle_translations);
- 术语表锁定译名:角色名、专有名词统一,避免"同一角色两个译名"的观感;
- 调整块大小:环境变量
SRT_LINES_PER_BLOCK控制每块条数,上下文更强可加大; - 自定义指令:注入风格要求(如"译文明快口语化、每行不超过40字")。
字幕翻译提示词的设计细节可参考 generate_subtitle_block_prompt。
常见问题 FAQ
问:翻译后时间码会错位吗?不会。时间码在解析期就被剥离,LLM 接触不到时间码,重建时原样拼回,这是"零漂移"的根本保证。
问:多行字幕怎么处理?多行结构原样保留,[N]标记内的换行会被完整还原。
问:文件编码是 GBK 的旧字幕怎么办?工具以 UTF-8 读写,建议先用文本编辑器另存为 UTF-8 再上传。
核心文件导航
| 模块 | 路径 |
|---|---|
| SRT 解析与重建 | src/core/srt_processor.py |
| 字幕分块翻译 | src/core/subtitle_translator.py |
| SRT 适配器(校验/双语/续传) | src/core/adapters/srt_adapter.py |
| 字幕提示词 | src/prompts/prompts.py |
| 适配器测试 | tests/test_adapters/test_srt_adapter.py |
| 标记重试测试 | tests/test_srt_marker_retry.py |
| 块大小配置 | src/config.py |
把 SRT 拖进去、选好语言、点击翻译——几分钟后你得到的就是一份时间码分毫不差的双语字幕。🎬
【免费下载链接】TranslateBooksWithLLMsTranslate full-length books and documents with Ollama, OpenAI-compatible, Gemini, Mistral, DeepSeek, Poe or OpenRouter. Preserves formatting. Resumes where you left off. No file size limits.项目地址: https://gitcode.com/gh_mirrors/tr/TranslateBooksWithLLMs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考