日文直書 OCR:保留分欄順序與處理假名
以正確的版面設定萃取日文直書文字、將注音假名與正文分離,並透過可下載的範例檢查實際的 OCR 輸出結果。

對於日文直書 OCR,請在變更影像濾鏡之前先檢查書寫方向。使用能夠處理直書的日文模型與分段設定、以預期的順序驗證分欄,並決定您需要單純的主文或是連同假名一起處理。充滿可辨識字元的頁面,如果其字元順序錯誤,依然會是無法使用的轉錄結果。
我們進行了一項小型的可重現本機實驗,以將這些決策具體化。橫書設定打亂了我們三個直欄的順序。直書設定復原了純文字正文,但加上假名後改變了兩個標點符號,而裁切掉注音文字並未消除標點符號的錯誤。
這些是刻意縮小的合成樣本的結果,並非針對所有日文書籍的準確度聲明。有用的教訓更為具體:分別評估字元辨識、閱讀順序以及註解處理。 不要只因為結果看起來像日文就將它送去翻譯。
首先辨識您實際需要的文字
在傳統的日文直書排版中,字元由上往下依序排列,而行則由右向左推進。注音(Ruby)是與基本字元相關的小型文字;假名通常提供其讀音。W3C 的日文文字排版需求 描述了這些書寫方向與注音關係。
在 OCR 之前,標記頁面中有意義的區域:
- 主要的直向分欄;
- 正文旁的小型注音;
- 橫向標題、圖說或表格;
- 頁碼與頁首標題;
- 邊註或無關的相鄰頁面。
不要將每一個直向條帶都視為獨立的段落。夾在 図書館 旁邊的狹小假名條帶可能是它的讀音,としょかん 而不是下一句。
在評估 OCR 之前先選擇輸出政策:
| 讀者的任務 | 期望的結果 | 什麼情況算是有問題 |
|---|---|---|
| 搜尋或翻譯內文 | 依順序排列的主要文字;實用的讀音會另外保存 | 插入內文的注音、被略過的內文、重新排序的欄位 |
| 學習發音 | 主要文字加上正確對應的讀音 | 缺少注音,或讀音附著到錯誤的單字上 |
| 產生忠實的轉錄 | 保留主要文字、註釋關係與編輯決策 | 默默刪除或正規化你原本想保留的素材 |
相同的輸出結果可能在某個任務中通過,但在另一個任務中失敗。我們的實驗使用 純內文轉錄 作為其比較目標。它不接受將缺少的注音視為發音學習版本的可接受範圍。
一個真正的三句 OCR 實驗
範例使用了以下自創句子:
朝の図書館で本を読む。
古い地図には川が見える。
明日は友人と駅で会う。
它們描述在圖書館閱讀、在舊地圖上看到河流,以及在車站與朋友見面。移除換行符號後,共有 34 個正文 Unicode 字元點,包含三個日文句號。
我們以三種形式呈現相同的內文:
- 橫排文字.
- 三個直排欄位,由右至左讀取。
- 帶有注音的相同直排欄位 旁,以及
図書館,地図,友人,與駅.

