5秒の沈黙

チリの読者がサインアップし、児童小説 — Angeles Duriniによる"¿Quién le tiene miedo a Demetrio Latov?" — の74ページのPDFをアップロードして、オーディオブックを生成をクリックしました。15秒後、メールが届きました。「あなたのオーディオブックの準備ができました。」

実際にはできていませんでした。ファイルは5.6秒の長さで、中身は何もなかったのです。

これは本番環境でしか捕まえられないタイプのバグです。なぜなら、私たちが使っていたテスト用PDFには埋め込みテキストがあったからです。彼女のものにはありませんでした。本は2012年にAdobe Acrobat Proで1ページずつスキャンされており、すべてのページは画像として保存されていました。私たちのパイプラインにとって、そのPDFは74枚の白紙ページだったのです。

重要なポイント:PDFがスキャン(画像のみ、埋め込みテキストレイヤーなし)の場合、ほとんどのAIオーディオブック生成ツールは無言で空または意味不明な音声を生成します。本物のテキスト抽出にはOCRが必要ですが、それをデフォルトで実行するオーディオブックツールはほとんど存在しません。

スキャンPDFがオーディオブックのパイプラインを壊す理由

PDFはまったく異なる2つの方法でテキストを保持できます。

フラットベッドスキャナー、スマートフォンのカメラ、古いデジタル化プロジェクト(Google Books、archive.org、パブリックドメインの復刻版、中古の児童書など)から来たものはたいてい後者です。人間の目には同一に見えます。しかしソフトウェアにとっては根本的に異なるものです。

失敗したアップロードを調査したところ、私たちのPDFパーサーは74ページの本全体に対して、わずか17文字のゴミデータ(制御バイトであり文字ではない)を返していました。そして私たちのパイプラインはその17バイトを律儀にテキスト読み上げに送り、5秒のもごもごとした出力を生成しました。それから読者に「オーディオブックの準備ができました」とメールを送ったのです。

私たちが構築したもの

修正は概念的にはシンプルです。PDFに使えるテキストがないことを検出し、すべてのページをOCRする。実装にはいくつかの注目すべき要素があります。

1. テキスト過少検出器

アップロードごとにOCRに突入する前に、ネイティブ抽出の結果をチェックします。PDF全体で200文字未満が返されるか、4ページ以上にわたって平均30文字未満であれば、スキャンとみなしてOCRにフォールスルーします。通常のテキストPDF — 90%以上のケース — では、遅いパスは決してトリガーされません。

2. pypdfium2 + tesseract(すべてApache 2.0)

各ページをpypdfium2(GoogleのPDFiumエンジンをPythonでラップしたもの、Apache 2.0)で2.5倍スケール — 約180 DPI、信頼できる文字認識に十分 — でレンダリングします。各画像はtesseractに、多言語モデルを読み込んだ状態で通します:eng+spa+por+fra+deu+pol+ita+tur。Tesseractはグリフの形状から実際の言語を判断します。

私たちは意図的にPyMuPDF — 最も人気のあるPython製PDFライブラリ — から離れました。AGPLライセンスがホスティングサービスにとって扱いにくいからです。pypdfium2への切り替えには午後一日かかっただけで、法的リスクは完全になくなりました。商用製品向けにPDF関連のものを構築している方には知っておく価値があります。

3. 言語の自動検出

読者の本はスペイン語でしたが、彼女のUIロケールは英語でした。つまり、修正前はOCRが機能したとしても、パイプラインは英語の音声でスペイン語のテキストを合成していたでしょう(ロボットのような、誤った発音で)。今は言語検出自体がOCR済みのテキストを使います。3ページのサンプルを取った後、langdetectがコンテンツを分類し、適切な音声を選択します — この場合はラテンアメリカのスペイン語です。

4. 誠実な失敗パス

OCRしても回復できる文字が100文字未満の場合(装飾のみのPDFや壊れたファイル)、私たちは沈黙を生成する代わりに明確なエラーを返すようになりました。「このPDFには抽出可能なテキストがありません。EPUB、TXT、またはテキストベースのPDFをアップロードしてください。」オーディオブックのジョブは失敗としてマークされ、メールは送信されず、クレジットも課金されません。

スキャンPDFをお持ちですか?今すぐお試しください。

MimicReaderは毎月最初の1時間の音声が無料です。カード不要。テキストでもスキャンでも、どんなPDFでもドロップしてください。残りは私たちが何とかします。

無料で始める

結果

私たちは、再構築したパイプラインを通して読者のPDFを再実行しました。5分間のOCRで、彼女の74ページのスキャンから144,710文字のクリーンなスペイン語が抽出されました。次にパイプラインはそれを1,127セグメントに分割し、リードアロング同期付きの2時間43分のオーディオブックを生成しました — 音声に合わせて単語ごとにハイライトされます。彼女にはスペイン語でメールを送り、私たち持ちで、最初の試行についてお詫びしました。

再生成全体には実測で約90分かかりました。OCRに約5分、テキスト読み上げに80分、音声正規化(EBU R128)とM4A最終化に数分です。テキストPDFよりは遅い — しかし機能します。以前はまったく機能しなかったのです。

スキャンの山をお持ちの方への意味

スキャンされた本を溜め込んできた方 — 古い復刻版、絶版小説、archive.orgからのパブリックドメインのデジタル化、自分でスキャンしたおばあちゃんのレシピ帳 — これらはもう紙に閉じ込められていません。アップロードしてください。OCRは私たちがやります。

現在私たちは12言語でOCRしています:英語、スペイン語、ポルトガル語、フランス語、ドイツ語、ポーランド語、イタリア語、トルコ語、アラビア語、日本語、韓国語、ヒンディー語。オーディオブック自体は23の音声言語のいずれでも生成可能です。スキャンされた本がまだOCR対応していない言語のものでしたら、ご連絡ください。tesseractの言語パックの追加には数分しかかかりません。

商用ライセンスについての注釈

私たちが使用するOCRスタック全体 — tesseract、pypdfium2、pytesseract — はApache 2.0です。これは類似のものを構築している方にとって重要です。PyMuPDFはPythonでPDFレンダリングをする際の簡単な選択肢ですが、AGPLライセンスは、本番環境で使用する場合にSaaS全体をオープンソース化することを要求します。pypdfium2 + tesseractは同じ機能をライセンス上の懸念なしで提供してくれます。

私たちをより良くしたバグ

ほとんどの本番バグはテストで捕まります。これは違いました。なぜなら「PDFはテキストを含む」という前提が、私たちが使ってきたすべての開発用ファイルに当てはまっていたからです。プラットフォーム利用の最初の1時間中に、それを表面化させてくれたのはチリの本物の読者でした。

だからありがとう、本物の読者の皆さん。私たちには見つけられないバグを、あなた方が見つけてくれます。