跳到主内容

技术科普

一帧画面变成一行字,中间要过十道工序

MX幕析图像 2026.10.26 10 分钟阅读

要点摘要

  • 识别不是一次完成的:从画面到一行字要过十道工序,取帧 → 裁剪 → 增强 → 加边 → 模型推理 → 块级预筛 → 排序 → 整帧组装 → 字幕清洗 → 去重与时间轴
  • 模型只回答"这块像什么字、有多确信",顺序、繁简、重复、时间轴全是它之后的规则在做
  • 每一道都有写死的阈值:块级置信度 0.5、整块 0.7、单字 0.85、行分组容差平均行高 × 0.8、相似度 85%、字幕条高不足 120 像素放大 2 倍
  • 识别全程在本机完成,画面和截图都不上传;只有之后的 AI 加工才会把文字发出去
  • 漏句、重复、顺序乱、繁体混进来,都能对号入座到某一道工序,该调的是那一道的输入,而不是把整段重跑一遍

字幕识别看起来像"软件看了一眼画面,把字念出来"。真跑起来不是这样。模型确实只做了认字这一件事,而且它交出来的东西比大多数人预期的粗糙——一堆带坐标的文字块,顺序是检测框的生成顺序,繁简混着,同一句话在相邻两帧里各出现一次。你最后读到的那份整齐字幕,是这堆粗糙结果过了十道处理之后剩下的东西。

这篇按执行顺序把十道拆开讲:每一道在管什么、阈值定在哪、它出问题的时候你会看到什么现象。文中的数字都是产品里实际生效的那一套,不是示意值。

先给个全景

工序 在管什么
1 取帧把视频或屏幕变成一张张静态图片
2 裁剪只留你框的那块字幕区,别的一概不看
3 增强又扁又小的字幕条放大、拉对比度
4 送样转成模型认得的像素格式,四周补一圈白边
5 推理本地模型找出哪里有字、每处是什么字
6 块级预筛置信度太低的块、完全重复的块先扔掉
7 排序按行分组,行从上到下、行内中文在前
8 组装整帧压成一行,繁简统一、空白压掉
9 清洗幻觉字、乱码、无意义短串逐条判掉
10 收口帧间去重,给每句算开始与结束时间

前五道解决"喂给模型的是什么",后五道解决"模型吐出来的怎么用"。真正决定观感的是后五道——同一段视频,模型输出的原始块几乎没变过,变的是规则。

前五道:把画面送到模型面前

第 1 道:取帧

模型一次只看一张静态图,所以第一步是把时间轴切成离散的画面。

  • 视频文件:按设定的识别间隔抽帧,间隔 0.5 秒就是每秒两张。默认值就是 0.5 秒,可调。抽帧由随安装包一起带的 ffmpeg 完成,参数核心是一条 fps=1/间隔 的滤镜,同时关掉音轨。
  • 屏幕实时识别:按同样间隔对屏幕上的框选区域截一张图,截出来的是内存里的 PNG 字节,不落盘。
  • 取词:只截当前这一帧,认完就停,不做累积。

视频链路是边抽、边认、边删的流水线:抽帧进程还在跑,识别已经吃着前面出来的帧,一张认完就把那张临时图删掉。所以两小时的视频不会先在磁盘上堆出几千张图,占的空间始终只有正在处理的那几张。

还有一件小事:视频任务在让你框字幕区域之前,会先抽 4 到 6 张样帧(时长超过 120 秒取 6 张,否则 4 张)摊给你看。这不是装饰——字幕在画面里的位置千奇百怪,先看到真实画面,框得才准。

第 2 道:只认你框的那一块

你框的区域以 0~1 的归一化坐标存着,识别时才换算成像素并裁出来。这一步有两个细节值得知道:

  • 裁出来的最小边不小于 32 像素。区域画得极扁的时候,硬塞给模型会让原生层崩掉,所以有个下限兜着。
  • 贴边区域先夹宽高、再夹原点。贴着画面右缘或下缘框的区域,如果先保证最小边,就会算出超出图像边界的结果,整帧白认。顺序反过来才不会错。

这也是为什么"把框收紧到字幕那一条"是排查识别问题时最有效的第一招:框里混进了台标、进度条、弹幕,模型会照样去认,认出来的东西再靠后面的规则拦,成本比一开始就别喂进来高得多。

第 3 道:字幕条的轻量增强

