From 8f85930616720067c17c25491006ff11362d85a8 Mon Sep 17 00:00:00 2001 From: Dmitriy Dementiev Date: Tue, 11 Aug 2026 16:12:36 +0300 Subject: [PATCH] =?UTF-8?q?feat(onnx):=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=20GigaAM=20Multilingual=20Large?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - расширенный benchmark показал устойчивое улучшение multilingual large на трёх реальных записях. - Что: - добавлен alias gigaam-multilingual-large-ctc с квантизациями int8 и float32. - обновлены README, спецификация, backlog и сравнительный benchmark. - Проверка: - uv run pytest -q: 225 passed, 1 skipped. - uvx ruff check src/local_transcriber/backends/onnx_asr.py tests/test_onnx_asr.py. --- README.md | 29 ++++++++++++------- docs/backlog.md | 7 ++++- .../2026-08-11-gigaam-model-comparison.md | 22 +++++++++++--- docs/specs/2026-08-11-onnx-model-catalog.md | 20 ++++++++----- src/local_transcriber/backends/onnx_asr.py | 4 +++ tests/test_onnx_asr.py | 1 + 6 files changed, 59 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 8c2684e..cfcca3b 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,9 @@ transcribe podcast.wav --device onnx --model gigaam-v3-e2e-ctc # Смешанная русско-английская речь transcribe meeting.wav --device onnx --model gigaam-multilingual-ctc +# Повышенная точность смешанной речи (медленнее, ~590 MB) +transcribe meeting.wav --device onnx --model gigaam-multilingual-large-ctc + # Сохранить в конкретный файл transcribe interview.m4a --output result.md ``` @@ -280,24 +283,28 @@ language = "en" | Модель | Размер (int8) | RTFx CPU | Языки | Пунктуация | |--------|--------------|----------|-------|-----------| | `gigaam-v3` | ~300 MB | 17-29× | ru | ❌ | -| `gigaam-multilingual-ctc` | ~300 MB | 10,5×* | ru, en, kk, ky, uz | ❌ | -| `gigaam-v3-e2e-ctc` | ~300 MB | 12,3×* | ru | ✅ | -| `gigaam-v3-e2e-rnnt` | ~300 MB | 11,7×* | ru | ✅ | +| `gigaam-multilingual-ctc` | ~300 MB | 10,0×* | ru, en, kk, ky, uz | ❌ | +| `gigaam-multilingual-large-ctc` | ~590 MB | 4,8×* | ru, en, kk, ky, uz | ❌ | +| `gigaam-v3-e2e-ctc` | ~300 MB | 11,9×* | ru | ✅ | +| `gigaam-v3-e2e-rnnt` | ~300 MB | 11,5×* | ru | ✅ | | `parakeet-v3` | ~600 MB | 12-20× | 25 языков | ✅ | -\* Наблюдение на AMD Ryzen 7 8845H, Windows, `int8`, запись 14:51. Это не -приёмочный замер для целевого Intel Core i5. Методика и качественное сравнение: +\* Наблюдение на AMD Ryzen 7 8845H, Windows, `int8`, три записи общей +длительностью 43:37. Это не приёмочный замер для целевого Intel Core i5. +Методика и качественное сравнение: [benchmark GigaAM и Whisper](docs/benchmarks/2026-08-11-gigaam-model-comparison.md). > **Рекомендация**: для готового читаемого русского текста > используйте `gigaam-v3-e2e-rnnt`, для последующей машинной обработки — более -> точный по словам `gigaam-v3` без пунктуации. Вывод проверен на трёх реальных -> записях общей длительностью 43:37. `parakeet-v3` на русском воспроизводит -> проблемы из [ADR-005](docs/adr/005-parakeet-evaluation.md). +> точный по словам `gigaam-v3` без пунктуации. Для смешанной речи с приоритетом +> качества используйте `gigaam-multilingual-large-ctc`: она примерно вдвое +> медленнее small-варианта, но приблизилась к monolingual GigaAM по WER. +> `parakeet-v3` на русском воспроизводит проблемы из +> [ADR-005](docs/adr/005-parakeet-evaluation.md). -GigaAM Multilingual сама распознаёт русский, английский, казахский, кыргызский и -узбекский внутри одной записи. `onnx-asr` не передаёт этой модели подсказку -языка, поэтому `--language` не управляет её выбором языка. +Обе GigaAM Multilingual сами распознают русский, английский, казахский, +кыргызский и узбекский внутри одной записи. `onnx-asr` не передаёт этим моделям +подсказку языка, поэтому `--language` не управляет выбором языка. Для моделей из таблицы опубликованы `int8` и `float32`. Если неявный device-aware дефолт недоступен для выбранной модели, CLI сообщит о подстановке diff --git a/docs/backlog.md b/docs/backlog.md index c9209b9..35b9146 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -10,6 +10,11 @@ ### Переоценка CPU-дефолта после обновления `onnx-asr` 0.12 +**Промежуточный статус 2026-08-11:** короткая матрица на трёх записях завершена +и описана в [benchmark GigaAM и Whisper](benchmarks/2026-08-11-gigaam-model-comparison.md). +Multilingual Large добавлена как явный качественный профиль; решение о default +по-прежнему ждёт целевого Intel Core i5 и длинных негативных примеров. + **Проблема:** текущий CPU-путь через OpenVINO Whisper medium нестабилен на длинных записях с тихими участками: модель генерирует правдоподобные повторы и несуществующий текст. На файле `2026-07-29 13-58-39.mp4` разговор заканчивается @@ -28,7 +33,7 @@ Python 3.10. Шаг 1 в части onnx-пути вынесен в отдельную работу — [спека «Onnx-каталог, Python 3.13 и границы версий»](specs/2026-08-11-onnx-model-catalog.md): движок - обновляется, три модели становятся поддерживаемыми, дефолт и OpenVINO не + обновляется, четыре модели становятся поддерживаемыми, дефолт и OpenVINO не трогаются намеренно, чтобы сохранить точку отсчёта для будущего сравнения. 2. После интеграционных тестов провести сравнительный бенчмарк моделей. Не менять CPU-дефолт только по model card или результату на одном файле. diff --git a/docs/benchmarks/2026-08-11-gigaam-model-comparison.md b/docs/benchmarks/2026-08-11-gigaam-model-comparison.md index 1fe6d32..f613cb5 100644 --- a/docs/benchmarks/2026-08-11-gigaam-model-comparison.md +++ b/docs/benchmarks/2026-08-11-gigaam-model-comparison.md @@ -5,6 +5,7 @@ **Статус:** завершённый benchmark на трёх записях **Машина:** AMD Ryzen 7 8845H, Windows, CPU + **Квантизация ONNX:** int8 ## Цель @@ -40,6 +41,7 @@ | OpenVINO medium | 190,6 с | 4,67× | **23,9%** | 187 | | GigaAM v3 | **72,6 с** | **12,27×** | 26,5% | 0 | | GigaAM Multilingual CTC | 84,8 с | 10,51× | 27,9% | 0 | +| GigaAM Multilingual Large CTC | 192,0 с | 4,64× | 27,5% | 0 | | GigaAM v3 E2E RNN-T | 76,1 с | 11,71× | 29,0% | 326 | | GigaAM v3 E2E CTC | **72,6 с** | **12,27×** | 31,8% | 338 | @@ -55,11 +57,13 @@ cached-прогон для точного замера. |---|---|---:|---:|---:| | RSQM | GigaAM v3 | 75,1 с | 11,25× | **23,1%** | | RSQM | Multilingual CTC | 82,7 с | 10,21× | 24,4% | +| RSQM | Multilingual Large CTC | 163,4 с | 5,17× | 23,8% | | RSQM | E2E RNN-T | 72,8 с | 11,60× | 25,4% | | RSQM | E2E CTC | **71,1 с** | **11,88×** | 28,0% | | RSQM | FasterWhisper medium | 686,1 с | 1,23× | **19,7%** | | DataCat | GigaAM v3 | **74,8 с** | **11,79×** | 27,5% | | DataCat | Multilingual CTC | 94,2 с | 9,36× | 27,9% | +| DataCat | Multilingual Large CTC | 189,6 с | 4,65× | 26,7% | | DataCat | E2E RNN-T | 78,0 с | 11,31× | **26,4%** | | DataCat | E2E CTC | 76,0 с | 11,60× | 28,3% | | DataCat | FasterWhisper medium | 954,5 с | 0,92× | **21,9%** | @@ -77,6 +81,7 @@ WER ниже посчитан как micro-average: сумма ошибок по |---|---:|---:|---:|---:| | FasterWhisper medium CPU | 2511,6 с* | 1,04× | **20,9%** | 269 | | GigaAM v3 | 222,5 с | 11,76× | **26,0%** | 0 | +| GigaAM Multilingual Large CTC | 545,0 с | 4,80× | **26,2%** | 0 | | GigaAM v3 E2E RNN-T | 226,9 с | 11,54× | 26,9% | 290 | | GigaAM Multilingual CTC | 261,7 с | 10,00× | 26,9% | 0 | | GigaAM v3 E2E CTC | **219,7 с** | **11,91×** | 29,3% | 305 | @@ -86,8 +91,10 @@ FasterWhisper включал ещё около 263 секунд загрузки прогретом кеше — 686,1 и 954,5 секунды соответственно. RNN-T оказалась лишь на 2% медленнее обычного GigaAM по суммарному времени. -Multilingual медленнее обычного GigaAM на 18%, а выигрыш E2E CTC относительно -RNN-T составляет только 3% и не компенсирует ухудшение текста. +Multilingual Small медленнее обычного GigaAM на 18%, а выигрыш E2E CTC +относительно RNN-T составляет только 3% и не компенсирует ухудшение текста. +Multilingual Large в 2,08 раза медленнее Small и в 2,45 раза медленнее обычного +GigaAM, но всё ещё в 4,6 раза быстрее FasterWhisper. ## Качественное чтение @@ -109,6 +116,10 @@ RNN-T составляет только 3% и не компенсирует ух `иnженter`, `мetднные`, `оrкl`, `линейдgами`. - Multilingual CTC не улучшила даже терминологически насыщенный DataCat и оказалась на 15–26% медленнее обычного GigaAM на новых записях. +- Multilingual Large CTC улучшила Small на всех трёх записях и почти сравнялась + с monolingual GigaAM по совокупному WER: 26,2% против 26,0%. При ручном + чтении скрытой деградации не найдено, но пунктуации по-прежнему нет, а термины + передаются преимущественно фонетически (`файнбиай`, `найфай`, `терадата`). Длинных автономных галлюцинаций не найдено. Есть локальные потенциально опасные искажения имён и терминов: `Иришка`, `Lutriness`, «расчёт @@ -131,8 +142,11 @@ FasterWhisper лучше сохраняет `API`, `ETL`, `Open Platform`; об - Для последующей машинной обработки, поиска или собственной расстановки пунктуации — `gigaam-v3`: лучший совокупный WER среди быстрых ONNX-вариантов и более стабильный сырой текст. -- `gigaam-v3-e2e-ctc` и `gigaam-multilingual-ctc` на этой записи преимуществ - не показали. +- Для смешанной речи с приоритетом качества сырого текста — + `gigaam-multilingual-large-ctc`. Она устойчиво лучше Small и почти равна + monolingual GigaAM по WER, но требует 545 секунд против 262 секунд на том же + наборе. Small остаётся вариантом с приоритетом скорости. +- `gigaam-v3-e2e-ctc` преимуществ на этом наборе не показала. - FasterWhisper medium остаётся выбором для важных записей с плотной терминологией, если допустима обработка около realtime. По трём файлам она в 11 раз медленнее GigaAM ради снижения WER примерно на 5–6 процентных пунктов. diff --git a/docs/specs/2026-08-11-onnx-model-catalog.md b/docs/specs/2026-08-11-onnx-model-catalog.md index 3a41144..f3a33f1 100644 --- a/docs/specs/2026-08-11-onnx-model-catalog.md +++ b/docs/specs/2026-08-11-onnx-model-catalog.md @@ -14,9 +14,11 @@ ## Что делаем Снимаем ограничение версии, поднимаем `onnx-asr` до 0.12 и делаем -поддерживаемыми три модели: +поддерживаемыми четыре модели: -- `gigaam-multilingual-ctc` — смешанная речь с англоязычными терминами; +- `gigaam-multilingual-ctc` и `gigaam-multilingual-large-ctc` — смешанная речь + с англоязычными терминами; large добавлена после сравнительного benchmark по + явному решению пользователя; - `gigaam-v3-e2e-ctc` и `gigaam-v3-e2e-rnnt` — пунктуация и нормализация текста. Каталог моделей в бэкенде хранит, помимо имени, опубликованные для модели @@ -142,9 +144,10 @@ Python и зависимости при неизменных моделях — - **скорость на Intel Core i5 не измерялась.** Замеры делаются на Ryzen 7 8845H и записываются как наблюдение с указанием CPU — для решения о CPU-дефолте этого недостаточно; -- **качество моделей друг относительно друга не измерялось.** Ручная проверка - отвечает на вопрос «работает ли», а не «лучше ли»; сравнение — отдельная - работа, см. [backlog](../backlog.md). +- **качество моделей измерено предварительно на трёх 14–15-минутных записях.** + Результат фиксирует WER, скорость и ручное чтение, но не заменяет приёмку на + целевом Intel Core i5 и длинных записях; см. + [benchmark](../benchmarks/2026-08-11-gigaam-model-comparison.md). Пошаговый чеклист и практика прогона нужны только на время работ и живут в задаче трекера @@ -153,8 +156,9 @@ Python и зависимости при неизменных моделях — ## Документация -README: три модели в таблицу ONNX-моделей. Рекомендация остаётся прежней — -`gigaam-v3` для русского — пока нет данных, чтобы её менять; у новых моделей -стоит оговорка, что скорость на слабых CPU не измерялась. Требование Python +README: четыре модели в таблицу ONNX-моделей. Для русского без пунктуации +рекомендуется `gigaam-v3`, для готового читаемого текста — E2E RNN-T, для +смешанной речи с приоритетом качества — multilingual large. Скорость на слабых +CPU не измерялась. Требование Python правится в [`docs/PRD.md`](../PRD.md) — раздел «Требования» и таблица технологий; в README версии Python не упоминаются. diff --git a/src/local_transcriber/backends/onnx_asr.py b/src/local_transcriber/backends/onnx_asr.py index 5a3a763..d4469b0 100644 --- a/src/local_transcriber/backends/onnx_asr.py +++ b/src/local_transcriber/backends/onnx_asr.py @@ -30,6 +30,10 @@ MODEL_CATALOG: dict[str, OnnxModelSpec] = { "gigaam-multilingual-ctc", _INT8_AND_FLOAT32, ), + "gigaam-multilingual-large-ctc": OnnxModelSpec( + "gigaam-multilingual-large-ctc", + _INT8_AND_FLOAT32, + ), "gigaam-v3-e2e-ctc": OnnxModelSpec( "gigaam-v3-e2e-ctc", _INT8_AND_FLOAT32, diff --git a/tests/test_onnx_asr.py b/tests/test_onnx_asr.py index f7b9ff2..dc64b45 100644 --- a/tests/test_onnx_asr.py +++ b/tests/test_onnx_asr.py @@ -36,6 +36,7 @@ class TestEnsureModelAvailable: "model_name", [ "gigaam-multilingual-ctc", + "gigaam-multilingual-large-ctc", "gigaam-v3-e2e-ctc", "gigaam-v3-e2e-rnnt", ],