mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
* 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
98 lines
9.3 KiB
Markdown
98 lines
9.3 KiB
Markdown
---
|
||
description: "Извлекайте текст из изображений локально с помощью встроенного Tesseract или дополнительной высокоточной среды выполнения RapidOCR."
|
||
i18n_output_hash: e16d836b025c
|
||
i18n_source_hash: 0d453b49db02
|
||
i18n_provenance: human
|
||
---
|
||
|
||
# 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`
|
||
|
||
**Обработка:** OCR всегда выполняется асинхронно. После проверки и постановки в очередь конечная точка сразу возвращает `202 Accepted` с `jobId`. Отслеживайте поток выполнения задания SSE до конечного события `complete` или `failed`; при успешном завершении его `result` содержит поля OCR.
|
||
|
||
**Точный пакет OCR:** Дополнительная среда выполнения `ocr` (около 208–234 MiB для загрузки и 409–488 MiB, установленная в зависимости от цели). `fast` не требует этого пакета; установщик проверяет точные размеры, связанные подписанным индексом.
|
||
|
||
## Параметры {#parameters}
|
||
|
||
| Параметр | Тип | Обязательный | По умолчанию | Описание |
|
||
|-----------|------|----------|---------|-------------|
|
||
| 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 | Нет | Зависит от уровня | Улучшите локальный контраст перед распознаванием. Fast применяет его напрямую; Сбалансированный и Лучший сохраняют вариант только в том случае, если калиброванная оценка улучшает результат. По умолчанию `true` для `best` и `false` для `fast`/`balanced`. |
|
||
| engine | string | Нет | - | Устаревший псевдоним совместимости. Вместо этого используйте `quality`. `tesseract` сопоставляется с `fast`; устаревшее значение `paddleocr` сопоставляется с `balanced`, но не загружает PaddlePaddle |
|
||
|
||
Если `quality` и `engine` не заданы, SnapOtter выбирает лучший доступный уровень в порядке `best`, `balanced`, `fast`. Для корейского языка `fast` никогда не выбирается: используется `best`, затем `balanced`, либо возвращается ошибка установки или совместимости точной среды выполнения.
|
||
|
||
## Пример запроса {#example-request}
|
||
|
||
```bash
|
||
curl -X POST http://localhost:1349/api/v1/tools/image/ocr \
|
||
-F "file=@document.png" \
|
||
-F 'settings={"quality":"best","language":"en","enhance":true}'
|
||
```
|
||
|
||
## Принятый ответ (202) {#accepted-response-202}
|
||
|
||
```json
|
||
{
|
||
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
||
"async": true
|
||
}
|
||
```
|
||
|
||
### Ход выполнения и результат (SSE) {#progress-sse-optional}
|
||
|
||
Подключитесь к `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"
|
||
}
|
||
}
|
||
```
|
||
|
||
Ошибки обработки передаются в поле `error` конечного события `failed`; после постановки в очередь они не возвращаются как HTTP `422`.
|
||
|
||
## Примечания {#notes}
|
||
|
||
- `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, превышающие ограниченные выходные пределы, отклоняются, а не частично обрабатываются.
|