从截图里复制文字通常都能成,问题也正出在这里。
它失败的时候,很少失败得明显:没有红色波浪线,没有「无法识别文字」,也没有空白的框。交回来的是一句读起来完全通顺的话——只有一个字不对,而这一个字改变了意思。
所以人们会贴出一个少了一位的订单号、一个字母写错的配置项、一句文档里凭空多出来的字。识别没有崩,它只是很有把握地猜错了。
识别是分类器,不是解析器
先搞清楚引擎到底在做什么,会好理解得多。
文字识别先把图像切成行,再切成一个个字符形状的区域,然后让每个区域过一个分类器,返回最可能的那个字符。这个分类器从不说「我不知道」,它永远返回它找得到的最近匹配。
输入质量好的时候,这个最近匹配几乎处处都对。质量差的时候,最近匹配就是另一个碰巧长得很像的字符:可能是 o 的 a,可能是 l 的 1,或者是一个和邻居共用偏旁、很容易认错的中文字。引擎根本不知道它错了。
什么样的输入算「差」
按影响大小排,有四件事:
- 文字在像素上的高度。 字越小,可用来分类的像素越少。这一项影响最大。
- 字符集。 中文、日文、韩文字形密集,丢几个像素既改变形状也改变身份;拉丁字母笔画简单,撑得住更大的缩小。
- 抗锯齿与缩放。 每一次缩放都会把每一笔的边缘混一遍。缩一次没事;叠着缩三次,形状就没了。
- 对比度与背景。 灰字白底、浅字深底,边缘都更弱。文字背后的渐变和照片同理。
大部分「识别不准」的反馈来自第一条,而解决办法通常是截到更多像素,不是更用力地试。
InSnap 没有单独的精度设置,它就用你选的像素:1x 屏幕上的截图,每行文字就是屏幕画出来的高度;Retina 2x 抓下来的,是双倍。对于同一段文字,这两者之间的差别,往往就是「对」和「看着对」之间的差别。
实用的那条线在哪儿
与其猜,不如做一个能重复的小测试:把同一句话按几种字高渲染出来,逐张去识别,再把结果和原文逐字对比。
下面两张图就是这么来的——用的是本地引擎的真实输出,不是编出来的例子。同一句中文、同一句英文,按五种字高各渲染一次、各识别一次,和原文不一样的字标成红色。
从图里能看出两件事。
第一,它是对着对着一整个不对的,没有渐进的过程:只存在一个高度,低于它,错字就出现了。
第二,两种文字断掉的位置不一样。 这一次拉丁字母先撑不住,中文反而更耐用——这和很多人「中文更难」的直觉正好相反。
再把同样的句子缩得更小去识别,输出就换了一种错法:不是空的,也不是乱码,而是一句真话,里面全是真字,只是错了:
第二张图才是最有用的那张。它展示了「错的结果」到底长什么样:不明显到你会注意到,也不微小到等于没有。
怎么在它进文档之前发现
识别器没法告诉你它不确定,所以只能在「错一个字代价很大」的地方自己查。
- 带数字和编号的,一定核对。 订单号、许可证密钥、版本号、发票金额。错一位在上下文里完全看不出来,到下游却是致命的。
- 看长度。 两位的编号识别成了三位,或者反过来,几乎一定是出了问题。
- 看特殊字符。 竖线、空格、不换行空格、西里尔字母和拉丁字母混淆。如果内容是代码,贴进等宽字体的地方一看就出来。
- 看首尾。 一行开头和结尾的字,在检测阶段最先被切掉。如果一行突然结束,先看最后一两个字。
- 放大重截,不要放大图片。 把糊掉的一行放大,不会生出细节,也基本救不回错字;同一个区域用 2x 重截,或者把源页面放大再截,才有用。
由此得到一个实用结论:选区放宽、分辨率够高的一次截图,比一张裁得很紧的很小截图更好识别。裁切能减少噪声,但缩小会减少信息,而信息正是分类器要吃的东西。
哪些能信
老实说:
| 情况 | 通常没问题 | 通常不行 |
|---|---|---|
| 正常界面字号下的英文与拉丁字母语言 | 可以 | — |
| 正常界面字号下的中文 | 可以 | — |
| 高度低于约 10 像素的文字 | — | 不行 |
| 日文假名、韩文、俄文 | — | 不行 |
| 文字压在照片或渐变上 | 有时 | 有时 |
| 被反复缩小过的截图 | — | 不行 |
InSnap 的本地识别对中文、英文和拉丁字母语言(含重音符号)识别得很好,对日文假名、韩文、俄文不可靠。这是随包模型的能力边界,不是一个设置项,所以这几种文字,凡是要用的内容都请自行核对。
(InSnap 是 Mac 与 Windows 上的截图、标注、录屏与操作指南工具,OCR 在本机运行、不联网,官网 insnap.cn。)
常见问题
识别不准的时候,它会提示我不确定吗?
不会。字符分类器永远返回一个最佳猜测,界面上也没有单独的「可信度」提示。稳妥的假设是:它返回的每个字都是「最可能」,不是「保证正确」。
再识别一次能纠正错字吗?
通常不能。输入没变,模型对同样的像素是确定性的。要改的是输入:把同一块区域放大重截,或者把源页面放大再截,然后再识别。
为什么同一张页面,这张能识别、那张不行?
最常见的原因是文字在像素上的高度,而它取决于屏幕缩放,以及截图是 1x 还是 2x。同一个页面换个缩放、换块屏幕,就可能跨过了那条线。
图片和照片里的文字能识别吗?
只有文字够大、够清楚、背景够干净时才行。文字压在照片、渐变或复杂插画上,正是错字最容易出现的地方。
这个功能需要联网吗?
不需要。识别和复制都在本机完成,不上传任何内容,离线时准确度也一样。