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,31 +1,39 @@
|
||||
---
|
||||
description: "Витягуйте текст із зображень за допомогою оптичного розпізнавання символів на основі ШІ."
|
||||
i18n_source_hash: 3d85d423b82c
|
||||
description: "Витягуйте текст із зображень локально за допомогою вбудованого Tesseract або додаткового високоточного середовища виконання RapidOCR."
|
||||
i18n_output_hash: e4c4f8150634
|
||||
i18n_source_hash: 0d453b49db02
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 2379df96db26
|
||||
---
|
||||
|
||||
# OCR / Витяг тексту {#ocr-text-extraction}
|
||||
|
||||
Витягуйте текст із зображень за допомогою оптичного розпізнавання символів на основі ШІ. Підтримує кілька мов і рівнів якості.
|
||||
Витягніть текст із зображень, не надсилаючи зображення до зовнішньої служби. Вбудований рівень `fast` використовує Tesseract. Додаткові рівні `balanced` і `best` використовують RapidOCR із закріпленими моделями PP-OCR ONNX.
|
||||
|
||||
|
||||
<!-- korean-ocr-contract:start -->
|
||||
::: info Сумісність OCR для корейської мови
|
||||
Швидкий OCR підтримує `auto`, `en`, `de`, `es`, `fr`, `zh` і `ja`, але не корейську мову (`ko`). Для корейської потрібен пакет точного OCR і рівень `balanced` або `best`. Пакет працює в офіційних контейнерах Linux amd64 і arm64, зокрема на вузлах NVIDIA, де OCR і далі виконується на CPU. Непідтримувані системи отримують явну помилку сумісності без прихованого переходу на `fast`. Корейська з `fast` або застарілим псевдонімом `tesseract` відхиляється до постановки в чергу з `FEATURE_INCOMPATIBLE` і `fast-korean-unsupported`.
|
||||
:::
|
||||
<!-- korean-ocr-contract:end -->
|
||||
## Кінцева точка API {#api-endpoint}
|
||||
|
||||
`POST /api/v1/tools/image/ocr`
|
||||
|
||||
**Обробка:** Синхронна відповідь JSON. Якщо вказано `clientJobId`, прогрес також повідомляється через SSE.
|
||||
**Обробка:** OCR завжди виконується асинхронно. Після перевірки та постановки в чергу кінцева точка одразу повертає `202 Accepted` з `jobId`. Відстежуйте потік виконання завдання SSE до кінцевої події `complete` або `failed`; у разі успіху її `result` містить поля OCR.
|
||||
|
||||
**Пакет моделі:** `ocr` (5-6 ГБ)
|
||||
**Точний пакет OCR:** Додатковий час виконання `ocr` (приблизно 208-234 MiB для завантаження та 409-488 MiB для встановлення, залежно від цілі). Для `fast` цей пакет не потрібен; інсталятор перевіряє точні розміри, обмежені підписаним індексом.
|
||||
|
||||
## Параметри {#parameters}
|
||||
|
||||
| Параметр | Тип | Обов'язковий | За замовчуванням | Опис |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| file | file | Так | - | Файл зображення (multipart) |
|
||||
| quality | string | Ні | `"balanced"` | Рівень якості: `fast` (Tesseract), `balanced` (PaddleOCR v5), `best` (PaddleOCR VL) |
|
||||
| file | file | так | - | Файл зображення (багатокомпонентний), до 512 MiB закодованих і 40 мегапікселів декодованих; все ще застосовується нижчий ліміт завантаження оператора |
|
||||
| quality | string | немає | Динамічний | Рівень якості: `fast` (Tesseract), `balanced` (RapidOCR з малими моделями PP-OCRv6) або `best` (середні моделі PP-OCRv6 з вищою точністю з каліброваним варіантом балів) |
|
||||
| language | string | Ні | `"auto"` | Підказка мови: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko` |
|
||||
| enhance | boolean | Ні | `true` | Попередня обробка зображення для кращої точності OCR |
|
||||
| engine | string | Ні | - | Застаріле. Використовуйте `quality` замість цього. Зіставляє `tesseract` з `fast`, `paddleocr` з `balanced` |
|
||||
| enhance | boolean | немає | Залежно від рівня | Покращте локальний контраст перед розпізнаванням. Fast застосовує його безпосередньо; Balanced і Best зберігають варіант лише тоді, коли відкалібрована оцінка покращує результат. За замовчуванням `true` для `best` і `false` для `fast`/`balanced` |
|
||||
| engine | string | немає | - | Застарілий псевдонім сумісності. Натомість використовуйте `quality`. `tesseract` відображається на `fast`; застаріле значення `paddleocr` відображається на `balanced`, але не завантажує PaddlePaddle |
|
||||
|
||||
Якщо `quality` і `engine` не задано, SnapOtter вибирає найкращий доступний рівень у порядку `best`, `balanced`, `fast`. Для корейської мови `fast` ніколи не вибирається: використовується `best`, потім `balanced`, або повертається помилка встановлення чи сумісності точного середовища виконання.
|
||||
|
||||
## Приклад запиту {#example-request}
|
||||
|
||||
@@ -35,31 +43,55 @@ curl -X POST http://localhost:1349/api/v1/tools/image/ocr \
|
||||
-F 'settings={"quality":"best","language":"en","enhance":true}'
|
||||
```
|
||||
|
||||
## Відповідь (200 OK) {#response-200-ok}
|
||||
## Прийнята відповідь (202) {#accepted-response-202}
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"filename": "document.png",
|
||||
"text": "Extracted text content from the image...",
|
||||
"engine": "paddleocr-vl"
|
||||
"async": true
|
||||
}
|
||||
```
|
||||
|
||||
### Прогрес (SSE, опціонально) {#progress-sse-optional}
|
||||
### Хід виконання та результат (SSE) {#progress-sse-optional}
|
||||
|
||||
Якщо вказано поле форми `clientJobId`, події прогресу передаються потоком:
|
||||
Підключіться до `GET /api/v1/jobs/{jobId}/progress`, використовуючи `jobId` із відповіді `202` (або наданий `clientJobId`). Тримайте потік відкритим до кінцевої події `complete` або `failed`. Успішний кінцевий кадр містить результат OCR у полі `result`:
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"type": "single",
|
||||
"phase": "complete",
|
||||
"stage": "complete",
|
||||
"percent": 100,
|
||||
"result": {
|
||||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||||
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/document_ocr.txt",
|
||||
"originalSize": 12345,
|
||||
"processedSize": 47,
|
||||
"text": "Extracted text content from the image...",
|
||||
"engine": "rapidocr-onnx",
|
||||
"requestedQuality": "best",
|
||||
"actualQuality": "best",
|
||||
"device": "cpu",
|
||||
"provider": "CPUExecutionProvider",
|
||||
"degraded": false,
|
||||
"warnings": [],
|
||||
"runtimeVersion": "2.1.0",
|
||||
"modelVersion": "PP-OCRv6-best-v1-medium"
|
||||
}
|
||||
}
|
||||
```
|
||||
event: progress
|
||||
data: {"phase":"processing","stage":"Recognizing text...","percent":50}
|
||||
```
|
||||
|
||||
Помилки обробки надходять у полі `error` кінцевої події `failed`; після постановки в чергу вони не повертаються як HTTP `422`.
|
||||
|
||||
## Примітки {#notes}
|
||||
|
||||
- Потребує встановлення пакета моделі `ocr` (5-6 ГБ).
|
||||
- OCR повертає витягнутий текст безпосередньо, а не URL завантаження зображення.
|
||||
- Використовує ланцюжок відкату: якщо рівень вищої якості аварійно завершується (наприклад, segfault PaddleOCR), він автоматично повторює спробу з наступним нижчим рівнем.
|
||||
- Якщо рівень повертає порожній текст без аварійного завершення, він також відкочується до наступного рівня.
|
||||
- Рівні якості зіставляються з рушіями: `fast` = Tesseract, `balanced` = PaddleOCR v5, `best` = PaddleOCR VL.
|
||||
- `fast` завжди доступний у підтримуваних образах SnapOtter. Для `balanced` і `best` потрібен додатковий точний пакет OCR.
|
||||
- Вбудований Tesseract додає близько 25 MiB до офіційного зображення. Точний пакет зберігається в `/data/ai`, а не запікається в зображенні.
|
||||
- Акуратний пакет видається для офіційного Linux amd64 і arm64 контейнери. Він навмисно використовує постачальника CPU ONNX Runtime, у тому числі на хостах NVIDIA, тому не залежить від бібліотек CUDA або сумісності GPU. Вихідні та попередньо зібрані інсталяції bare-metal використовують Fast OCR, якщо вони не надають власне сумісне середовище виконання.
|
||||
- Успішний кінцевий `result` містить як витягнутий текст у `text`, так і доступний для завантаження артефакт `.txt` у `downloadUrl`.
|
||||
- SnapOtter вшановує явно запитаний рівень. Якщо `balanced` або `best` недоступні, API повертає `501` із `FEATURE_NOT_INSTALLED` або `FEATURE_INCOMPATIBLE`; він ніколи мовчки не переносить запит на інший рівень.
|
||||
- Вдалий порожній результат залишається порожнім результатом. Помилки виконання повертають помилку замість повторної спроби з механізмом нижчої якості.
|
||||
- Успішний кінцевий `result` повідомляє як `requestedQuality`, так і `actualQuality`, а також механізм, пристрій, постачальника, середовище виконання та версії моделі, а також будь-які попередження.
|
||||
- Підтримує вхідні формати HEIC/HEIF, RAW, TGA, PSD, EXR та HDR через автоматичне декодування.
|
||||
— Надмірні закодовані входи повертають `413`. Зображення розміром понад 40 мегапікселів і відповіді OCR, що перевищують обмежені вихідні межі, відхиляються замість часткової обробки.
|
||||
|
||||
Reference in New Issue
Block a user