一句話
OCR——光學字元識別——把長得像字的畫素變成真正的文字。對一張清晰的印刷體照片或截圖,它接近完美;對手寫、花體字,或一張糊掉的選單照片,它接近沒用。本站的引擎是 Tesseract,在瀏覽器裡跑,帶 12 個語言包;圖片留在你的裝置上。多數糟糕的結果來自圖片而不是引擎,而且在按下按鈕之前就能修好。
引擎怎麼工作
Tesseract 1985 年誕生於惠普,2005 年開源,2006 年起由 Google 維護。第 4 版(2018 年)用 LSTM 神經網路取代了逐字元分類器,一次讀一整行,所以它能應付粘連的字母和比例字型——老引擎做不到。流程是:找到頁面上的文字區域,切成行,每行過一遍網路,再由語言模型——詞典加字母序列統計——在相似形狀之間裁決(l、1、I;0、O)。最後這一步就是為什麼選對語言要緊:用英文模型讀德文,會把 straße“糾正”成 strasse 或更糟。
在瀏覽器裡,引擎編譯成 WebAssembly(約 4 MB),每個語言包 0.7–3 MB,第一次用時下載並快取。中文和日文的包最大,因為要認識幾千個字。
什麼決定結果
解析度。 Tesseract 希望字高在 30 畫素上下;低於 20 網路就開始猜。手機拍一頁紙沒問題;400 畫素寬的縮圖不行。非要 OCR 一張小圖,先放大兩倍——不增加資訊,但給找行的演演算法留出餘地。
對比度和均勻度。 白底黑字,光線均勻。檯燈下拍的一頁紙中間亮、四角發灰;引擎用一個閾值二值化整張圖,頁面的一側就消失了。在平光下拍,或者用掃描。
擺正。 引擎能糾正幾度的傾斜。斜著拍的一頁紙是個梯形,行會匯聚;OCR 之前先旋轉並裁剪到文字塊。裁剪同時去掉桌沿、你的拇指和另一頁——每一樣都會產生一行亂碼。
版面。 單欄正文最容易。雙欄通常能識別。表格、表單、環繞圖片的文字、頁邊的圖注,會以引擎自己選的順序出來,數字列會丟掉對齊。要表格的話,OCR 你需要的那幾格,而不是整頁。
字型。 標準的書籍和螢幕字型:極好。壓縮體、裝飾體、手寫體、描邊字:差。訓練資料沒見過的字型是一個形狀一個形狀地讀,語言模型的糾正只會讓它更糟。
手寫。 實際上不支援。Tesseract 是在印刷體上訓練的;表單上的正楷大寫也許能過,連筆不行。手寫識別是另一個模型家族,不是這個工具做的事。
語言和混排
選文字實際使用的語言,能只選一種就只選一種。選三種語言等於把每個字元的候選集翻三倍,識別更慢、準確率更低。混排文字——一份帶英文產品名的中文檔案——才是兩種語言一起選的場合(中文 + 英文):引擎逐詞切換。可用的 12 種語言:英語、簡體中文、繁體中文、日語、韓語、西班牙語、法語、德語、葡萄牙語、俄語、義大利語、越南語。
掃描的 PDF
掃描器出來的 PDF 是每頁一張圖;文字不在裡面,複製不了。用 200–300 dpi 把頁面渲染成圖片,再 OCR 這些圖。用 72 dpi(螢幕解析度)渲染,字高只有 10 畫素,出來的是亂碼。
“99%” 實際上意味著什麼
一次好的 OCR 在一頁乾淨的紙上大約每一百個字錯一個。500 字一頁就是三十來處錯誤,多數在數字、名字和標點裡——恰恰是你順著讀讀不出來的地方。文字去往任何要緊的地方之前,逐個數字對照原件核一遍;OCR 是草稿,不是謄本。