要点摘要
- OCR 交出来的是"文字块 + 坐标",没有语义,所以双语必须靠一套固定规则来排序
- 规则分六步:按行高分组 → 同一行中文在前英文在后 → 整帧合并 → 置信度过滤 → 繁简统一 → 相邻去重
- 这套排序是通用层,视频字幕、屏幕实时、图片、取词四条链路都走,不是双语模式专属
- 双语更建议走视频字幕提取而不是屏幕实时录制;要改文字,先导出 SRT 再改
中英双语字幕是最容易翻车的素材。单语字幕只要认得准,结果基本就能用;双语字幕认得挺准,出来却是"英文那行在上、中文在下",或者两行黏成一行,或者同一句话一会儿繁体一会儿简体,末尾还多了几条只差一两个字的重复。
这些都不是识别错了,而是识别之后那套排序规则在起作用。这篇把这条链路从头拆到尾:每一步在管什么、阈值定在哪儿、以及哪几类情况规则也管不了、得靠框选来配合。
根源:OCR 读的是坐标,不是语义
先接受一个事实:识别引擎不知道"这是字幕",更不知道"哪行是译文"。它交出来的是一个个文字块,每块带一段文字、四个角坐标和一个置信度分数。
也就是说,"中文在前、英文在后"这件事在原始结果里根本不存在——原始结果只有一堆坐标。如果直接按引擎返回的顺序拼起来,输出顺序就取决于检测框的生成顺序,同一条字幕在相邻两帧里都可能换个次序。双语之所以格外明显,是因为它有两块内容相近、位置固定、语言不同的文字,一旦顺序漂,观感就是整篇对调。
所以排序不能交给"看起来的顺序",得写成一套确定的规则。下面是这六步。
第一步:按行高把文字块分到"行"
先把所有块按垂直中心分组:取整帧的平均字高,用平均行高 × 0.8 作为容差,中心落在同一条带里的块算同一行;然后行与行从上到下排,同一行内按水平位置从左到右排。
这一步解决的是"上下两行对调"。它不看内容,只看几何,所以稳定:同一集剧、同一个播放器里,双语字幕的两行位置关系是不变的,分组结果也不会变。
容差用 0.8 倍行高是个折中——太松会把相邻两行并成一行,太紧会把同一行拆成两行(英文行字小、中文行字大时最容易拆开)。图片识别那条链路另有它自己的行容差,因为文档排版的行距和字幕不是一个量级。
第二步:同一行固定"中文在前、英文在后"
分到行之后,再加一条语言顺序规则:同一行里,中文块排在英文块前面,两边各自仍按从左到右。
怎么算"中文块"?看字符:只含中日韩字符的算中文;只含拉丁字母的算英文;中英混排的那一块,按字符数多的一方定归属——中文字符数不少于英文字母数,就算中文。这样"1999 年的那部片子"这类带数字的中文行不会被误判成英文,混排台词也不会随机漂到英文组里。
需要说明的是:这套规则不在某个"双语开关"后面。它在做结果组装的那一层,视频字幕、屏幕实时、图片识别、屏幕取词四条链路都会经过它。双语字幕出来的顺序稳定,是因为所有链路共用同一套排序。
第三步:整帧合并,以及置信度门槛
字幕链路把一帧里的多个块合并成一条:块与块之间用一个空格连接,行内不再产生换行,连续空白最后压成一个空格。这样中文行和英文行会落成同一条字幕里的两个片段——这也是"两行黏成一行"的由来,但它是有意为之:字幕要的是"一帧一条",不是一帧两条。
合并前后各有一道质量门:
- 低于 0.5 的文字块直接丢弃。识别置信度不到一半的结果,多半是画面噪声、字幕特效或者渐变中的半截字。
- 整块要求高于 0.7;只有一个字(去掉空格和标点后长度为 1)的块,要高于 0.85 才收。
为什么单字门槛更高?英文那一行里,一个 I、一个 a 被误认成别的字符毫无痕迹,而它一旦进了结果,看起来就是整句里的乱码。宁可丢掉一个真单字,也不要十次里错八次的假单字。
第四步:繁简统一
双语素材里常见的一种乱是繁简混出:同一句台词,这一帧是"這個電影",下一帧是"这个电影"。引擎偶尔会把简体字认成形近的繁体字,逐帧识别时就会来回跳。
字幕链路在合并之后统一做一次繁体转简体,用的是系统自带的字符映射(LCMapString),不是自己维护一张对照表。这一步放在去重之前——如果先比再做转换,"這個/这个"就会被判成两句不同字幕,重复条目就是这么冒出来的。
第五步:相邻去重,只跟前面几句比
字幕是逐帧读的,同一句话会被读到几十次。去重规则是两道:
- 先跟上一条比:相似度达到 85% 判为重复,丢弃。
- 再回看最近 5 条:防止"每帧错一个字"的链式漂移——同一句字幕从 A 漂到 B、再漂到 C,只比上一条就会输出三条各差一字的重复。只有 4 字以上的文本参与这道回看,因为"好""等等"这类短字幕真实重复本来就很常见。回看窗口本身保留 10 条。
这里有个刻意的设计:去重只判相邻,不做全局合并。如果拿每条结果去和整篇历史比,一句台词在第 3 分钟和第 47 分钟各出现一次(这在剧里太常见了),第二次就会被吃掉。相邻判断牺牲了一点精简度,换来的是"真的说过两遍的话,会留两条"。
第六步:进 SRT 时的时间轴收口
顺序稳了、重复去了,最后要解决的是时间轴。字幕只认"出现时刻",不认"消失时刻",所以时长全靠推断,规则是四条:
- 下一条出现,即视为上一条结束,两条之间不留缝。
- 单条最长 30 秒。两句字幕之间隔了很久,中间多半是没字的空档,硬撑到下一条会误导。
- 单条最短 1 秒,一闪而过看不清。但够不着就顶到下一条开始为止——宁可短,不可重叠,重叠会让播放器两条叠着显示,比短更糟。
- 最后一条按取帧间隔挂 1~5 秒。它后面没有下一条,总得有个长度;视频按抽帧间隔、屏幕按刷新间隔算,再夹到 1~5 秒之间。
时间轴本身怎么读、和 ASS/VTT/LRC 差在哪,见SRT、ASS、VTT、LRC 有什么区别。
规则管不了的那两类,靠框选补
上面六步都是几何 + 字符层面的判断,所以有两类情况它确实无能为力,得在框选时配合:
- 两行贴得太近,被并成一行。行容差是按平均字高算的,中英两行如果几乎压在一起,判成同一行不算错。把框选的下边界收紧到字幕区,或者只框字幕那一块,比事后手工拆行省时间得多。
- 装饰字把整行带偏。字幕特效、台标、进度条上的数字,都会进同一帧。区域只框字幕条本身,别把播放器整条控制栏罩进去。
多一处字幕要同时认的,可以按区域分别框、分别设间隔,做法见屏幕上有多处字幕,怎么一次同时识别。至于结果里出现了乱码、重复或者整句漏掉,那是另一条排查线,见识别不准、重复、乱码的排查顺序。
两条实操建议
一、双语优先走视频字幕提取,而不是屏幕实时录制。实时识别的输入是"当前屏幕那一帧",抽帧间隔默认 0.5 秒,一句滚得快的双语台词很可能只被读到半句;而视频文件识别是把整个文件按帧扫一遍,同一句会被读到很多次,去重反而有充分材料挑出最完整的那一条。在线播放没法直接给文件的场景,再看在线视频的字幕怎么提。
二、要改文字,先导 SRT,再改。时间轴和正文是两回事:一旦你在卡片上动过文字,系统就分不清哪段文字对应哪个时刻,会直接清掉这条时间轴——表现是导出里的 SRT 选项随之消失,TXT 不受影响。所以顺序应该是:先把 SRT 拿到手,再到字幕编辑器里改字。反过来做,就只能重跑一遍识别。
常见问题
双语要专门开什么模式吗?
不用。幕析 AI 版的识别按视频字幕、屏幕实时、图片、取词四类分,没有单独的"双语开关",上面这套排序在四条链路里都会生效。你正常框选、正常识别就行。
顺序还是反了,是不是规则失效了?
先确认是不是"同一行"。中文在上、英文在下,两行挨得又近,会被并成一行——这时输出的是"中文 英文"连在一条里,看起来像黏住而不是像反了。真正会让中英上下对调的是字幕本身放反(有些压制组把译文放上排),那是画面事实,任何按坐标排序的规则都会忠实照搬。
想要更专门的双语处理,有没有别的做法?
有。幕析图像专业版把双语单独做成了一整页功能——"中英对照识别",另外还有格式转换、时间轴编辑这些后续处理页。三个版本按意图怎么选,看专业版、标准版与 AI 版怎么选。
小结
双语字幕的顺序不是玄学:按行高分组、同一行中文在前英文在后、整帧合并、置信度过滤、繁简统一、相邻去重,最后做时间轴收口。六步都只依赖坐标和字符,所以结果稳定、可复现。剩下的两类问题(两行贴太近、装饰字混进来)规则管不了,靠把框收紧到字幕条来解决。真正要人工介入时记住一句:先导出,再改字。
现在就下载试试 ↓