docs(specs): спека onnx-каталога, Python 3.13 и границ версий
- Зачем:
- смешанная русско-английская речь и отсутствие пунктуации у gigaam-v3-ctc
закрываются моделями из onnx-asr 0.12, но обновление заблокировано пином.
- Что:
- добавлена спека: три модели в каталог, Python 3.13 и ORT 1.28, верхние
границы мажорных версий, ловушки и границы ручной приёмки.
- в backlog добавлены ссылка на спеку из пункта про CPU-дефолт и новое
направление «профили намерения вместо выбора модели».
- Проверка:
- задача трекера #1 с порядком работ и критериями приёмки.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
579cb87bc0
commit
80b864077a
@@ -26,6 +26,10 @@
|
|||||||
ограничение `onnx-asr<0.12.0`, проверить VAD и квантованные модели; OpenVINO и
|
ограничение `onnx-asr<0.12.0`, проверить VAD и квантованные модели; OpenVINO и
|
||||||
OpenVINO GenAI обновлять согласованно. Не фиксировать ONNX Runtime 1.28 для
|
OpenVINO GenAI обновлять согласованно. Не фиксировать ONNX Runtime 1.28 для
|
||||||
Python 3.10.
|
Python 3.10.
|
||||||
|
Шаг 1 в части onnx-пути вынесен в отдельную работу —
|
||||||
|
[спека «Onnx-каталог, Python 3.13 и границы версий»](specs/2026-08-11-onnx-model-catalog.md): движок
|
||||||
|
обновляется, три модели становятся поддерживаемыми, дефолт и OpenVINO не
|
||||||
|
трогаются намеренно, чтобы сохранить точку отсчёта для будущего сравнения.
|
||||||
2. После интеграционных тестов провести сравнительный бенчмарк моделей. Не
|
2. После интеграционных тестов провести сравнительный бенчмарк моделей. Не
|
||||||
менять CPU-дефолт только по model card или результату на одном файле.
|
менять CPU-дефолт только по model card или результату на одном файле.
|
||||||
3. Решение зафиксировать в ADR-007, обновить рекомендации README и только затем
|
3. Решение зафиксировать в ADR-007, обновить рекомендации README и только затем
|
||||||
@@ -226,6 +230,23 @@ SQL`), словарь пользовательский в `.transcriber.toml`.
|
|||||||
|
|
||||||
## Авто-детект и UX
|
## Авто-детект и UX
|
||||||
|
|
||||||
|
### Профили намерения вместо выбора модели
|
||||||
|
|
||||||
|
**Что:** Вместо `--model gigaam-v3-e2e-rnnt` пользователь выбирает намерение —
|
||||||
|
условные `ru-fast`, `ru-readable`, `mixed`, — а проект разворачивает его в пару
|
||||||
|
модель + квантизация с учётом устройства.
|
||||||
|
|
||||||
|
**Почему:** Имена onnx-моделей ничего не говорят о том, что получит
|
||||||
|
пользователь, и различие «поддерживаемая модель ≠ рекомендуемая» через них не
|
||||||
|
выражается.
|
||||||
|
|
||||||
|
**Почему откладывается:** профиль осмыслен, когда известно, какой профиль чем
|
||||||
|
закрывается — то есть после сравнительной оценки. Введение понятия раньше
|
||||||
|
данных закрепит догадку в интерфейсе. Источник:
|
||||||
|
[спека «Onnx-каталог, Python 3.13 и границы версий»](specs/2026-08-11-onnx-model-catalog.md).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### Включение `onnx` в `--device auto`
|
### Включение `onnx` в `--device auto`
|
||||||
|
|
||||||
**Что:** После периода стабилизации `--device onnx` (несколько недель production-использования без жалоб) — рассмотреть включение в auto-detect chain.
|
**Что:** После периода стабилизации `--device onnx` (несколько недель production-использования без жалоб) — рассмотреть включение в auto-detect chain.
|
||||||
|
|||||||
@@ -0,0 +1,160 @@
|
|||||||
|
# Onnx-каталог, Python 3.13 и границы версий
|
||||||
|
|
||||||
|
## Проблема
|
||||||
|
|
||||||
|
Смешанная русско-английская речь и отсутствие пунктуации у `gigaam-v3-ctc` —
|
||||||
|
известные ограничения onnx-пути ([ADR-006](../adr/006-onnx-asr-backend.md)). В
|
||||||
|
`onnx-asr` 0.12 появились модели, которые их адресуют, но обновление
|
||||||
|
заблокировано ограничением `onnx-asr[cpu,hub]>=0.11.0,<0.12.0` в
|
||||||
|
`pyproject.toml`.
|
||||||
|
|
||||||
|
Состояние движков и первичные источники —
|
||||||
|
[исследование обновлений](../research/2026-08-10-engine-model-updates.md).
|
||||||
|
|
||||||
|
## Что делаем
|
||||||
|
|
||||||
|
Снимаем ограничение версии, поднимаем `onnx-asr` до 0.12 и делаем
|
||||||
|
поддерживаемыми три модели:
|
||||||
|
|
||||||
|
- `gigaam-multilingual-ctc` — смешанная речь с англоязычными терминами;
|
||||||
|
- `gigaam-v3-e2e-ctc` и `gigaam-v3-e2e-rnnt` — пунктуация и нормализация текста.
|
||||||
|
|
||||||
|
Каталог моделей в бэкенде хранит, помимо имени, опубликованные для модели
|
||||||
|
квантизации — сейчас такого места нет, потому что алиасы отображают имя в имя.
|
||||||
|
Расширять существующую таблицу или заводить рядом отдельную структуру —
|
||||||
|
решается при реализации. Passthrough сырых имён onnx-asr сохраняется: он не
|
||||||
|
мешает и оставляет дверь для экспериментов.
|
||||||
|
|
||||||
|
Заодно поднимаем минимальную версию Python до 3.13 и ONNX Runtime до последней
|
||||||
|
доступной (1.28 на момент написания). Python 3.10 в режиме security-only и
|
||||||
|
снимается с поддержки в октябре 2026, а ORT 1.28 требует минимум 3.11 — так что
|
||||||
|
подъём floor и обновление рантайма идут вместе. Следствие: зависимость `tomli` и
|
||||||
|
условный импорт в `config.py` становятся мёртвым кодом и убираются — начиная с
|
||||||
|
3.11 есть `tomllib`.
|
||||||
|
|
||||||
|
Floor берётся сразу 3.13, а не минимально достаточный 3.11: любой подъём версии
|
||||||
|
всё равно требует прогона на всех трёх платформах, и дорого именно тестирование,
|
||||||
|
а не строка в `pyproject.toml`. Один переезд вместо двух. Проект ставится там,
|
||||||
|
где доступны uv и PyPI, поэтому uv сам поднимет нужный интерпретатор; закрытых
|
||||||
|
контуров и оффлайн-зеркал среди пользователей нет.
|
||||||
|
|
||||||
|
Рабочая версия фиксируется файлом `.python-version` (сейчас его в репозитории
|
||||||
|
нет). Floor разрешает любой интерпретатор от 3.13 и выше, а пин делает окружение
|
||||||
|
одинаковым на разных машинах — иначе расхождение вылезает именно тогда, когда
|
||||||
|
что-то отлаживаешь.
|
||||||
|
|
||||||
|
Колёса cp313 проверены для всех нативных зависимостей и всех трёх целевых
|
||||||
|
платформ — Windows, Linux, macOS: `openvino-genai` 2026.0.0.0, `ctranslate2`
|
||||||
|
4.7.1, `onnxruntime` 1.28.0. На macOS `openvino-genai` не ставится по
|
||||||
|
существующему маркеру `sys_platform != 'darwin'`, так что там остаются
|
||||||
|
faster-whisper на CPU и onnx-путь — это не меняется этой работой, но стоит
|
||||||
|
помнить, раз появились пользователи на Mac.
|
||||||
|
|
||||||
|
GPU-пакеты ORT с их требованием CUDA 13 нас не касаются: CUDA идёт через
|
||||||
|
CTranslate2, а onnx-путь ставится в CPU-варианте.
|
||||||
|
|
||||||
|
## Границы версий
|
||||||
|
|
||||||
|
Каждая прямая зависимость получает верхнюю границу по мажорной версии. Причина
|
||||||
|
не в осторожности вообще, а в канале установки: README предлагает
|
||||||
|
`uv tool install git+…`, а этот путь резолвит зависимости заново из метаданных
|
||||||
|
пакета — `uv.lock` в колесо не попадает и не участвует. Диапазоны в
|
||||||
|
`[project.dependencies]` — единственное, что ограничивает версии на машине
|
||||||
|
пользователя. Установки в разные месяцы иначе дают разные наборы библиотек при
|
||||||
|
одном и том же коде, и такие расхождения дороже разбирать, чем поднимать
|
||||||
|
границы вручную.
|
||||||
|
|
||||||
|
Три случая, которые сами собой не решаются:
|
||||||
|
|
||||||
|
- **`onnxruntime` объявляется прямой зависимостью с границей**, хотя проект его
|
||||||
|
не импортирует. `[tool.uv] constraint-dependencies` для этого не годится:
|
||||||
|
по документации uv он действует только когда uv резолвит сам проект, и
|
||||||
|
игнорируется, когда пакет ставят как зависимость.
|
||||||
|
- **`nvidia-cublas-cu12` получает границу по мажорной версии.**
|
||||||
|
`_cuda_bootstrap.py` преднагружает `libcublas.so.12` по точному soname
|
||||||
|
([ADR-001](../adr/001-cuda-bootstrap.md)); мажорный апгрейд даёт другой soname
|
||||||
|
и ломает bootstrap при неизменном коде.
|
||||||
|
- **`openvino-genai` фиксируется на проверенной линии 2026.0**, а не просто «до
|
||||||
|
следующего года». Иначе свежая установка подтянет 2026.3 и незаметно поменяет
|
||||||
|
ту самую точку отсчёта, которую мы договорились не трогать. Границу снимает
|
||||||
|
отдельная работа по обновлению OpenVINO — осознанно.
|
||||||
|
|
||||||
|
Конкретные номера берутся из `uv.lock` при реализации.
|
||||||
|
|
||||||
|
## Чего не делаем
|
||||||
|
|
||||||
|
- Не меняем модель по умолчанию и auto-detect: `gigaam-v3` остаётся дефолтом
|
||||||
|
`--device onnx`. Решение о CPU-дефолте требует замеров на целевом Intel Core
|
||||||
|
i5, которого сейчас нет в доступе.
|
||||||
|
- Не обновляем OpenVINO, OpenVINO GenAI и CTranslate2. Whisper medium на
|
||||||
|
OpenVINO — то, с чем сравниваются новые модели; менять его движок
|
||||||
|
одновременно значит потерять точку отсчёта. Верхние границы версий им при
|
||||||
|
этом проставляются — см. «Границы версий»; это фиксация текущего состояния, а
|
||||||
|
не обновление.
|
||||||
|
- Не добавляем алиасы `large-v3-turbo`, диаризацию, чанкование по паузам и
|
||||||
|
словарь замен терминов — отдельные пункты [backlog](../backlog.md).
|
||||||
|
|
||||||
|
## Ловушки
|
||||||
|
|
||||||
|
- **`compute_type` разрешается по устройству, а не по модели.**
|
||||||
|
`DEVICE_DEFAULTS["onnx"]` даёт `int8` независимо от модели, а `int8`
|
||||||
|
опубликован не для всех. Для модели без запрошенной квантизации проект должен
|
||||||
|
взять доступную и сказать об этом; явно заданное пользователем значение
|
||||||
|
остаётся ошибкой, а не тихой подменой. Явным считается и значение из
|
||||||
|
`.transcriber.toml`, не только флаг CLI — подстановка допустима лишь там, где
|
||||||
|
квантизацию выбрал сам проект. Это единственное изменение в каскаде
|
||||||
|
конфигурации.
|
||||||
|
- **Язык у multilingual-модели.** Проект по умолчанию форсирует `ru`, а интерес
|
||||||
|
— как раз смешанная речь. Надо посмотреть, принимает ли модель подсказку языка
|
||||||
|
или определяет сама, и описать правило в README.
|
||||||
|
- **E2E меняет форму текста.** Пунктуация и нормализация могут повлиять на
|
||||||
|
группировку абзацев в `formatter.py` и на предупреждения `quality.py`,
|
||||||
|
написанные под поведение Whisper.
|
||||||
|
- **VAD.** В 0.12 исправлены сегменты нулевой длины после VAD — проект
|
||||||
|
оборачивает модель в `.with_vad()`, так что изменение касается нас напрямую.
|
||||||
|
|
||||||
|
## Как проверяем
|
||||||
|
|
||||||
|
Работа идёт в отдельной ветке (по конвенции репозитория — `feature/…`), в
|
||||||
|
`master` вливается только после ручной проверки. Причина не в процессе ради
|
||||||
|
процесса: переезд на 3.13 пересобирает окружение целиком, и откатывать это на
|
||||||
|
основной ветке неприятно. Ветка позволяет держать рабочий `master` под рукой,
|
||||||
|
пока новое окружение не подтвердилось.
|
||||||
|
|
||||||
|
Внутри ветки смена окружения и смена библиотеки проверяются раздельно: сначала
|
||||||
|
Python и зависимости при неизменных моделях — поведение обязано остаться
|
||||||
|
прежним, — и только потом `onnx-asr` 0.12 с новыми моделями. Иначе при первой же
|
||||||
|
странности подозреваемых окажется десяток и разделить их будет нечем, CI тут не
|
||||||
|
поможет.
|
||||||
|
|
||||||
|
Проект домашний, CI нет, репрезентативные записи приватны и на разных ноутбуках
|
||||||
|
разные — автоматическая приёмка невозможна в принципе, уверенность держится на
|
||||||
|
ручных прогонах. Что она покрывает и чего не покрывает:
|
||||||
|
|
||||||
|
- существующие тесты замоканы ([`AGENTS.md`](../../AGENTS.md)) и подтверждают
|
||||||
|
CLI, конфиг и форматирование, но не работоспособность движка: поломку ORT или
|
||||||
|
onnx-asr видно только на реальной записи;
|
||||||
|
- ручные прогоны делаются на Windows и Linux, по всем трём путям — onnx,
|
||||||
|
openvino, cuda;
|
||||||
|
- **macOS не проверяется вовсе.** Колёса cp313 там опубликованы, но это
|
||||||
|
наличие, а не работоспособность; при жалобе с Mac исходить из того, что путь
|
||||||
|
не валидировался;
|
||||||
|
- **скорость на Intel Core i5 не измерялась.** Замеры делаются на Ryzen 7
|
||||||
|
8845H и записываются как наблюдение с указанием CPU — для решения о
|
||||||
|
CPU-дефолте этого недостаточно;
|
||||||
|
- **качество моделей друг относительно друга не измерялось.** Ручная проверка
|
||||||
|
отвечает на вопрос «работает ли», а не «лучше ли»; сравнение — отдельная
|
||||||
|
работа, см. [backlog](../backlog.md).
|
||||||
|
|
||||||
|
Пошаговый чеклист и практика прогона нужны только на время работ и живут в
|
||||||
|
задаче трекера
|
||||||
|
([#1](https://git.dementev.space/ddmitry/local-transcriber/issues/1)), а не в
|
||||||
|
этом документе.
|
||||||
|
|
||||||
|
## Документация
|
||||||
|
|
||||||
|
README: три модели в таблицу ONNX-моделей. Рекомендация остаётся прежней —
|
||||||
|
`gigaam-v3` для русского — пока нет данных, чтобы её менять; у новых моделей
|
||||||
|
стоит оговорка, что скорость на слабых CPU не измерялась. Требование Python
|
||||||
|
правится в [`docs/PRD.md`](../PRD.md) — раздел «Требования» и таблица
|
||||||
|
технологий; в README версии Python не упоминаются.
|
||||||
Reference in New Issue
Block a user