這些是乾淨的教學圖片,而不是書中的掃描頁面。渲染器使用 Noto Sans CJK JP、64 像素的正文字元、24 像素的注音,以及簡化的逐字元直向排列。它將直向句號繪製為手動選定位置的小型外框圓圈,而不是使用字型本身的正確直向字元定位;因此,標點符號的結果無法建立 OCR 在正確排版書籍上的表現。它並未重現每個日文排版規則。測試中沒有模糊、傾斜、紙張紋理、手寫字、歷史字體或混合方向的頁面。
引擎、模型與設定
該實驗於 2026 年 9 月 7 日進行,在 macOS ARM64 上本地使用 Tesseract.js 7.0.0 與 Tesseract.js-core 7.0.0。所有成功的呼叫皆使用官方的 tessdata_fast 模型,提交版本為 87416418657359cb625c412a48b6e1d6d41c29bd,並使用 OEM 1(僅限 LSTM 引擎模式)。
Tesseract 的官方模型儲存庫提供獨立的 jpn 與 jpn_vert 檔案。其說明文件將 PSM 5 描述為均勻垂直對齊的區塊,將 PSM 6 描述為均勻的文字區塊;請選擇適合要辨識區域的分段假設。請參閱 頁面分段說明文件.
我們記錄的案例中,水平文字使用 jpn 搭配 PSM 6,垂直文字使用 jpn_vert 搭配 PSM 5,並刻意使用不匹配的 jpn/PSM 6 垂直對照組。兩種垂直配置的模型與分段皆有改變,因此這是一項工作流程比較,而非隔離任一設定效果的實驗。
初次嘗試使用 tessdata_best 時,在可用的 WebAssembly 核心中即終止,未能產生 OCR 文字。為了相容性,我們改用官方的整數 tessdata_fast 模型並記錄了該次失敗。無法從該切換得出任何關於某個模型家族準確度的結論。
實際返回的內容
比較時會移除空白並套用 Unicode NFC 正規化。它 不會 取代標點符號、修正漢字或重新排列文字。完整的 原始輸出與版本/模型雜湊值, 內文比較 CSV,以及 錯誤註解 可供下載。
| 輸入與組態 | 針對僅本文目標的觀察結果 |
|---|---|
橫排、jpn,PSM 6 | 移除空白後,所有 34 個字元代碼皆相符 |
直排、jpn,PSM 6 控制組 | 輸出跨越了直行並包含字元替換;無法作為可用內文 |
直排、jpn_vert,PSM 5 | 移除空白後,所有 34 個字元代碼皆相符;直行順序正確 |
附振假名之直排、jpn_vert,PSM 5 | 主文維持順序,但有兩個。 標記變成了 ASCII.;ruby 未作為獨立讀音傳回 |
來自振假名圖片的三個正文直行裁切畫面、jpn_vert,PSM 5 | 第一行結尾為.,第二行為,,第三行為。;裁切並未移除所有標點符號缺陷 |
例如,振假名案例傳回了以下第一行:
Expected: 朝の図書館で本を読む。
Observed: 朝 の 図書 館 で 本 を 読む .
這些空格會被我們規定的比較規則忽略,但最終標點符號則不會。僅靠搜尋的工作流程或許能容忍這種差異,但忠實的轉錄應該予以記錄並修正。
不相符的垂直控制始於 明 古 昌,它跨越了各欄頂部的字元,而不是沿著預期的第一句進行。其輸出說明瞭識別單一符號並不等於重建閱讀順序。
總共進行了七次 OCR 呼叫:四個全圖案例與三個裁切片段。我們保留了每一個輸出。一位代理程式將結果與編寫的基準真相進行對比,並目視檢查了影像;其中並無盲測的人工審查或廣泛的基準語料庫。這項實驗並未確立普遍最佳的引擎、書籍級別的準確率,或是針對您掃描檔案的效能。
在您自己的頁面上使用區域優先的工作流程
1. 保留原始來源並選擇一個困難的頁面
保持原始影像或 PDF 不變。在副本上作業,並記錄頁碼。選擇一個包含您正試圖解決之問題的頁面:密集的注音(ruby)、狹窄的行距、橫向標題位於直排文字上方,或是異常小的字體。
乾淨的封面對於內文頁面排版不同的書籍來說,並不是一個有用的驗收測試。如果來源是 PDF,請在執行純影像 OCR 工作流程之前,使用您信賴的工具萃取或算繪選定的頁面。這篇文章的指令碼接受 PNG 檔案;它們不處理 PDF 或建置可搜尋的 PDF 圖層。
如需完整的掃描檔案準備與翻譯流程,請使用更廣泛的 掃描 PDF 工作流程。本指南聚焦於日文書寫方向、分割、注音與轉錄決策。
2. 在不破壞小字的情況下修正擷取缺陷
以有用的縮放層級檢查實際字元。拉直非預期的傾斜、移除無關的頁面邊框,並保留足夠的對比度以辨識小假名與標點符號。避免將激進的閾值處理或銳利化視為自動改進:在信任 OCR 之前,請將產生的影像與原始影像進行比較。
Tesseract 的 影像品質指引 涵蓋了解析度、雜訊、傾斜與邊框。這些與書寫方向是分開的。對以某個角度拍攝的頁面進行去傾斜,與將直立的日文垂直文字向側邊旋轉並不是相同的操作。
範例檔案帶有 300 dpi 的詮釋資料,但這個數字並未創造出遺失的細節。其實際的內文字形大小為 64 像素。一張被重新標示為「300 dpi」的低解析度照片,依然是那張低解析度照片。
3. 當頁面違反其中一項排版假設時,請分離區域
在要求單一 OCR 呼叫處理橫向標題、直排散文、插圖和頁碼之前,先自行嘗試主要的垂直區塊。保留簡單的區域記錄,例如「第 12 頁,內文,從右算起第 1 欄」。該記錄使後續的組合得以審核。
對於混合方向的素材,請使用適當的橫向設定識別橫向區域,並使用垂直設定識別垂直區域,然後以文件預期的順序將它們組合起來。這是建議在您的檔案上測試的工作流程,而不是由我們三個範例影像所衡量的混合排版功能.
我們的裁切實驗使用了確切的已知座標,以排除每個合成欄位旁邊的注音條,同時保留其內文與白色邊距。這是一項手動區域選取示範,而非自動去除注音的演算法。請勿將其座標套用到真實的書籍頁面上。
4. 在校對個別字元之前先檢查欄位
依預期的方向運作,比較每一欄的第一個與最後一個內文字元。確認沒有任何欄位遺失、重複、反轉或與相鄰欄位混淆。接著檢查欄位邊界處的句子。
唯有在此之後,您才應該修正個別的漢字、假名、標點符號、數字和名稱。否則,您可能會把時間浪費在打磨那些被組裝到錯誤段落中的片段上。
一個實用的三階段審閱流程為:
- 區域與順序: 確保每個預期的本文區域都只出現一次且順序正確。
- 字元: 將實際影像與文字進行比對,包括微小的標點符號和假名。
- 註釋: 決定是否保留、分離或刻意排除每個注音假名(ruby)項目、筆記或邊欄標籤。
引擎的信心水準數值無法取代這些檢查。我們的混亂控制項仍然回報了一個引擎產生的信心數值,但这並未讓它的閱讀順序變得可以接受。
在弄清楚原因之前,切勿移除振假名(furigana)
對於純本文提取而言,注音假名不應意外變成第二層散文。但刪除每一個小型假名字串並不是一項安全的通用規則。發音有助於釐清人名、保留作者選擇的讀音,或是支援讀者的學習任務。
在我們的振假名影像中,OCR 輸出包含了主漢字,但沒有將四個讀音回報為獨立的註釋集。對於純文字搜尋任務來說,這在修正標點符號後可能就足夠了。但如果交付項目承諾提供發音資訊,這便遠遠不夠。
請將重要的讀音分開儲存,並將其與正確的出現位置關聯起來。例如:
Page: sample 1
Column: 1 from the right
Base text: 図書館
Reading shown: としょかん
Decision: retain body text; save reading in the annotation record
範例的 獨立注音轉錄 讓該政策變得明確。這是與影像一同產生的真實基準(ground truth),而非 OCR 成功的聲明。
如果 OCR 將假名混入單字中或遺失了關聯,請對照影像進行修復並調整轉錄。切勿要求語言模型猜測來源,並將猜測結果呈現為復原後的文字。請改為將不確定的讀音標記以供審閱。
裁剪結果也反駁了過於簡單的「移除注音假名,一切就會改善」的規則:有兩個標點符號的差異依然存在,且受影響的句尾也改變了。該觀察結果僅適用於這個特定的乾淨測試夾具。它告訴我們要在分割後驗證結果,而不是裁剪通常會有幫助或有害於 OCR。
重現測試或保留審閱記錄
下載 實驗 README 以取得釘選的模型與字型來源、相依性版本、檔案說明以及指令。 範例產生器, OCR 執行器,以及比較腳本分別進行圖片建立、辨識與評估。
執行程式使用有記錄的Tesseract.js worker API。對於垂直區域,其主要設定為:
const worker = await createWorker("jpn_vert", 1, {
langPath: modelDirectory,
gzip: false,
cacheMethod: "none",
});
await worker.setParameters({
tessedit_pageseg_mode: "5",
user_defined_dpi: "300",
});
modelDirectory必須包含已下載且未壓縮的jpn_vert.traineddata檔案。這是一個片段,並非完整的程式;提供的執行程式也會儲存原始結果並終止 worker。
如果您使用其他 OCR 應用程式,即使設定名稱不同,也請保留相同的佐證資料:來源區域、原始檔案、模型或工具版本、方向、分割選擇、實際輸出、校正後文字以及未解決的字元。審查記錄範本是空白的,因此它不暗示您的頁面已經通過審查。
請勿將我們微小的精確符合結果轉化為整本小說的承諾百分比。不同的字體、擁擠的欄位、歷史字體、低品質掃描以及漫畫對話框都需要各自具代表性的測試。漫畫排版與手寫辨識不在本實驗範圍內。
僅在恢復的來源可靠時進行翻譯
如果您的目標是搜尋、複製引文或查字典,已驗證的日文文字可能就是最終結果。您不需要僅因為涉及 OCR 就翻譯整份文件。
如果語言障礙仍然阻礙閱讀,且您有可上傳的可用檔案,請繼續進行PDF 翻譯工作流程。請保留原始掃描檔與核對過的轉錄內容,以便區分辨識錯誤與翻譯錯誤。範例執行程式會產生文字與 TSV 檔案,而非可供自動上傳的 PDF;請準備好下一個工具所需的實際輸入格式。
BookTranslator 的 OCR 模式會重建翻譯內容,而非保證維持原有的垂直排版。請勿假設它會保留所有 ruby 關聯或修復未經驗證的辨識錯誤。請使用PDF 格式保留指南與最終 PDF 品質保證檢查清單.
可靠的交接並非「OCR 已完成。」而是「所需的日文文字已存在、其順序已經過檢查,且註解的處理方式已有記錄。」





