[{"data":1,"prerenderedAt":329},["ShallowReactive",2],{"content-/yomitoku-book-ocr-turso":3,"all-pages-for-dir":327,"og-image-/yomitoku-book-ocr-turso":328},{"id":4,"title":5,"body":6,"category":306,"description":307,"extension":308,"meta":309,"navigation":310,"path":311,"project_name":312,"published":313,"publishedAt":314,"seo":315,"stem":316,"tags":317,"todo":324,"unpublished":313,"updatedAt":325,"__hash__":326},"pages/2026-04/2026-04-22/yomitoku-book-ocr-turso.md","yomitoku OCRで専門書2冊をデジタル化してTurso DBに格納した記録",{"type":7,"value":8,"toc":283},"minimark",[9,13,17,20,25,28,30,34,39,42,46,54,57,79,83,86,88,92,95,98,102,105,109,112,114,118,121,124,127,130,158,162,172,175,177,180,183,189,192,257,259,262],[10,11,5],"h1",{"id":12},"yomitoku-ocrで専門書2冊をデジタル化してturso-dbに格納した記録",[14,15,16],"p",{},"2冊の専門書をyomitoku OCRに通し、Turso DBに流し込んだ。201ページの参考書と320ページの専門書。どちらもOCR→図リネーム→DB格納の同じパイプラインで処理したが、Turso移行後のAPIシグネチャ変更に2セッションとも引っかかり、同じ手順で修正する羽目になった。",[18,19],"hr",{},[21,22,24],"h2",{"id":23},"yomitoku-ocrとは","yomitoku OCRとは",[14,26,27],{},"yomitokuは日本語に特化したAI OCRエンジン。PDFを入力すると、ページごとのMarkdownファイルと、検出した図・表・レイアウト画像を出力する。日本語の縦書き・横書き混在や複雑なレイアウトにも対応しており、汎用OCRと比べて日本語テキストの認識精度が高い。",[18,29],{},[21,31,33],{"id":32},"_1冊目-参考書201ページ","1冊目: 参考書（201ページ）",[35,36,38],"h3",{"id":37},"ocr実行","OCR実行",[14,40,41],{},"201ページのPDFをyomitokuに通した。出力として各ページのMarkdownファイルに加え、124個の図ファイルが生成された。",[35,43,45],{"id":44},"図のリネーム124件","図のリネーム（124件）",[14,47,48,49,53],{},"OCRが出力するファイル名は ",[50,51,52],"code",{},"figure_001.png"," のような連番で、中身を見なければ何の図かわからない。124件の図をひとつずつ確認し、内容に基づいたファイル名にリネームした。",[14,55,56],{},"リネームの流れ:",[58,59,60,64,67,76],"ol",{},[61,62,63],"li",{},"画像ファイルを目視確認",[61,65,66],{},"対応するMarkdownの文脈から図の意味を特定",[61,68,69,71,72,75],{},[50,70,52],{}," → ",[50,73,74],{},"cashflow-statement-example.png"," のように命名",[61,77,78],{},"Markdown内の参照パスも一括置換",[35,80,82],{"id":81},"turso-dbに格納","Turso DBに格納",[14,84,85],{},"リネーム済みのMarkdownをチャンク分割してTurso DBに格納した。ここで最初のつまずきが起きた。",[18,87],{},[21,89,91],{"id":90},"_2冊目-専門書320ページ","2冊目: 専門書（320ページ）",[35,93,38],{"id":94},"ocr実行-1",[14,96,97],{},"320ページの専門書をOCRにかけると、961ファイルが生成された。内訳はMarkdownファイル、レイアウト画像、OCR処理画像の3種類。このうち図として意味のあるものは44件だった。",[35,99,101],{"id":100},"図のリネーム44件","図のリネーム（44件）",[14,103,104],{},"1冊目と同様の手順で44件をリネーム。ページ数が多い割に図が少なかったのは、テキスト主体の書籍だったため。",[35,106,108],{"id":107},"db格納","DB格納",[14,110,111],{},"2冊目もチャンク分割してTurso DBに格納。1冊目で経験した問題がここでも再現した。",[18,113],{},[21,115,117],{"id":116},"turso移行後のapi変更-2回同じ壁にぶつかる","Turso移行後のAPI変更 ── 2回同じ壁にぶつかる",[14,119,120],{},"2冊の処理は別セッションで行ったが、どちらのセッションでも同じ試行錯誤が発生した。",[35,122,123],{"id":123},"何が起きたか",[14,125,126],{},"book-knowledge-baseプロジェクトは以前ローカルSQLiteで動いていたが、途中でTurso（クラウドDB）に移行済みだった。移行に伴いPythonスクリプトのAPIシグネチャが変わっていたが、その変更が頭に入っていなかった。",[14,128,129],{},"具体的には2点:",[58,131,132,149],{},[61,133,134,141,142,145,146,148],{},[135,136,137,140],"strong",{},[50,138,139],{},"db_path"," 引数が不要に",": ローカルSQLite時代は ",[50,143,144],{},"db_path=\"./books.db\""," を渡していたが、Turso移行後はURLとトークンを環境変数から読むため、",[50,147,139],{}," を渡すとエラーになった",[61,150,151,157],{},[135,152,153,156],{},[50,154,155],{},"init_books_db()"," のスキップが必要",": テーブルは既にTurso上に存在するため、初期化関数を呼ぶとテーブル再作成で既存データを壊すリスクがあった",[35,159,161],{"id":160},"_2セッションとも同じ解決手順","2セッションとも同じ解決手順",[163,164,169],"pre",{"className":165,"code":167,"language":168},[166],"language-text","エラー発生: db_path引数が不正\n  ↓\nTurso移行済みだったことを思い出す\n  ↓\ndb_pathを削除し、環境変数から接続情報を取得するよう修正\n  ↓\ninit_books_db()を呼ばずに直接登録処理を実行\n  ↓\n格納成功\n","text",[50,170,167],{"__ignoreMap":171},"",[14,173,174],{},"1冊目で解決したのに、2冊目のセッションで再び同じエラーに遭遇した。セッションが別だったため、前回の修正が文脈に残っていなかった。Claude Codeのセッション間で学びが引き継がれない典型的なパターン。",[18,176],{},[21,178,179],{"id":179},"パイプライン全体像",[14,181,182],{},"2冊を通して固まったパイプラインは以下の通り。",[163,184,187],{"className":185,"code":186,"language":168},[166],"PDF\n ↓ yomitoku OCR\nMarkdown + 図ファイル群\n ↓ 図の選別・リネーム\n ↓ Markdown内の参照パス更新\nクリーンなMarkdown + 命名済み図\n ↓ チャンク分割\n ↓ Turso DB格納（db_path不要、init_books_dbスキップ）\n蔵書データベースに登録完了\n",[50,188,186],{"__ignoreMap":171},[35,190,191],{"id":191},"処理量まとめ",[193,194,195,211],"table",{},[196,197,198],"thead",{},[199,200,201,205,208],"tr",{},[202,203,204],"th",{},"項目",[202,206,207],{},"1冊目（参考書）",[202,209,210],{},"2冊目（専門書）",[212,213,214,226,237,248],"tbody",{},[199,215,216,220,223],{},[217,218,219],"td",{},"ページ数",[217,221,222],{},"201",[217,224,225],{},"320",[199,227,228,231,234],{},[217,229,230],{},"生成ファイル数",[217,232,233],{},"124（図のみ）",[217,235,236],{},"961（MD+画像）",[199,238,239,242,245],{},[217,240,241],{},"リネーム対象の図",[217,243,244],{},"124件",[217,246,247],{},"44件",[199,249,250,252,255],{},[217,251,108],{},[217,253,254],{},"完了",[217,256,254],{},[18,258],{},[21,260,261],{"id":261},"学んだこと",[263,264,265,271,277],"ul",{},[61,266,267,270],{},[135,268,269],{},"セッション間の知識断絶は仕組みで防ぐ",": Turso移行後のAPI変更に2回引っかかった。スクリプトのdocstringやREADMEに「Turso移行済み、db_path不要」と書いておけば、次のセッションのClaude Codeがコードを読んだ時点で気づける",[61,272,273,276],{},[135,274,275],{},"yomitokuの図出力は玉石混交",": OCRが検出する「図」にはレイアウト画像や装飾も含まれるため、毎回選別作業が発生する。閾値による自動フィルタをテンプレート化しておくと次回が楽になる",[61,278,279,282],{},[135,280,281],{},"同じパイプラインを2回流すと手順が洗練される",": 1冊目で手探りだった手順が、2冊目ではほぼ迷わず進んだ。3冊目以降はスクリプト化できるレベルまで手順が固まった",{"title":171,"searchDepth":284,"depth":284,"links":285},2,[286,287,293,298,302,305],{"id":23,"depth":284,"text":24},{"id":32,"depth":284,"text":33,"children":288},[289,291,292],{"id":37,"depth":290,"text":38},3,{"id":44,"depth":290,"text":45},{"id":81,"depth":290,"text":82},{"id":90,"depth":284,"text":91,"children":294},[295,296,297],{"id":94,"depth":290,"text":38},{"id":100,"depth":290,"text":101},{"id":107,"depth":290,"text":108},{"id":116,"depth":284,"text":117,"children":299},[300,301],{"id":123,"depth":290,"text":123},{"id":160,"depth":290,"text":161},{"id":179,"depth":284,"text":179,"children":303},[304],{"id":191,"depth":290,"text":191},{"id":261,"depth":284,"text":261},"dev","日本語特化AI OCR yomitokuを使い、201ページと320ページの専門書2冊をMarkdown変換。図のリネーム・選別を経てTurso DBに格納するまでの手順と、Turso移行後のAPI変更に2回遭遇した試行錯誤を記録","md",{},true,"/yomitoku-book-ocr-turso","book-knowledge-base",false,"2026-04-22T00:00:00.000Z",{"title":5,"description":307},"2026-04/2026-04-22/yomitoku-book-ocr-turso",[318,319,320,321,322,323],"OCR","yomitoku","TursoDB","書籍デジタル化","Python","AI-OCR","memo",null,"efuSxwwfJeQ0HWyTulGrbTj2y9Wz4ZWZXXAICFDUkRk",[],"https://log.eurekapu.com/og/blog/yomitoku-book-ocr-turso.png?v=2026-04-22T00%3A00%3A00.000Z&title=yomitoku%20OCR%E3%81%A7%E5%B0%82%E9%96%80%E6%9B%B82%E5%86%8A%E3%82%92%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E5%8C%96%E3%81%97%E3%81%A6Turso%20DB%E3%81%AB%E6%A0%BC%E7%B4%8D%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2&author=Kei%20Komatsu&sig=55bf932b9be031b5",1780786054397]