字幕条的典型形态是又宽又扁、字很小。这一道只做两件事:

  • 高度不足 120 像素就整体放大 2 倍,用高质量双三次插值。
  • 做一次适度的对比度增强(强度 +20,按 ColorMatrix 一次算完,不逐像素遍历)。

注意它的作用范围:只有字幕链路走这一步。图片识别和文档截图故意不增强——那种图里字本来够大,激进预处理反而会丢字。屏幕实时识别走的是更稳的两遍策略:先拿原始截图认一遍,只有这一遍什么都没认出来,才用增强过的图再跑一遍,专门捞那些淡而小的字幕;两遍都空就返回第一遍的结果。

第 4 道:转格式、加一圈白边

模型不认带透明通道的位图,先统一转成 24 位 RGB;转的时候背景铺白,所以半透明截图不会变成一团黑。然后四周补 20 像素白边再送进去——紧贴图像边缘的文字容易被切掉半个字,加一圈边能显著提高边缘的识别率。

第 5 道:模型跑两级识别

这一步跑在你自己的机器上,模型文件随安装包一起装好,画面内容不出本机。它内部分两级:先做文本检测(哪里有字,给出四个角坐标),再对每一处做文本识别(这串像素是什么字,附带一个 0 到 1 的置信度分数)。方向分类那一级的开关是关掉的——字幕不会竖着倒着出现,省下来的是实打实的耗时。

输出可以想成一张清单:每行是一个文字块,带文本、矩形坐标、置信度。单帧有一道 120 秒的超时保护;连续 5 帧失败会直接报错停下,而不是闷声输出一份空结果——早期版本吞过异常,"引擎没起来"和"这帧确实没字"在前端长得一模一样,只能对着空白发呆,现在这两种情况会被明确区分。

后五道:把一堆块变成一行字

第 6 道:块级预筛

模型给出的清单先粗筛一遍:置信度低于 0.5 的块直接丢;位置和内容完全相同的块只留一个(重叠检测框很常见,不处理就会出现同一句紧跟着出现两遍)。

这一道的门槛刻意设得比后面松。原因很实在:块级丢掉的字符再也捞不回来,宁可让后面几道带着上下文再判。

第 7 道:按行排序

模型返回的顺序取决于检测框怎么生成,跟人的阅读顺序无关。所以必须显式排:取整帧平均字高,用平均行高 × 0.8 作为容差把块分到各行,行从上到下,行内按水平位置;同一行里中文块排在英文块前面。中英双语字幕为什么不会乱跳,那篇讲得更细:《中英双语字幕的顺序为什么不会乱跳?》。

第 8 道:把一块块拼成一行

字幕场景下,一帧里的多个块通常属于同一句话,所以这一道把整帧压成一行:先做更严的置信度过滤——整块要高于 0.7;如果去掉空格和标点之后只剩一个字,那要高于 0.85 才留(单字最容易认错,门槛必须更高);再过一遍噪声判定,判不过的直接不要。留下的块用空格相连,接着繁体统一转成简体(走系统自带的繁简映射),最后去掉换行、把连续空白压成一个空格。

繁转简放在去重之前是有原因的:同一句话一帧认成繁体、一帧认成简体,不去统一就会当成两句各留一遍。

第 9 道:字幕级清洗

这一道处理的都是"看着就不像人话"的东西,规则是一条条堆出来的:

  • 不可见字符先清,首尾的非文字字符剥掉。
  • 形似字整词纠错,比如"什公"改回"什么"、"怎公"改回"怎么"——只在这两个组合上改,不做全局替换,免得把对的字改错。
  • 单字与双字白名单/黑名单:常用应答字(好、行、对、嗯)放行,生僻字和无意义的双字组合判掉。
  • 句尾幻觉字:模型爱在句子末尾多吐一个字,这类尾巴最多连截两层,不敢多截。
  • 乱码判定用强特征:连续四个以上相同字母、已知的一批乱码片段、字母组合里完全没有元音、大小写来回跳(cYalbl 这种)——都判为噪声。
  • 中文句子里夹一个孤立英文字母,或者中文占比很高却跟着一串乱英文,判掉。

这套规则是字幕场景专用的。图片识别和取词不套这层清洗:文档截图里"个人""2024""A 选项"都是有效内容,按字幕标准会被误删。

第 10 道:帧间去重与时间轴收口

