【免费下载链接】llm-subtrans
Open Source project using LLMs to transcribe and translate subtitles (SRT, SSA/ASS, VTT)
LLM-Subtrans是一款利用大语言模型(LLM)翻译字幕的开源工具,支持SRT、SSA/ASS、VTT多种格式。它不会把整份字幕一次性丢给 AI,而是先按时间空档拆成场景(Scene)、再拆成批次(Batch),让每次只交给模型一小段、并附上上下文摘要——这套"场景与批次"拆分机制,正是翻译永不跑偏的核心秘密。
🎯 为什么不能把整份字幕一次性喂给 AI?
直接把几百行字幕一股脑交给模型,通常会遇到三个问题:
- 上下文窗口有限:太长会被截断,后面的内容直接丢失。
- 容易跑题:模型注意力分散,人物口吻、专有名词前后不一致。
- 无法局部重试:一旦某段翻崩,整份都得重来。
LLM-Subtrans的解法是分层切分:把字幕按"剧情段落"切成场景,再把场景按"模型一次能吃下的量"切成批次。下面拆解这套机制的每一步。
一、三层数据结构:场景 → 批次 → 字幕行
整个系统的骨架只有四个层级,理解它就理解了全局:
| 层级 | 对应类 | 含义 |
|---|---|---|
| 项目字幕 | Subtitles | 一份完整字幕文件 |
| 场景 | SubtitleScene | 一段连续的剧情,包含若干批次 |
| 批次 | SubtitleBatch | 一次交给 AI 翻译的最小单位 |
| 字幕行 | SubtitleLine | 带时间轴的单条字幕 |
核心结论:场景负责"剧情完整",批次负责"单次翻译可控"。拆分规则全部围绕这两层展开。
这套层级定义在 PySubtrans/SubtitleScene.py 与 PySubtrans/SubtitleBatch.py,整体架构说明可参考 docs/architecture.md。
二、第一步:按"时间空档"切出场景(Scene)
场景的边界来自一个很直觉的判断——当画面"安静"超过一定时长,就认为进入了新的一幕。
在 PySubtrans/SubtitleBatcher.py 的BatchSubtitles()里,算法逐行扫描:
- 计算相邻两行字幕之间的时间间隔(
gap)。 - 一旦
gap超过阈值scene_threshold(默认约60 秒),就切断,开一个新场景。 - 其余行归入当前场景。
也就是说:字幕长时间不出现 = 剧情切换 = 新场景。你完全可以在设置里调整这个阈值,让场景切得更细或更粗。
三、第二步:场景内递归切成批次(Batch)
一个场景可能仍然很长,超出模型舒适区。于是_split_lines()用递归二分把它切碎:
- 若行数 ≤
max_batch_size(默认100 行),收工。 - 否则,找到时间间隔最大的那个点,从那里切开。
- 对左、右两段递归重复上面的判断。
- 约束:任何一边都不能小于
min_batch_size(默认10 行),避免出现碎片批次。
小技巧:它专门挑"时间空档最大"处下刀,这样切开后两半的语义最完整,不会把一句话拦腰截断。
四、批次太大或翻崩了?自动对半拆分重试
即便切好了,个别批次仍可能因为"太长"或"内容敏感"翻译失败。此时登场的是自动拆分:
AutoSplitBatch()调用 PySubtrans/Helpers/SubtitleHelpers.py 中的FindBestSplitIndex()找最佳拆分点。- 拆分点不是随便对半,而是给每个候选点打分:
时间间隔 × 接近中点的程度,得分最高处下刀——既靠近中间(两半均衡),又尽量落在语义空档。 - 设置里有个贴心的开关
autosplit_on_error:批次校验失败时自动一分为二,分别重试。
对应的 GUI 命令 GuiSubtrans/Commands/AutoSplitBatchCommand.py 还实现了完整的撤销(undo):拆分不满意,一键合并回去。
五、上下文摘要:让 AI"记住前情"的关键
这是"永不跑偏"最容易被忽略、却最致命的一环。
每个场景和批次都带有一个summary(摘要)字段。翻译下一个批次时,ContextHelpers会把相关的前情摘要一起打包进提示词,让模型"知道刚才发生了什么、谁在说话"。
两个参数帮你控制"喂多少前情":
max_context_summaries:限制随批次附带的摘要数量。max_summary_length:限制每条摘要的最大长度。
这样既保证了上下文连贯,又不会因为塞太多摘要而挤爆模型窗口。
六、在 GUI 里手动微调:合并与拆分批次
自动拆分只是默认行为,你也能在图形界面里手动掌控场景与批次。相关操作都做成可撤销的"命令":
- 合并批次:GuiSubtrans/Commands/MergeBatchesCommand.py
- 拆分批次:GuiSubtrans/Commands/SplitBatchCommand.py
- 合并场景:GuiSubtrans/Commands/MergeScenesCommand.py
场景与批次以树形结构展示在侧栏(见 GuiSubtrans/Widgets/ScenesView.py),你可以逐层展开"场景 → 批次 → 行",精确到某一行去校对。整条翻译链路(从点击"开始翻译"到界面刷新)的时序,详见 docs/translation-flow.md。
七、关键参数速查表
| 参数 | 默认值 | 作用 |
|---|---|---|
scene_threshold | 60 秒 | 字幕静默超过此时长,视为新场景 |
max_batch_size | 100 行 | 超过此行数的批次会被继续拆分 |
min_batch_size | 10 行 | 避免产生过小的碎片批次 |
autosplit_on_error | 开 | 批次失败时自动对半拆分重试 |
max_context_summaries | — | 控制随批次附带的前情摘要条数 |
max_summary_length | — | 控制每条摘要的最大长度 |
这些参数都能在设置对话框中调整,定义见 GuiSubtrans/SettingsDialog.py,默认值集中在 PySubtrans/Options.py。
结语
LLM-Subtrans的"场景与批次"拆分,本质上是一套为 LLM 量身定制的分治策略:
- 用时间空档切场景,保证剧情完整;
- 用递归二分切批次,保证单次可控;
- 用上下文摘要串起前情,保证风格一致;
- 用自动拆分 + 可撤销命令兜底,保证翻崩也能救。
理解了这四步,你就能既享受 AI 翻译的流畅,又牢牢握得住每一幕的口吻与节奏。
【免费下载链接】llm-subtrans
Open Source project using LLMs to transcribe and translate subtitles (SRT, SSA/ASS, VTT)
相关推荐
Learn X in Y minutes 仓库 Java 教程全解:从基础语法到 Java 21 现代特性的完整实战指南
Learn X in Y minutes 仓库 Java 教程全解:从基础语法到 Java 21 现代特性的完整实战指南 本指南以 learnxinyminut
LLM-Subtrans关键参数详解:如何调优批次大小与温度,兼顾翻译质量与成本
LLM Subtrans关键参数详解:如何调优批次大小与温度,兼顾翻译质量与成本 LLM Subtrans 是一款开源的 AI 字幕翻译工具,使用 LLM 将
gpt-subtrans:开源字幕翻译工具
gpt subtrans:开源字幕翻译工具 项目介绍 gpt subtrans 是一款开源的字幕翻译工具,它利用大型语言模型(LLM)作为翻译服务,支持任意语言
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考