☰
深度解析LLM-Subtrans:字幕如何被拆分成场景与批次,让AI翻译永不跑偏
2026/11/5 5:22:15 网站建设 项目流程

【免费下载链接】llm-subtrans

Open Source project using LLMs to transcribe and translate subtitles (SRT, SSA/ASS, VTT)

项目地址:https://gitcode.com/gh_mirrors/gp/llm-subtrans
点击查看免费下载

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()里,算法逐行扫描:

  1. 计算相邻两行字幕之间的时间间隔(gap)。
  2. 一旦gap超过阈值scene_threshold(默认约60 秒),就切断,开一个新场景。
  3. 其余行归入当前场景。

也就是说:字幕长时间不出现 = 剧情切换 = 新场景。你完全可以在设置里调整这个阈值,让场景切得更细或更粗。

三、第二步:场景内递归切成批次(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_threshold60 秒字幕静默超过此时长,视为新场景
max_batch_size100 行超过此行数的批次会被继续拆分
min_batch_size10 行避免产生过小的碎片批次
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)

项目地址:https://gitcode.com/gh_mirrors/gp/llm-subtrans
点击查看免费下载
上一篇:iPhoneMirror低延迟渲染原理:D3D11+DirectComposition解码与显示管线深度剖析
下一篇:Kiln 代码规范审计全景指南:从 Config 单例到 God File 的工程债清单与治理规则

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询