• #OCR
  • #yomitoku
  • #TursoDB
  • #書籍デジタル化
  • #Python
  • #AI-OCR
開発book-knowledge-baseメモ

yomitoku OCRで専門書2冊をデジタル化してTurso DBに格納した記録

2冊の専門書をyomitoku OCRに通し、Turso DBに流し込んだ。201ページの参考書と320ページの専門書。どちらもOCR→図リネーム→DB格納の同じパイプラインで処理したが、Turso移行後のAPIシグネチャ変更に2セッションとも引っかかり、同じ手順で修正する羽目になった。


yomitoku OCRとは

yomitokuは日本語に特化したAI OCRエンジン。PDFを入力すると、ページごとのMarkdownファイルと、検出した図・表・レイアウト画像を出力する。日本語の縦書き・横書き混在や複雑なレイアウトにも対応しており、汎用OCRと比べて日本語テキストの認識精度が高い。


1冊目: 参考書(201ページ)

OCR実行

201ページのPDFをyomitokuに通した。出力として各ページのMarkdownファイルに加え、124個の図ファイルが生成された。

図のリネーム(124件)

OCRが出力するファイル名は figure_001.png のような連番で、中身を見なければ何の図かわからない。124件の図をひとつずつ確認し、内容に基づいたファイル名にリネームした。

リネームの流れ:

  1. 画像ファイルを目視確認
  2. 対応するMarkdownの文脈から図の意味を特定
  3. figure_001.pngcashflow-statement-example.png のように命名
  4. Markdown内の参照パスも一括置換

Turso DBに格納

リネーム済みのMarkdownをチャンク分割してTurso DBに格納した。ここで最初のつまずきが起きた。


2冊目: 専門書(320ページ)

OCR実行

320ページの専門書をOCRにかけると、961ファイルが生成された。内訳はMarkdownファイル、レイアウト画像、OCR処理画像の3種類。このうち図として意味のあるものは44件だった。

図のリネーム(44件)

1冊目と同様の手順で44件をリネーム。ページ数が多い割に図が少なかったのは、テキスト主体の書籍だったため。

DB格納

2冊目もチャンク分割してTurso DBに格納。1冊目で経験した問題がここでも再現した。


Turso移行後のAPI変更 ── 2回同じ壁にぶつかる

2冊の処理は別セッションで行ったが、どちらのセッションでも同じ試行錯誤が発生した。

何が起きたか

book-knowledge-baseプロジェクトは以前ローカルSQLiteで動いていたが、途中でTurso(クラウドDB)に移行済みだった。移行に伴いPythonスクリプトのAPIシグネチャが変わっていたが、その変更が頭に入っていなかった。

具体的には2点:

  1. db_path 引数が不要に: ローカルSQLite時代は db_path="./books.db" を渡していたが、Turso移行後はURLとトークンを環境変数から読むため、db_path を渡すとエラーになった
  2. init_books_db() のスキップが必要: テーブルは既にTurso上に存在するため、初期化関数を呼ぶとテーブル再作成で既存データを壊すリスクがあった

2セッションとも同じ解決手順

エラー発生: db_path引数が不正
  ↓
Turso移行済みだったことを思い出す
  ↓
db_pathを削除し、環境変数から接続情報を取得するよう修正
  ↓
init_books_db()を呼ばずに直接登録処理を実行
  ↓
格納成功

1冊目で解決したのに、2冊目のセッションで再び同じエラーに遭遇した。セッションが別だったため、前回の修正が文脈に残っていなかった。Claude Codeのセッション間で学びが引き継がれない典型的なパターン。


パイプライン全体像

2冊を通して固まったパイプラインは以下の通り。

PDF
 ↓ yomitoku OCR
Markdown + 図ファイル群
 ↓ 図の選別・リネーム
 ↓ Markdown内の参照パス更新
クリーンなMarkdown + 命名済み図
 ↓ チャンク分割
 ↓ Turso DB格納(db_path不要、init_books_dbスキップ)
蔵書データベースに登録完了

処理量まとめ

項目1冊目(参考書)2冊目(専門書)
ページ数201320
生成ファイル数124(図のみ)961(MD+画像)
リネーム対象の図124件44件
DB格納完了完了

学んだこと

  • セッション間の知識断絶は仕組みで防ぐ: Turso移行後のAPI変更に2回引っかかった。スクリプトのdocstringやREADMEに「Turso移行済み、db_path不要」と書いておけば、次のセッションのClaude Codeがコードを読んだ時点で気づける
  • yomitokuの図出力は玉石混交: OCRが検出する「図」にはレイアウト画像や装飾も含まれるため、毎回選別作業が発生する。閾値による自動フィルタをテンプレート化しておくと次回が楽になる
  • 同じパイプラインを2回流すと手順が洗練される: 1冊目で手探りだった手順が、2冊目ではほぼ迷わず進んだ。3冊目以降はスクリプト化できるレベルまで手順が固まった