连续两帧拍到的是同一句字幕,不去重就会录成两句。做法是算两段文本的编辑距离相似度,相似度 ≥ 85% 就当作同一句丢掉。只比上一条不够——字幕是逐字拼出来的,中间错一个字就会被判成两句一路累积下去,所以还会回看最近 5 条;回看只对 4 个字以上的内容生效,短应答句("好""对")本来就容易撞,宁可留也别误删。

时间轴是事后算的:下一条出现的那一刻,就是上一条的结束时间;末条没有下一条,按 1 到 5 秒兜一个时长。另外两条硬规矩——单条最长 30 秒、最短 1 秒,同一时刻出现的极端情况给 0.1 秒。原则是宁可显示短一点,也不能让两条重叠,因为重叠导进剪辑软件就是乱轴。格式与时间轴的更多细节在这篇:《SRT、ASS、VTT、LRC 有什么区别?字幕格式与时间轴一次讲清》。

规则越强,副作用越要讲清

第 6 到第 9 道本质都是"拦掉不像话的",那就一定有误拦。最常见的三种:

  • 短句被吃掉。单个字、两三个字的应答句最容易撞上噪声规则。这是字幕场景的取舍:宁可少一句"嗯",也别满屏乱码。
  • 纯英文的专有名词被误判。没有元音的缩写、大小写混着写的品牌名,会被当成乱码组合。
  • 间隔调大就漏句。一句字幕停留 1 秒,抽帧间隔 2 秒,它一帧都没赶上——这不是识别错了,是根本没拍到。

所以结果不对的时候,先判断是哪一道的问题再动手,别盲目重跑。完整的排查顺序(框选 → 语言功能页 → 识别间隔 → 画面与播放 → 结果整理)在这篇里:《字幕识别不准、重复、出现乱码?按这个顺序排查》。

哪一道出问题,会看到什么现象

现象 大概率在哪一道
整句缺失、快速闪过的字幕没录到第 1 道:识别间隔太大,那句没被抽到
台标、进度条数字混进结果第 2 道:框选区域太宽
小字幕糊成一片、错字集中第 3 道:源画面太小,增强也救不回
同一句出现两遍、只差一两个字第 10 道:相似度没到 85%,两条都留下了
中英文行顺序对调第 7 道:两行贴得太近被并成一行
末尾冒出孤立单字或怪符号第 9 道:清洗规则的边界情况
时间轴整体偏移都不是:这是时间轴问题,用整体偏移改

常见问题

识别是在本地还是云端跑的?

本地。抽帧、截图、检测、识别、排序、清洗、去重、导出全在你这台机器上完成,画面内容不会上传。需要联网的是登录、会员状态、AI 加工等场合,具体清单见隐私政策;把识别结果交给 AI 校对或翻译,那一步才会把文字发出去。

为什么间隔调大会漏句,调小又会重复?

因为间隔决定了同一句字幕被拍到几次。调大,短字幕一次都拍不到;调小,同一句被拍到很多次,去重就要承担更多判断,偶尔会有一帧错一个字、相似度没到 85% 而漏网,看起来就是重复了一句。默认 0.5 秒是这两头之间取的折中,语速特别快的内容可以再调小。

表格模式为什么有时还原不出行列?

表格模式走的是另一条组装路径:按文字块的坐标推断行列——行用垂直中心的贪心聚类,列用左边缘聚类,然后拼成 Markdown 表格,可以再导成 CSV。它有几条明确边界:块数太少、只能聚出一行、或者列数超过上限,都会判成"这不是表格",直接退回普通多行文本而不是硬凑一个错表。合并单元格、斜线表头在图上没有清晰的行列线索,还原不了。用法细节在《屏幕取词与图片转文字怎么用?》里。

小结

把这条链路记住,遇到结果不满意时就不会只剩"再跑一遍"这一招:前五道决定模型看到什么,后五道决定你拿到什么。漏句查第 1 道的间隔,脏结果查第 2 道的框选,糊字查第 3 道的源画质,重复和顺序查第 7 与第 10 道,末尾的怪字查第 9 道。规则是死的,素材和框选是活的——真正能调的输入,永远比改规则来得快。

想亲手看这条链路跑起来的效果,可以下载幕析图像跑一段素材;要识别完顺手做校对、翻译和总结,看幕析 AI 版。三版怎么选在这篇:《专业版、标准版与幕析 AI 版怎么选?附三版功能对比表》。

下载幕析图像,亲眼看着一帧帧变成字幕

十道工序全在本机跑完,画面不上传,结果可导 TXT 与 SRT,识别间隔与框选区域都能自己调。

立即下载