国立国会図書館(NDL)が公開している軽量OCRエンジン「ndlocr-lite」を基盤とした、OpenAI互換(Mistral OCR形式)のOCR APIサーバーです。
NDLOCR-Liteは、GPUを必要とせず、一般的なPC環境で高速に動作するOCRエンジンです。本プロジェクトは、この強力なエンジンを現代的なAIワークフローやエージェントから容易に利用できるよう、FastAPIを用いてAPI化したものです。
- OpenAI互換の Vision API サポート:
/v1/chat/completionsに画像を送信することで、OpenAI互換のレスポンスでOCR結果を取得可能。 - OpenAI互換のスキーマ: OpenAIやMistral AIのOCR APIに近いレスポンス形式を採用。
- マルチモード対応:
multipart/form-dataによる画像ファイルの直接アップロード。- JSON形式によるBase64エンコード画像の送信。
- 安全性向上:
defusedxmlの採用により、XXE(XML外部実体参照)攻撃やBillion Laughs攻撃などの脆弱性から保護。 - パフォーマンス最適化: OCRループ内の冗長なXMLツリー解析をキャッシュ化し、推論処理を高速化。
- 非同期ジョブ管理: 時間のかかるOCR処理をバックグラウンドで実行し、ジョブIDでステータスを確認可能(
/v1/ocr/jobs)。 - 高速な推論開始: Lifespan機能により、サーバー起動時にモデルを一度だけロードするため、リクエストごとの遅延がありません。
- Docker対応: Docker Composeにより、環境構築なしですぐに利用可能です。
リポジトリをクローンし、サブモジュールを初期化します。
git clone --recursive https://github.com/chottokun/api-ndlocr-lite.git
cd api-ndlocr-liteDockerを使用すると、複雑な依存関係のセットアップが不要です。
docker-compose up --buildサーバーが起動すると、http://localhost:8000 でAPIが利用可能になります。
セキュリティ制限などの設定は環境変数で行うことができます。詳細は .env.sample を参照してください。
cp .env.sample .env
# 必要に応じて .env を編集curl http://localhost:8000/healthcurl -X POST http://localhost:8000/v1/ocr \
-F "file=@/path/to/your/image.jpg"処理に時間がかかる画像や、大量の画像をバッチ処理する場合に適しています。
-
ジョブの作成
curl -X POST http://localhost:8000/v1/ocr/jobs \ -F "file=@/path/to/your/image.jpg"レスポンスに含まれる
job_idをメモしてください。 -
ステータスと結果の確認
curl http://localhost:8000/v1/ocr/jobs/{job_id}
OpenAI の Chat Completions API スキーマと互換性のあるエンドポイントです。LLMエージェントや外部ワークフローから容易に呼び出すことができます。
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "ndlocr-lite",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "OCR this image"},
{
"type": "image_url",
"image_url": {"url": "data:image/jpeg;base64,...(画像Base64データ)..."}
}
]
}
]
}'レスポンスの message.content には抽出されたプレーンテキスト(マークダウン形式)が含まれ、さらに tool_calls 内の get_ocr_details 関数の引数として、座標情報や信頼度などの詳細なメタデータが含まれます。
認識結果の各テキスト行(lines)オブジェクトには、以下の拡張フィールドが含まれます:
isVertical:true/false形式の文字列。行のテキストが縦書きかどうかを判定します。isTextline: 常に"true"。テキスト行であることを示します。
uvを使用して開発環境を構築します。
# 依存関係のインストール
uv sync
# テストの実行
PYTHONPATH=. uv run pytestLocustを使用した負荷テストが可能です。
# 負荷テストの実行(サーバーの起動からテスト完了まで自動で行います)
./run_load_tests.shテスト項目:
/healthへの定期的なアクセス。/v1/ocrへの同期OCRリクエスト。/v1/ocr/jobsを使用した非同期ジョブの作成とポーリング。
Streamlitを使用した簡易的なテスト用UIを内蔵しています。ブラウザ上で画像をアップロードし、OCR結果をインタラクティブに確認できます。
UIを起動するには、Dockerとは別にローカル環境で立ち上げることを推奨します(.venvの権限問題を避けるため)。
# 依存関係のインストール(初回のみ)
uv sync
# テストUIの起動(バックグラウンド等で)
uv run streamlit run streamlit_app.py --server.port 8501ブラウザで http://localhost:8501 にアクセスすると、以下の機能が利用できます:
- 同期OCR: 画像をアップロードして即座に結果を取得
- 非同期ジョブ: ジョブを作成し、ポーリングで結果を確認
- ヘルスチェック: サイドバーからAPIの稼働状況を確認
注意: APIサーバー(Docker Compose)が起動している必要があります。デフォルトのAPI URLは
http://localhost:8001です。
APIの安定稼働のため、デフォルトで以下の制限が設定されています。これらは環境変数で変更可能です。
- MAX_IMAGE_SIZE: アップロード可能な画像サイズ(初期値: 10MB)
- MAX_BODY_SIZE: リクエストボディの最大サイズ(初期値: 15MB)
- MAX_PIXELS: 画像の最大画素数(初期値: 100MP)
- XML外部エンティティ保護:
defusedxmlにより、悪意のあるXML入力を安全に処理します。
docs/architecture.md: システムの設計とデータフローの解説src/core/engine.py: NDLOCR-Liteをラップした推論エンジン。defusedxmlによる安全なXMLパース処理を含む。src/api/main.py: FastAPIによるAPIエンドポイントとジョブ管理。src/schemas/ocr.py: Pydanticによるリクエスト・レスポンスのスキーマ定義。streamlit_app.py: Streamlitによるテスト用UIアプリケーション。extern/ndlocr-lite: 本体のOCRエンジン(Git Submodule)。
- 本APIコード: MIT License(またはリポジトリの設定に準ずる)
- OCRエンジン (NDLOCR-Lite): CC BY 4.0 (国立国会図書館)
- 依存ライブラリ: 各ライブラリのライセンスに基づきます。
NDLOCR-Liteの詳細な技術情報やモデルの著作権については、公式リポジトリを参照してください。 https://github.com/ndl-lab/ndlocr-lite