diff --git a/README.md b/README.md index 52ecb70..1e9cd3a 100644 --- a/README.md +++ b/README.md @@ -251,14 +251,15 @@ language = "en" | Параметр | CUDA | OpenVINO (GPU) | OpenVINO (CPU) | ONNX | CPU | |----------|------|----------------|----------------|------|-----| -| model | medium | medium | medium | gigaam-v3 | medium | +| model | medium | medium | medium | gigaam-v3-e2e-rnnt | medium | | compute_type | float16 | int8 | int8 | int8 | float32 | | language | ru | ru | ru | ru | ru | ## Модели и GPU Рекомендации: -- **По умолчанию:** `medium` — хороший баланс скорости и качества +- **По умолчанию для ONNX:** `gigaam-v3-e2e-rnnt` — читаемый русский текст с + пунктуацией почти без потери скорости относительно сырого `gigaam-v3` - **Макс. качество (NVIDIA):** `large-v3` + `--compute-type float16` - **Макс. качество (Intel GPU):** `large-v3` + `--device openvino-gpu` - **Макс. скорость CPU (русский):** `--device onnx --model gigaam-v3` (17-29× RTF, без пунктуации; рекомендуется LLM-нормализация терминов после) @@ -294,10 +295,10 @@ language = "en" Методика и качественное сравнение: [benchmark GigaAM и Whisper](docs/benchmarks/2026-08-11-gigaam-model-comparison.md). -> **Рекомендация**: для готового читаемого русского текста -> используйте `gigaam-v3-e2e-rnnt`, для последующей машинной обработки — более -> точный по словам `gigaam-v3` без пунктуации. Для смешанной речи с приоритетом -> качества используйте `gigaam-multilingual-large-ctc`: она примерно вдвое +> **Рекомендация**: ONNX по умолчанию использует `gigaam-v3-e2e-rnnt` для +> готового читаемого русского текста. Для последующей машинной обработки можно +> явно выбрать более точный по словам `gigaam-v3` без пунктуации. Для смешанной +> речи с приоритетом качества используйте `gigaam-multilingual-large-ctc`: она примерно вдвое > медленнее small-варианта, но приблизилась к monolingual GigaAM по WER. > `parakeet-v3` в 1,58 раза быстрее Large и ставит пунктуацию, но на тех же > трёх записях хуже по WER и вставляет ложные английские фразы в русскую речь; diff --git a/docs/adr/006-onnx-asr-backend.md b/docs/adr/006-onnx-asr-backend.md index 0b1b184..bec38b3 100644 --- a/docs/adr/006-onnx-asr-backend.md +++ b/docs/adr/006-onnx-asr-backend.md @@ -1,7 +1,8 @@ -# ADR-006: onnx-asr бэкенд — GigaAM v3 как CPU-default для русских встреч +# ADR-006: GigaAM RNN-T как модель по умолчанию для ONNX-пути **Статус**: Принято **Дата**: 2026-04-25 +**Обновлено**: 2026-08-11 ## Контекст @@ -100,19 +101,27 @@ Mm-hmm-редукция и иностранные вставки **не обна ## Решение -**Принять onnx-asr как экспериментальный бэкенд с явным `--device onnx`. GigaAM v3 — рекомендуемая модель для русских встреч на CPU.** +**Принять onnx-asr как экспериментальный бэкенд с явным `--device onnx`. +GigaAM v3 E2E RNN-T — модель по умолчанию для русских встреч на CPU.** Бэкенд **не в auto-detect** — только при явном указании пользователем (политика experimental backend, как для openvino). Модели: -- **`gigaam-v3`** — рекомендуемая для русских встреч на CPU. 17-29× RTF, summary utility 4/5 на всех протестированных файлах. Без пунктуации, без латиницы; ошибки локальны, чинятся LLM-нормализацией. +- **`gigaam-v3-e2e-rnnt`** — модель по умолчанию: практически равна обычному + GigaAM по скорости, немного уступает по WER, но выдаёт готовую пунктуацию для + пользователей, которые читают транскрипт напрямую. +- **`gigaam-v3`** — явный профиль для последующей машинной обработки. 17-29× + RTF, summary utility 4/5 на всех протестированных файлах. Без пунктуации и + латиницы; ошибки локальны, чинятся LLM-нормализацией. - **`parakeet-v3`** — multilingual (25 языков), формально доступен. **Не рекомендуется для русских встреч**: Mm-hmm-редукция и иноязычные вставки воспроизводятся систематически (см. выше). Уместен только для англоязычного контента. -Обе модели в int8-квантизации (~300 MB). +Все перечисленные модели доступны в int8-квантизации. ## Последствия - Пользователи CPU-only с русскоязычным контентом получают 3-5× ускорение по сравнению с OpenVINO medium **при превосходящем качестве** (4/5 vs 1-2/5 summary utility на длинных файлах). +- Пользователи ONNX без явного `--model` получают пунктуацию и нормализацию + RNN-T; более точный сырой CTC остаётся доступен как `--model gigaam-v3`. - Whisper medium (`--device openvino-cpu`) **остаётся допустимым** для коротких (≤30 мин) встреч с равномерной громкостью; на длинных файлах с тихими участками он галлюцинирует целыми блоками — этот риск зафиксирован, но решение не выводит OpenVINO из списка дефолтов (часть пользователей всё ещё нуждается в пунктуации, и для коротких файлов галлюцинации не воспроизводятся). - Parakeet-v3 формально доступен, но в README рекомендуется только для англоязычного контента — для русского явно не годится. - GPU faster-whisper large-v3 остаётся эталоном по качеству (для пользователей с NVIDIA GPU). @@ -121,10 +130,6 @@ Mm-hmm-редукция и иностранные вставки **не обна ## Открытые вопросы / следующие шаги - **Galлюцинации Whisper medium на длинных файлах** — отдельный продуктовый риск, требующий собственного исследования. Возможно, имеет смысл ограничить максимальную длину чанка для openvino-medium, или дать предупреждение пользователю. -- **GigaAM v3 E2E RNN-T** протестирована позднее на трёх 14–15-минутных - записях: она практически равна обычному GigaAM по скорости и даёт готовую - пунктуацию, но немного уступает по совокупному WER. Результаты и обновлённая - рекомендация: [benchmark 2026-08-11](../benchmarks/2026-08-11-gigaam-model-comparison.md). - **Canary** (`nemo-canary-1b-v2`) — тяжелее, но multilingual + пунктуация. Кандидат на «лучшее качество за разумную скорость» для тех, кому важна пунктуация. - **Auto-detect onnx**: после стабилизации в production-использовании (несколько недель) — рассмотреть включение в auto-detect как первый CPU-бэкенд (ниже CUDA, выше OpenVINO). diff --git a/docs/benchmarks/2026-08-11-gigaam-model-comparison.md b/docs/benchmarks/2026-08-11-gigaam-model-comparison.md index 883d13a..e1b6c6a 100644 --- a/docs/benchmarks/2026-08-11-gigaam-model-comparison.md +++ b/docs/benchmarks/2026-08-11-gigaam-model-comparison.md @@ -197,10 +197,10 @@ FasterWhisper лучше сохраняет `API`, `ETL`, `Open Platform`; об 11 раз медленнее GigaAM ради снижения WER примерно на 5–6 процентных пунктов. На CUDA соотношение необходимо измерять отдельно. -Три записи подтверждают RNN-T как практический профиль для готового текста, но -не дают оснований молча менять общий default: существующие пользователи могут -предпочитать более точный сырой `gigaam-v3`, а пунктуация RNN-T заметно дробит -живую речь. Лучше выразить выбор явными профилями CLI или конфигурации. +По итогам сравнения и обсуждения двух основных сценариев RNN-T выбрана моделью +по умолчанию для явного `--device onnx`: небольшая потеря дословной точности +принята ради читаемого результата с пунктуацией. Для LLM-пайплайнов и поиска, +где важнее сырой текст, `gigaam-v3` остаётся явным профилем. ## Воспроизводимость diff --git a/docs/specs/2026-08-11-onnx-model-catalog.md b/docs/specs/2026-08-11-onnx-model-catalog.md index f3a33f1..556070a 100644 --- a/docs/specs/2026-08-11-onnx-model-catalog.md +++ b/docs/specs/2026-08-11-onnx-model-catalog.md @@ -83,11 +83,18 @@ CTranslate2, а onnx-путь ставится в CPU-варианте. Конкретные номера берутся из `uv.lock` при реализации. +## Последующее решение о модели по умолчанию + +После сравнительного прогона на трёх реальных записях и обсуждения двух +основных потребителей транскрипта модель `gigaam-v3-e2e-rnnt` выбрана моделью +по умолчанию для явного `--device onnx`. Она всего на 2% медленнее сырого +`gigaam-v3`, но выдаёт пунктуацию для чтения человеком; `gigaam-v3` остаётся +явным профилем с приоритетом дословной точности и последующей обработки LLM. +Это решение не включает ONNX в auto-detect. + ## Чего не делаем -- Не меняем модель по умолчанию и auto-detect: `gigaam-v3` остаётся дефолтом - `--device onnx`. Решение о CPU-дефолте требует замеров на целевом Intel Core - i5, которого сейчас нет в доступе. +- Не меняем auto-detect: ONNX остаётся только явным выбором пользователя. - Не обновляем OpenVINO, OpenVINO GenAI и CTranslate2. Whisper medium на OpenVINO — то, с чем сравниваются новые модели; менять его движок одновременно значит потерять точку отсчёта. Верхние границы версий им при @@ -156,8 +163,9 @@ Python и зависимости при неизменных моделях — ## Документация -README: четыре модели в таблицу ONNX-моделей. Для русского без пунктуации -рекомендуется `gigaam-v3`, для готового читаемого текста — E2E RNN-T, для +README: поддерживаемые модели добавляются в таблицу ONNX-моделей. Для готового +читаемого русского текста и как модель по умолчанию используется E2E RNN-T, +для русского без пунктуации и LLM-пайплайнов остаётся явный `gigaam-v3`, для смешанной речи с приоритетом качества — multilingual large. Скорость на слабых CPU не измерялась. Требование Python правится в [`docs/PRD.md`](../PRD.md) — раздел «Требования» и таблица diff --git a/src/local_transcriber/config.py b/src/local_transcriber/config.py index adfc801..2b80b1b 100644 --- a/src/local_transcriber/config.py +++ b/src/local_transcriber/config.py @@ -17,7 +17,7 @@ DEVICE_DEFAULTS: dict[str, dict[str, str]] = { "openvino": {"model": "medium", "compute_type": "int8"}, "openvino-gpu": {"model": "medium", "compute_type": "int8"}, "openvino-cpu": {"model": "medium", "compute_type": "int8"}, - "onnx": {"model": "gigaam-v3", "compute_type": "int8"}, + "onnx": {"model": "gigaam-v3-e2e-rnnt", "compute_type": "int8"}, } # Одно место правды для допустимых ключей конфига diff --git a/tests/test_config.py b/tests/test_config.py index 6be585d..00e834b 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -113,6 +113,21 @@ def test_apply_device_defaults_cpu(): assert result["compute_type"] == "float32" +def test_apply_device_defaults_onnx_uses_readable_model(): + defaults = { + "model": "medium", + "language": "ru", + "device": "auto", + "compute_type": "float32", + } + cli = {"model": None, "language": None, "device": None, "compute_type": None} + + result = apply_device_defaults(defaults, "onnx", cli, {}) + + assert result["model"] == "gigaam-v3-e2e-rnnt" + assert result["compute_type"] == "int8" + + def test_apply_device_defaults_cli_overrides(): defaults = {"model": "large-v3", "language": "ru", "device": "auto", "compute_type": "int8"} cli = {"model": "large-v3", "language": None, "device": None, "compute_type": "int8"}