Files
SnapOtter/apps/docs/ru/tools/image/ocr.md
T
SnapOtterandGitHub 5f21588f6c chore: prepare the 2.2.0 release (#660)
Bumps every version surface to 2.2.0, fixes a latent version-coupling bug in the
OCR runtime tests, and stops an absent GPU runner from silently stalling a
release.

Version surfaces: scripts/sync-version.sh covers the 11 workspaces, APP_VERSION,
and the docs release commands across all locales. Root package.json plus the
three surfaces the script never reaches are done by hand: the DOCKERHUB.md banner
and tag table, the docker-tags.md pinning table in 21 locales, and the example
runtimeVersion in tools/image/ocr.md in 21 locales. The release-notes archive step
is deliberately not pre-run, so the notes text stays editable until the release.

Latent bug: runtime-state rejects any runtime whose compatibility.snapotterVersion
is not exactly APP_VERSION, and five fixtures pinned the literal 2.1.0. Since
semantic-release rewrites APP_VERSION on every release, the first PR after any
bump would have gone red for a reason nobody would trace to the release. The
fixtures now derive from APP_VERSION.

GPU runner: sign-ocr-index needs verify-ocr-nvidia on self-hosted hardware, and
the gated manifest job needs ai-bundles, so a missing runner queued instead of
failing and produced no image tags. preflight-gpu-runner claims the same labels
with no dependencies, so it is scheduled first and validates the GPU before the
90-minute build. An API preflight is impossible because listing self-hosted
runners needs Administration:read, which GITHUB_TOKEN cannot hold, so RELEASE.md
carries the maintainer-side check.
2026-07-27 22:09:31 +08:00

98 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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.2.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, превышающие ограниченные выходные пределы, отклоняются, а не частично обрабатываются.