mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
fix: make OCR portable and reliable across AMD64 and ARM64 (#519)
* fix: make OCR portable and reliable * fix: harden OCR installation portability * fix: pin OCR partials across downloads * fix: make OCR execution reliably asynchronous * fix: harden OCR portability and docs routes * fix: preserve decoder and docs safeguards
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
---
|
||||
description: "SnapOtter のモノレポ構造、アプリとパッケージのアーキテクチャ、リクエストのライフサイクル、リソースフットプリント。"
|
||||
i18n_source_hash: 9e8f80499a37
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 3a780628a2ab
|
||||
i18n_source_hash: 733cb3c10884
|
||||
i18n_provenance: human
|
||||
---
|
||||
|
||||
# アーキテクチャ {#architecture}
|
||||
@@ -36,13 +36,13 @@ snapotter/
|
||||
|
||||
### `@snapotter/ai` {#snapotter-ai}
|
||||
|
||||
ML 操作のために Python スクリプトを呼び出すブリッジ層です。初回使用時、ブリッジは常駐する Python ディスパッチャープロセスを起動し、重いライブラリ(PIL、NumPy、MediaPipe、rembg)を事前にインポートするため、以降の AI 呼び出しはインポートのオーバーヘッドを回避できます。ディスパッチャーがまだ準備できていない場合、ブリッジはリクエストごとに新しい Python サブプロセスを生成するフォールバックに切り替わります。
|
||||
ネイティブおよび Python ML ランタイムを呼び出すブリッジ層。 ほとんどの Python ツールは、重いライブラリ (PIL、NumPy、MediaPipe、rembg) を事前インポートする永続的な dispatcher を使用するため、後続の呼び出しではインポートのオーバーヘッドがスキップされます。 OCR は、変更可能な共有環境から分離されています。`fast` はネイティブ Tesseract を呼び出しますが、`balanced` および `best` は、アクティブな不変 RapidOCR/ONNX 世代に固定された専用の永続的な JSONL dispatcher を使用します。 各リクエストは generation lease を保持します。 アクティブ化では、まず候補に対して smoke test が実行され、次にその dispatcher にアトミックに切り替わります。 以前の dispatcher は、その生成がガベージ コレクションされる前にドレインされます。
|
||||
|
||||
**モデルは事前ロードされません。** 各ツールスクリプトは、リクエスト時にディスクからモデルの重みを読み込み、リクエストが完了すると破棄します。メモリプロファイルの全容については [リソースフットプリント](#resource-footprint) を参照してください。
|
||||
|
||||
サポートされる操作: 背景除去(rembg/BiRefNet)、アップスケーリング(RealESRGAN)、顔のぼかし(MediaPipe)、顔補正(GFPGAN/CodeFormer)、オブジェクト消去(LaMa ONNX)、OCR(PaddleOCR/Tesseract)、カラー化(DDColor)、ノイズ除去、赤目除去、写真復元、証明写真の生成、透明度の修正(BiRefNet HR マッティング)、コンテンツ認識リサイズ(Go caire バイナリ)。
|
||||
サポートされている操作: 背景除去 (rembg/BiRefNet)、アップスケーリング (RealESRGAN)、顔ぼかし (MediaPipe)、顔強調 (GFPGAN/CodeFormer)、オブジェクト消去 (LaMa ONNX)、OCR (Tesseract および PP-OCR ONNX モデルの RapidOCR)、カラー化 (DDColor)、ノイズ除去、赤目除去、写真の復元、パスポート写真の生成、透明度の修正 (BiRefNet HR マット化)、およびコンテンツに応じたサイズ変更 (Go caire バイナリ)。
|
||||
|
||||
Python スクリプトは `packages/ai/python/` にあります。Docker イメージはビルド時にすべてのモデルの重みを事前ダウンロードするため、コンテナは完全にオフラインで動作します。
|
||||
Python スクリプトは `packages/ai/python/` に存在します。大規模なオプションのモデル パックは、オンデマンドで永続 `/data/ai` ボリュームにインストールされます。正確な OCR は、署名されたプラットフォーム固有のアーティファクトを使用します。組み込みの Tesseract 層では、モデル パックのダウンロードは必要ありません。
|
||||
|
||||
### `@snapotter/shared` {#snapotter-shared}
|
||||
|
||||
@@ -87,7 +87,7 @@ Vite でビルドされた React 19 のシングルページアプリです。
|
||||
2. フロントエンドが、ファイルと設定を添えて `/api/v1/tools/:section/:toolId` へマルチパート POST を送信します。
|
||||
3. API ルートが Zod で入力を検証し、処理をディスパッチします。
|
||||
4. 標準ツールの場合、ジョブは適切な BullMQ プール(モダリティに応じて image、media、または docs)にエンキューされます。プロセス内の BullMQ ワーカーが、EXIF メタデータに基づいて画像を自動回転させ、ツールのプロセス関数を実行して結果を返します。
|
||||
5. AI ツールの場合、TypeScript ブリッジが常駐する Python ディスパッチャーへリクエストを送り(またはフォールバックとして新しいサブプロセスを生成し)、完了を待って出力ファイルを読み取ります。
|
||||
5. ほとんどの AI ツールでは、TypeScript ブリッジは永続的な Python dispatcher にリクエストを送信します。 高速 OCR は代わりに Tesseract を呼び出し、正確な OCR はアクティブな不変 OCR 世代から固定された実行可能ファイルを開始します。 要求された OCR 層は入力時に固定され、実行中にサイレントに変更されることはありません。
|
||||
6. ジョブの進捗は PostgreSQL の `jobs` テーブルに永続化されるため、状態はコンテナの再起動を越えて保持されます。リアルタイム更新は `/api/v1/jobs/:jobId/progress` の SSE で配信されます。
|
||||
7. API は `jobId` と `downloadUrl` を返します。ユーザーは `/api/v1/download/:jobId/:filename` から処理済みファイルをダウンロードします。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user