版权与内容来源声明
本文为原创整理。文中涉及官方文档、开源仓库、论文与公开报道的内容,均在附表 A 中标注来源;引用官方原文保持原样,不作改写。文中命令、版本号与界面截图以本文成文时的实测/核验结果为准,标注「待验证」的部分请以你本地环境实际输出为判断依据。本文不推荐任何不合规的软件获取方式,也不对任何收益结果作承诺。转载请注明出处。
第1章 一条字幕不是一行字,是一条带时间的记录
客户在审片意见里写了一行:「这句里那个’的’太口语了,去掉。」
你在字幕面板里选中那个字,删掉,导出。成片回来一看,前半段还好,后半段字幕一路小跑,最后一句比配音早收了将近两秒。客户问:你是不是把时间轴动了?
你没动时间轴。你只删了一个字。
这在剪辑这行算常识性的坑,但它背后是一条很硬的规则:字幕的记录单元不是「文本」,是「时间码 + 文本」——这不是软件的设计选择,是格式层面的定义。
1.1 字幕面板看着是一列,其实是三列
在大多数剪辑软件里,字幕面板显示成一列文字,时间码被折叠起来了。所以你操作时的心理模型是「我在改一段文字」。
但文件里不是这样存的:一个序号、一行起止时间码、一段文本、一个空行,四样构成一条记录,缺一不可。
时间码(timecode),人话解释:把「第几时第几分第几秒第几毫秒」写成一个固定格式的字符串,播放器按它决定这条字幕什么时候出现、什么时候消失。
1.2 SRT 把「时长」单独存了一份,而且它不是从文本算出来的
SRT 是最常见的字幕文件格式,扩展名.srt。Matroska 官方文档对它的描述是「perhaps the most basic of all subtitle formats」,并把它拆成四部分,原文逐字是:
- A number indicating which subtitle it is in the sequence.
- The time that the subtitle appears on the screen, and then disappears.
- The subtitle itself.
- A blank line indicating the start of a new subtitle.
同一页还写明了第 2 部分在封装时怎么用,原文逐字是:
Part 2 is used to set the timestamp of the Block, and
BlockDurationelement.
这句话是整篇文章的地基。它说明:第二条记录里的「出现到消失」,在文件层面被拆成了一个时间戳加一个时长(BlockDuration),而时长就等于「结束时间码减起始时间码」。页面上给的例子是00:02:17,440 --> 00:02:20,375,对应时长00:00:02,935。
换句话说:一段字幕占多长时间,是独立写在时间码里的一个数,跟你写了几个字无关。文本改成十个字还是三十个字,那 2.935 秒一分不变。
没有任何机制把「字数」和「时长」绑起来,改字就会弄断两者之间的隐含关系。
1.3 于是「改一个字」永远同时在改两个量
一条字幕里能被算出来的量有三个:窗口时长(这条字幕在屏幕上待多久,单位秒)、有效字数、以及两者的比值——语速。
字数变了、窗口没变,语速就一定变。反过来,若你要让语速不变,窗口就必须跟着变,而窗口一动,它后面所有条目的时间基准全部跟着动。
| 字段 | 文件里存的是什么 | 你改文本时它会变吗 | 后果 |
|---|---|---|---|
| 序号 | 一个递增整数 | 不变 | 无影响 |
| 起始时间码 | 这条出现的时刻 | 不变 | 后续条目仍以它为准 |
| 结束时间码 | 这条消失的时刻 | 不变 | 窗口被锁死 |
| 文本 | 屏幕上显示的字 | 变了 | 字数变 → 语速被动变 |
| 隐含的语速 | 字数 ÷ 窗口时长,不存储 | 被动变了 | 观众感到忽快忽慢 |
表里最后一行是关键:语速不是文件里的字段,是算出来的。它没有地方可以改,只能被别的改动牵着走。
所以「改字幕」这个任务,从来不是文本任务,是时序任务。后面六章都在讲这句话怎么落地成可执行的判据。
第2章 先拆成三个可算的量:窗口、字数、语速
要把这件事变成能算的东西,先得把「感觉快了」翻译成数字——剪辑师一直在做这个翻译,只是没写成公式。
2.1 一条记录只有四行
SRT 里一条字幕长这样(本文实测样例的第 10 条):
10 00:00:37,100 --> 00:00:41,300 很多人把字幕当成文字的搬运,其实它是第二条音轨。四行:序号、时间行、文本行、空行。时间行里的-->两侧各有一个空格,毫秒用逗号而不是句点分隔——这一点和 WebVTT 不同,转换格式时最容易在这里出错。
格式本身没有正式规范,是二十多年里被播放器「认出来」的约定;Subtitle Edit 的格式参考页把「No official specification」列在缺点里(工具方文档,非标准组织发布)。所以各家容错程度不一:有的接受句点,有的直接拒绝。
2.2 三个量都能从一条记录里直接算出来
importre EFFECTIVE=re.compile(r"[\u4e00-\u9fff0-9A-Za-z]")# 汉字、数字、字母;标点与空格不计defcue_metrics(start_ms,end_ms,text):dur=(end_ms-start_ms)/1000.0# 窗口时长(秒)n=len(EFFECTIVE.findall(text))# 有效字数returndur,n,n/dur# 窗口、字数、语速(字/秒)print(cue_metrics(37100,41300,"很多人把字幕当成文字的搬运,其实它是第二条音轨。"))# (4.2, 22, 5.238...)三个返回值分别对应:窗口 4.2 秒、有效字数 22 字、语速 5.24 字/秒。
为什么要剔掉标点:标点几乎不占朗读时间,却占字符位;不剔的话,逗号多的句子会被算长,语速被低估。上面这条原文 24 个字符,剔掉两个标点后是 22 个有效字。
2.3 语速只能量出来,不能拍出来
中文口播的语速没有权威国标:播音主持有训练口径,影视字幕有平台规范,但都不构成「每秒必须多少字」的硬标准。所以本文的语速数字都是本机实测的经验值。
本文用 20 条中文 SRT 做样例:总时长 85.80 秒、有效总字数 379 字,整体平均 4.42 字/秒。逐条拆开看,快慢差得不小:
| 语速区间(字/秒) | 条数 | 样例中的代表条目 | 听感 |
|---|---|---|---|
| 3.5 – 4.0 | 2 条 | 第 1 条(3.87)、第 20 条(3.96) | 慢,适合交代信息 |
| 4.0 – 4.7 | 15 条 | 第 2 条(4.29)、第 19 条(4.50) | 主体节奏 |
| 4.7 – 5.4 | 3 条 | 第 10 条(5.24)、第 15 条(5.33) | 偏快,接近情绪高点 |
实测分布是:最小 3.87、中位 4.43、最大 5.33、标准差 0.36 字/秒。
这个标准差 0.36 很值得盯住。它不大,但它是节奏——一个人说话本来就有快有慢,慢的地方是停顿前的铺垫,快的地方是句尾的收。后面的实测会看到,一次「按字数比例重排」会把它压成 0.00。
第3章 只改字会怎样:20 条样例的实测
第一组实验:把 20 条台词交给模型改写(删虚词、换同义词、个别补全),时间码一个字不动。这正是「只改文字」的默认操作,也是多数人第一次踩坑的方式。
改写幅度很小:20 条里只有 4 条的字数偏差超过 15%,全片净变化 −7 字(379 → 372,−1.85%)。
3.1 一个字的价钱是 0.23 秒
按全片平均语速 4.42 字/秒算,一个字约等于 0.226 秒。
「只删一个的」看起来很无辜:单条只偏 0.2 秒出头,人眼看不出。但删字方向一致,误差就同向累加。
实测前七条里有六条在删字、第 4 条补了两个字,累计偏移仍然到了−2.56 秒。整片 85.8 秒,走到第 30 秒的时候,字幕已经比配音早了 2.5 秒。
3.2 偏移会累积,而且最深的地方不在片尾
不少人的直觉是「删字会让片尾提前收」,所以只看片尾。实测片尾累计偏移 −1.95 秒,而中途最深的一处是 −2.56 秒(第 7 条之后):前半段删得多,后半段有几条补了字,回补了一部分。
一条字幕平均在屏幕上待 4.3 秒,2.5 秒意味着它几乎和前后两条重叠。观众看到的是两行字挤在一起,或者前一句还没读完就被顶掉。
所以判据不能只看片尾。片尾是累计误差的代数和,中途的正负相消会把它掩盖掉。
3.3 六条塞不进自己的窗口
把每条的「新文本按原语速朗读需要多少秒」和「窗口有多少秒」一对比,20 条里有 6 条的文本放不进自己的窗口:第 4、8、9、10、15、20 条。单条偏移超过 0.5 秒的也是 6 条。
第 10 条最典型:原文 22 字、窗口 4.2 秒、语速 5.24 字/秒;改写后 27 字(+22.7%),若沿用本条语速,需要 5.15 秒——比窗口多出 0.95 秒。这 0.95 秒没有地方可去,只能往前压到下一条的开头。
这就是「时间轴全乱」的真实机制:不是时间码被改了,是文本不再适配它原来的时间码,而系统没有任何地方会告诉你这件事。
第4章 按字数比例重排,为什么更糟
看到上面那组数字,很多人的第一反应是:那就按字数重新分配时间呗,字多的给多点时间。
第二种做法:算出全片统一语速(新总字数 ÷ 原总时长),再按每条的字符数分配时长,从头顺次堆叠。重排(retime),人话解释:给每条重新分配时间,而不是只换字。听起来公平,实测结果反而更难看。
4.1 总账平了,切点全错
实测:重排后全片统一语速 4.34 字/秒,总时长 85.80 秒,与原片差 0.00 秒。片尾起点偏移 −0.04 秒,几乎为零。
单看这两个数,会以为它完美。
但逐条起点一对比,第 8 条的起点比原来早了3.28 秒(全片最大),平均绝对偏移 1.22 秒。原因在于:前半段几条被改短了,按比例分配后这段整体压缩,误差全部堆到第 8 条那里。
这暴露了比例重排的本质:它把「片长」守恒住了,代价是把每一处「本地时间」都借走了。片尾对得上,是因为借来的时间在片尾还了回去;中间那些画面切点不知道自己被借过。
4.2 语速被拉平,就是停顿被删掉
比例重排的第二个后果更隐蔽:全片每一条的语速都被拉到同一个值。
实测语速标准差从0.36 变成 0.00。原来第 15 条是 5.33 字/秒(偏快的收尾句),重排后被压到 4.34,慢了 18.7%;原来第 1 条 3.87 字/秒(慢速铺垫),被拉到 4.34,快了 12%。
从数字上看每条都「合规」了——没有超速,也没有拖沓;但听感上这个人的语气没了:该慢的地方变快,该快的地方变慢。
这就是为什么「字数比例」不能作为重排依据。字数只描述文本有多长,不描述这句话该说多快。一个人说「然后呢」三个字可能用两秒,说「这条片子还不该动」九个字也可能用两秒——字数比例看不到这个差别。
4.3 不借时间的做法,也有代价
第三种做法是在本条窗口内重排:起点、终点都不动,只把文本按字数比例铺进去。它不借时间,所以不会推走别人的切点。
| 处理方式 | 片尾偏移 | 最大起点偏移 | 语速标准差 | 主要风险 |
|---|---|---|---|---|
| 只改文字、保留原时间码 | −1.95 秒 | 单条最大 +0.95 秒 | 不变(0.36) | 误差累积,中途最深 −2.56 秒 |
| 全局按字数比例重排 | −0.04 秒 | −3.28 秒 | 0.36 → 0.00 | 切点错位、节奏被抹平 |
| 本条窗口内重排 | 0 秒 | 0 秒 | 不变(0.36) | 语速被动抬高,可能读不完 |
第三行看起来最干净,但它有一个绕不开的数学事实:窗口一旦固定,语速就等于「字数 ÷ 窗口」,没有第二个解。所谓「窗口内重排」只能决定文本在哪里断行、每个分句占多少显示时间,改不了语速本身。
所以窗口内重排必须配一个兜底:语速超过上限的条目,不允许静默输出(出错了但没有任何提示,直接流到成片)。这就是第 5 章判据四的由来。
顺带说清「锚点」这个概念。锚点条目(anchor cue),人话解释:这一条字幕的起止时刻和画面上的某个点绑死了——硬切点、字幕与人物口型对齐点、图表出现的瞬间。这类条目的窗口不是「可以商量的时长」,是「画面的位置」。实测三处锚点在比例重排下分别偏移 −1.64 秒、−2.82 秒、+1.48 秒,任何一处都足以让观众看出「字幕和画面对不上」。
第5章 四条判据:把「改字幕」变成时序任务
到这里,前面三组实验已经给出了问题清单。这一章把它收敛成四条可以照着执行的判据——不需要理解模型,只需要会看数。
5.1 判据一:字数偏差超过 15%,就必须动时间
判据:单条改写前后的有效字数偏差超过 15%,这条必须重排时间(或改窗口),不允许只改字。
15% 这个阈值的来由是实测:偏差在 10% 以内的条目,单条偏移基本在 0.5 秒内,人眼可以容忍;超过 15%,偏移就接近一条字幕的平均停留时长。
样例里超过 15% 的有 4 条:第 3 条 −17.6%、第 10 条 +22.7%、第 15 条 +25.0%、第 17 条 −15.8%。这 4 条正是后面出问题最集中的 4 条。
阈值不是绝对的:节奏快、停留时间短就收到 10%;慢节奏口播放到 20% 也行。关键不是 15 这个数字,是有没有一个数字。
5.2 判据二:重排只在本条窗口内,不跨条借时间
判据:本条超出窗口的量,只能通过「缩短文本」或「改本条窗口」消化,不允许从前一条或后一条借时间。
理由在 4.1 已经量过:跨条借时间会把误差传给下一条,而下一条的窗口边界往往是画面切点。借一次的代价不是 1 个偏移,是「从这条开始所有条目一起偏」。
执行时的顺序建议是固定的:先看能不能缩文本(去掉可省的修饰词),缩不下来再动窗口,动了窗口就把新时间码写回去并重算后续条目的语速。一次只动一项,动了就重算,这样出问题能归因。
5.3 判据三与判据四:锚点不动,语速兜底
判据三:有画面锚点的条目不参与长度重排,超出就缩文本,缩不到就报错让人判断。
这条判据的作用是「保住不能被借走的东西」:锚点条的窗口由画面决定,模型再会写文案也改不了画面。实测三处锚点在比例重排下偏移 −1.64 / −2.82 / +1.48 秒;按判据三处理则恒为 0。
判据四:语速上限作为兜底校验,超了就报警,不静默输出。
上限取多少?本文取6.0 字/秒,约等于样例中位语速 4.43 的 1.35 倍。这是经验值,不是标准,作用是拦住明显读不完的条目。你自己定时,用「成片里最快的那条再上浮一成」来取,比抄数字靠谱。
实测在 6.0 的上限下,20 条里有 2 条被拦下:第 10 条(27 字 / 4.2 秒 = 6.43 字/秒)、第 15 条(20 字 / 3.0 秒 = 6.67 字/秒)。全片最大单条语速 6.67,通过校验的 18 条里最大 5.00。
| 判据 | 触发条件 | 动作 | 不做会怎样 |
|---|---|---|---|
| 一 | 单条字数偏差 > 15% | 重排本条时间,或改窗口 | 偏移累积,中途最深可达 2.5 秒 |
| 二 | 本条文本超出窗口 | 只在本条内缩文本或改窗口 | 跨条借时间,切点全体位移 |
| 三 | 条目带画面锚点 | 不参与长度重排,只缩文本 | 锚点偏移 1.5–2.8 秒,明显穿帮 |
| 四 | 本条语速 > 6.0 字/秒 | 报警并拦下,等人处理 | 字幕读不完,观众放弃阅读 |
这四条合起来,把「改字幕」从一件凭手感的事,变成了一件有输入、有校验、有拦截的事。
这份资料里有什么:本文这套「窗口—字数—语速」的换算关系,我配了一份可以直接对照的术语与判据清单,和本章的四条判据配套使用。放在资料包里,扫码即可获取:
第6章 落到代码:一个能报警的校验器
判据要能执行,最终得变成函数。本章核心就是一个返回「问题清单」的函数——它不负责改,只告诉你哪几条不能放行。
6.1 校验函数
defcheck(cue,new_text,cap=6.0,delta=0.15,anchors=()):"""cue: {idx, start, end, dur, text};返回问题列表,空列表表示可放行"""old_n,new_n=chars(cue["text"]),chars(new_text)dur=cue["dur"]/1000.0rate=new_n/dur bad=[]ifabs(new_n-old_n)/old_n>delta:# 判据一bad.append("字数偏差 %.1f%% 需重排本条时间"%(abs(new_n-old_n)/old_n*100))ifrate>cap:# 判据四bad.append("语速 %.2f 超上限"%rate)ifcue["idx"]inanchorsandnew_n>old_n:# 判据三bad.append("锚点条目不允许变长")returnbad三个分支对应三条判据:字数的、语速的、锚点的。判据二不写在函数里,它靠「只接收本条 cue」这个设计保证——拿不到邻居的窗口,就借不了时间。
这种「用接口形状约束行为」的写法值得记住:有些规则不该靠调用方自觉,该靠参数拿不到。
6.2 跑在 20 条样例上
把上一章的函数套到实测样例上,输出是:
| 检查项 | 命中条数 | 命中条目 | 说明 |
|---|---|---|---|
| 字数偏差 > 15% | 4 | 第 3、10、15、17 条 | 需重排本条时间 |
| 语速 > 6.0 字/秒 | 2 | 第 10、15 条 | 需缩文本或改窗口 |
| 锚点条目变长 | 1 | 第 9 条(+2 字) | 锚点只允许缩短 |
| 可放行 | 15 | 其余条目 | 直接输出 |
15 条可放行、5 条需处理(第 10、15 条各命中两项)。这五条若被静默输出,就会出现「字幕比配音快 0.9 秒」和「一句话读不完」两类问题——它们在预览窗口里极难发现,只在客户看片时暴露。
6.3 接进流程
日常用法是把校验放在「导出前」这一步,对整份新字幕跑一遍:
⚠️代码待验证
python subtitle_check.py old.srt new.srt--cap6.0--delta0.15# 退出码非 0 表示有被拦条目,不要导出这条命令依赖一个没有随附的脚本subtitle_check.py(命令行封装未实测),所以标为待验证。判断标准很简单:跑完看退出码,非 0 就不要导出。
如果你的流程在剪辑软件里,可以先用「导出 SRT → 校验 → 导回」的方式过渡,不必一步到位改成脚本流水线。
第7章 从剪辑台到大模型:这套手艺能带走的部分
这篇讲的是一件很小的活:改字幕。但它把剪辑师最值钱的一种能力露了出来——把凭感觉判断的事,翻译成可以写在纸上的数。
7.1 你已经在做的三件事,就是模型工程的一部分
第一件:你知道每条约束从哪来。字幕窗口不能超,不是因为审美,是因为下一条画面要进来。这种「边界来自上下游」的判断力,在搭模型应用时就是「约束从哪一层来」的判断力。
第二件:你会做取舍,并且知道取舍的代价。缩文本还是改窗口,是两种代价不同的方案。这和模型侧选「缩短输出」还是「放宽超时」是同一类问题。
第三件:你习惯看中间过程,而不是只看结果。剪辑师不会只看成片最后三秒,会逐帧过。模型应用里对应的动作是:看每一条请求的中间状态,而不是只看接口有没有返回。
7.2 要补的三块,按顺序补
第一块:把「时间」换成「token」时的那次换算。token,人话解释:模型处理文本的最小单位,一个汉字通常对应一到两个 token。做字幕相关的大模型应用(自动翻译、自动改写),你要能算出「这条字幕允许模型输出多少 token」,否则模型会写出塞不进窗口的句子——和本文第 3 章的问题一模一样。
第二块:把单条校验变成批量评测。你现在的校验是「一条一条看」,工程化之后要变成「一批字幕跑一遍,输出命中率与命中条目清单」。评测集不需要很大,几十条覆盖典型句式就够用,关键是每次改规则都重跑一遍,看命中条数是升是降。
第三块:让失败可见。本文反复出现的词是「静默输出」——错了但没人知道,是最坏的一种错。做模型应用时同理:宁可多一条报警,也不要让一个超限的结果悄悄流到下游。
至于微调、分布式训练这些,跟这条路的第一步没关系,不用现在碰。
7.3 交片前的自检清单
| 检查项 | 怎么查 | 通过标准 |
|---|---|---|
| 改写前后的字数是否逐条比过 | 逐条算有效字数,剔标点 | 偏差 > 15% 的条目都已处理 |
| 是否有条目跨条借了时间 | 看本条窗口是否被改动,动了就重算后续 | 没有任何一条的时间来自邻居 |
| 锚点条目是否被动过 | 对照画面切点清单 | 锚点偏移为 0 |
| 语速是否全部在上限内 | 逐条算 字数 ÷ 窗口 | 无条目超上限,或超的全部已处理 |
| 校验结果是否留了记录 | 保存命中清单与处理方式 | 事后能回答「这条为什么这么改」 |
这份资料里有什么:如果你打算顺着这条路往模型侧走,我把「从传统岗到能自己搭一个应用」的学习顺序整理成了一份路线,和本章的三块补法对应。放在资料包里,扫码即可获取:
附表 A:本文引用事实与出处对照表
| 编号 | 事实(本文中的表述) | 出处 | 本文位置 |
|---|---|---|---|
| A-01 | SRT 由四部分组成:序号、出现与消失的时间、字幕文本、表示新字幕开始的空行 | Matroska 官方文档《Subtitle Codecs》(https://www.matroska.org/technical/subtitles.html),原文逐字引用 | 第 1 章 1.2 |
| A-02 | SRT 封装进 Matroska 时,时间行用于设置 Block 时间戳与BlockDuration元素,文本转为 UTF-8 | 同上,原文逐字引用 | 第 1 章 1.2 |
| A-03 | 示例时间码00:02:17,440 --> 00:02:20,375对应时长00:00:02,935 | 同上 | 第 1 章 1.2 |
| A-04 | SRT 没有正式规范,是被播放器广泛接受的约定;毫秒以逗号分隔,WebVTT 用句点 | Subtitle Edit《SubRip (SRT) Format Reference》(http://subtitleedit.github.io/subtitleedit/reference/subrip.html)。该页为工具方文档,非标准组织发布 | 第 2 章 2.1 |
| A-05 | 时间码格式为HH:MM:SS,mmm,时分秒两位补零、毫秒三位 | A-03 的官方示例 + A-04 的格式参考,两处一致 | 第 2 章 2.1 |
| A-06 | 20 条样例总时长 85.80 秒、有效总字数 379 字、平均语速 4.42 字/秒;逐条语速最小 3.87、中位 4.43、最大 5.33、标准差 0.36 | 本机实测(work/2026-10-24_02_时间轴实测.py,输出见work/2026-10-24_02_时间轴实测.log) | 第 2 章 2.3 |
| A-07 | 模式①(保留原时间码):片尾累计偏移 −1.95 秒,最大单条正向 +0.95 秒(第 10 条),累计最深 −2.56 秒(第 7 条后),6 条文本放不进本窗口 | 同 A-06 的本机实测 | 第 3 章 3.2、3.3 |
| A-08 | 模式②(全局按字数比例重排):统一语速 4.34 字/秒,总时长 85.80 秒(差 0.00),最大起点偏移 −3.28 秒(第 8 条),平均绝对偏移 1.22 秒,片尾 −0.04 秒,语速标准差 0.36 → 0.00,单条语速最大变化 18.7%(第 15 条) | 同 A-06 的本机实测 | 第 4 章 4.1、4.2 |
| A-09 | 三个锚点在模式②下的起点偏移:第 3 条 −1.64 秒、第 9 条 −2.82 秒、第 16 条 +1.48 秒 | 同 A-06 的本机实测 | 第 4 章 4.3、第 5 章 5.3 |
| A-10 | 模式③(窗口内重排 + 语速上限):上限 6.0 字/秒,拦下 2 条(第 10 条 6.43、第 15 条 6.67),通过 18 条,通过条目最大语速 5.00 | 同 A-06 的本机实测 | 第 5 章 5.3、第 6 章 6.2 |
| A-11 | 校验函数在样例上的命中:字数偏差 > 15% 共 4 条、语速超限 2 条、锚点变长 1 条 | 同 A-06 的本机实测(校验函数在实测脚本同一数据上复跑) | 第 6 章 6.2 |
| A-12 | 语速上限 6.0 字/秒的取值方式(中位语速 4.43 的 1.35 倍) | 本文经验口径,非标准。中文口播语速无权威国标,该值仅用于拦明显读不完的条目 | 第 5 章 5.3 |
| A-13 | 第 6 章 6.3 的批量校验命令 | 待验证:subtitle_check.py未随本文提供,命令行封装未实测;核心函数已实测 | 第 6 章 6.3 |
附表 B:术语速查表
| 术语 | 一句话解释 | 位置 |
|---|---|---|
| SRT | 最常见的字幕文件格式,扩展名.srt,一条记录四行 | 1.2 |
| 时间码 | 把时分秒毫秒写成固定格式的字符串,决定字幕何时出现与消失 | 1.1 |
| 窗口(时间窗) | 一条字幕在屏幕上停留的那段时间,等于结束码减起始码 | 1.3 |
| 有效字数 | 只数汉字、数字、字母,标点与空格不计 | 2.2 |
| 语速 | 有效字数除以窗口时长,单位字/秒,文件里不存储,算出来的 | 1.3 |
| 偏移量 | 改写后的文本所需时刻与原时间码之间的差,单位秒 | 3.1 |
| 累计偏移 | 从片头开始把各条偏移逐条相加的结果 | 3.2 |
| 重排 | 重新分配时间,常见两种:跨条按比例重铺、只在本条窗口内铺 | 4.1 |
| 锚点条目 | 起止时刻与画面某个点绑死的字幕条,窗口不可商量 | 4.3 |
| 偏差阈值 | 改写前后字数变化的比例上限,超过就必须动时间 | 5.1 |
| 兜底校验 | 最后一层拦截,超限就报警而不是放行 | 5.3 |
| 静默输出 | 结果已越界但系统没有任何提示,直接流到下游 | 6.2 |
| token | 模型处理文本的最小单位,一个汉字通常对应一到两个 | 7.2 |
写在最后:这篇用到的资料
写这篇文章时,把相关的官方文档和源码又翻了一遍,顺手也整理了几份配套的东西:
- 大模型学习路线图:从零基础到能自己动手做 Agent,按阶段说明每一步该学什么、哪些可以先跳过
- 《LangChain + LangGraph + MCP 智能体开发实战》视频课:7 个模块,从私有化部署、Embedding+RAG 到 MCP+Agent 全流程
- AI 大模型知识库(在线可查):Agent Skills 从入门到落地、Claude Skills 完全指南等专题,按目录浏览即可
- 640 套 AI 大模型行业报告 + 经典 PDF 书籍:看行业落地案例和别人怎么做的时候用得上
- 大模型零基础到精通教学视频:跟着敲一遍,比只读文档快得多
资料是我自己整理的,放在下面这个码上,扫码即可获取:
添加时备注「AI」,优先通过。
资料按「先路线、再动手、最后查漏」的顺序整理好了,建议先看学习路线那一份,照着它挑一条适合自己当前基础的路径再往下看。