Files
local-transcriber/docs/backlog.md
T
Dmitriy DementievandClaude Fable 5 5a7fc0d613 docs(backlog): направления по структуре транскрипта из внешнего ревью
- Зачем:
  - внешнее сравнение с облачным Hypescribe показало: главный разрыв локальной транскрипции — не качество распознавания, а структура (спикеры 2/10 против 8/10); без диаризации MoM не собрать.
- Что:
  - новый раздел «Структура транскрипта»: диаризация как опциональный пост-процессинг (sherpa-onnx vs pyannote, нужен ADR), ручка нарезки абзацев в formatter, словарь замен терминов как запасной план после бенчмарка RNN-T.
  - зафиксировано вне ядра CLI: LLM-чистка и сопоставление имён спикеров.
- Проверка:
  - docs-only, тесты не затронуты.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 10:44:24 +03:00

14 KiB
Raw Blame History

Backlog — будущие эксперименты и направления

Список открытых направлений, которые имеют смысл, но не реализованы. Каждый пункт содержит обоснование и ссылку на источник (ADR / статья), чтобы при возврате не пришлось воспроизводить контекст с нуля.

Когда направление становится в работу — переносится в spec/план или соответствующий ADR. Когда отклоняется — остаётся в backlog с пометкой «отклонено» и причиной (для истории решений).


ASR-бэкенды и модели

GigaAM v3 RNN-T — потенциальная замена CTC-дефолта для --device onnx

Что: Прогнать gigaam-v3-rnnt (или v3_e2e_rnnt если доступен через onnx-asr) по той же методологии, что и в ADR-006: 3 файла × agent-judge × 4 критерия.

Почему интересно:

  • WER 2.6% vs 13.2% для CTC на сложных текстах — в 5 раз ниже на разговорной речи и доменной лексике (источник: SberDevices / Хабр-публикация GigaAM-v3).
  • Контекстный декодер — структурно решает основную проблему GigaAM-CTC из ADR-006: кириллизация латиницы и искажения имён компаний (ЗапромбанкГазпромбанк, яндекс тим под яндекс тимЯндекс ТимКод). RNN-T видит контекст уже сгенерированных токенов и может «дотянуть» имена.
  • v3_e2e_rnnt с пунктуацией и нормализацией — закрывает главное ограничение GigaAM-CTC, ради которого в README сейчас стоит fallback на openvino-cpu medium (с задокументированными в ADR-006 галлюцинациями на длинных файлах).
  • 70:30 vs Whisper-large-v3 — GigaAM-v3 (CTC и RNN-T) выигрывает у large-v3 по LLM-as-Judge (Gemini 2.5 Pro). Если переносится на наш use case — RNN-T на CPU становится сильнее GPU faster-whisper large-v3.
  • 30% лучше на «новых доменах» (callcenter-like речь, нестандартные характеристики) — это и есть домен установочных встреч.

Tradeoff:

  • Скорость ниже CTC (RNN-T декодинг последовательный). Реалистичная оценка: 10-15× RTF на CPU вместо 17-29× у CTC. Всё ещё в 1.5-2× быстрее Whisper medium.
  • Размер модели больше (~500 MB int8 против ~300 MB у CTC) — оценка, нужна верификация.

Если подтвердится бенчмарком:

  • Дефолт в --device onnx меняется с gigaam-v3-ctc на gigaam-v3-rnnt.
  • openvino-cpu medium уходит из рекомендаций для русского.
  • Формулировка «GPU faster-whisper large-v3 — эталон» в README может стать неточной.
  • Пишется ADR-007 с переоценкой дефолта.

Уточнить перед запуском: какой именно вариант RNN-T доступен в onnx-asr (gigaam-v3-rnnt без пунктуации vs v3_e2e_rnnt с пунктуацией). Проверить через huggingface_hub listing для istupakov/gigaam-v3-onnx.


Canary 1B — multilingual + пунктуация на CPU

Что: Протестировать nemo-canary-1b-v2 через onnx-asr на тех же 3 файлах.

Почему: Multilingual + пунктуация в одной модели. Кандидат на «лучшее качество за разумную скорость» для пользователей, которым нужны и не-русский контент, и пунктуация одновременно. Упомянут в ADR-006.

Tradeoff: Тяжелее GigaAM (~1 GB vs ~300 MB), скорость на CPU ожидаемо ниже. Если RNN-T закроет потребность в пунктуации — Canary становится менее приоритетным.


Качество и устойчивость

Whisper medium галлюцинации на длинных файлах с тихими фрагментами

Что: Воспроизвести и зафиксировать класс ошибок: 12-02-37 теряет 17 минут хвоста, Vasya имеет 5-минутные блоки повторов, появляются несуществующие имена (Валерий Сюткин). Источник: agent-judge в ADR-006.

Возможные направления:

  • Ограничить длину чанка для openvino-medium (chunk_length параметр в WhisperPipeline).
  • Внедрить compression_ratio_threshold / log_prob_threshold фильтры через переписывание pipeline (как у CTranslate2). Уже частично описано в docs/gpu.md «Качественный pipeline для OpenVINO».
  • Предупреждать пользователя при --device openvino-cpu для файлов >30 мин.

Приоритет: средний — пока есть gigaam-v3 как альтернатива для русского. Критично, если openvino остаётся единственным вариантом для пунктуации (отпадает после теста RNN-T).


Интеллектуальное чанкование длинных файлов по паузам

Что: Резать длинные файлы на чанки (~90 с) не по фиксированной сетке, а по ближайшей тишине: ffmpeg -af silencedetect=noise=-40dB:d=0.5 → парсинг stderr → выбор точки разреза в окне ±30 с вокруг целевой границы (с минимальным зазором между разрезами, чтобы не получить нулевые чанки).

Почему: Разрез посреди слова/фразы портит распознавание на границах чанков; разрез по паузе — нет. Потенциально смягчает класс ошибок Whisper medium на длинных файлах (потеря хвоста, блоки повторов — см. пункт выше): короткие чанки не дают декодеру «уплыть».

Источник: референсная реализация Parakeet-сервера (Flask, OpenAI-совместимый API), лежавшая в репо как app.py в период эксперимента ADR-005/006 (апрель 2026); удалена при чистке 2026-07-09 — рабочие константы: порог -40dB, мин. тишина 0.5 с, окно поиска 30 с, мин. зазор 5 с.

Tradeoff: дополнительный проход ffmpeg по всему файлу (silencedetect) перед транскрипцией; для часового файла — десятки секунд.


Качественный pipeline для OpenVINO (temperature fallback + фильтры)

Что: Реализовать temperature fallback, compression_ratio и log_prob фильтры поверх OpenVINO GenAI WhisperPipeline. Эвристики — логика на Python (~50-100 строк), не зависящая от inference engine.

Почему: Дать Intel Arc / AMD GPU и AMD CPU то же качество, что сейчас есть только у CUDA-пользователей через CTranslate2. Полностью описано в docs/gpu.md.


Структура транскрипта (конспекты и MoM)

Источник раздела: внешнее сравнение локального транскрипта (medium, openvino-cpu, запись 25:59) с облачным сервисом Hypescribe, критерий — пригодность как сырья для конспекта и протокола встречи (GPT-ревью, 2026-07-10). Итог: по смыслу локальная модель почти равна облаку (6.5/10 против 7/10), главный разрыв — не качество распознавания, а структура: разделение говорящих (2/10 против 8/10) и нарезка на реплики. Приоритеты ревьюера: 1) смысл, 2) спикеры, 3) техтермины, 4) разбивка на фразы, 5) таймкоды. Вывод: локальная диаризация + словарь терминов закрывают потребность в облачном сервисе для внутренних встреч.

Сознательно вне ядра CLI (максимум — рецепт в README): второй проход LLM для чистки текста, сопоставление Speaker N с именами — это работа поверх готового транскрипта.

Диаризация — разделение говорящих

Что: Опциональный пост-процессинг (не четвёртый бэкенд): сегменты уже несут таймкоды; диаризация даёт интервалы «кто когда говорил»; merge по перекрытию интервалов; formatter ломает абзац на смене спикера и подписывает Speaker 1:. Ставится как extra: uv sync --extra diarization.

Почему: Без спикеров MoM не собрать — это ключевой разрыв с облаком по внешнему ревью, и никакое качество распознавания его не компенсирует. Заодно естественно решает «разбивку на реплики» (приоритет №4).

Варианты реализации (ключевое решение, нужен ADR):

  • sherpa-onnx — диаризация целиком на onnxruntime (сегментация pyannote в ONNX + спикер-эмбеддинги), без torch, в духе нашего onnx-стека и «no cloud, no API keys».
  • pyannote.audio — стандарт качества, но тянет torch и требует HF-токен с принятием лицензии моделей — трение с духом проекта.

Уточнить перед запуском: качество обоих вариантов на русской речи и перекрывающихся репликах; скорость на CPU (диаризация — второй проход по всему аудио); лицензии моделей сегментации/эмбеддингов.


Ручка нарезки абзацев в formatter

Что: «Минутные простыни» в транскрипте — не свойство модели, а наши константы группировки _PAUSE_THRESHOLD_S = 2.0 / _MAX_PARAGRAPH_S = 60.0 в formatter.py (сырых сегментов много: 23-минутная запись — 360 сегментов, ~4 с на реплику). Вынести в опцию/конфиг или уменьшить дефолт.

Почему откладывается: при диаризации абзацы будут ломаться по смене спикера естественно — сначала решить с диаризацией, чтобы не делать ручку, которая устареет.


Словарь замен технических терминов — запасной план

Что: Пост-обработка текста сегментов словарём замен по границам слов (CSW → CSV, софтп → SFTP, ямлик → YAML, Spark и Scale → Spark SQL), словарь пользовательский в .transcriber.toml.

Почему запасной: это тот же класс ошибок, что «кириллизация латиницы и искажение имён» из ADR-006, и первым его должен попробовать закрыть контекстный декодер GigaAM v3 RNN-T (первый пункт бэклога). Заводить словарь — только если бенчмарк RNN-T термины не вытянет.


Авто-детект и UX

Включение onnx в --device auto

Что: После периода стабилизации --device onnx (несколько недель production-использования без жалоб) — рассмотреть включение в auto-detect chain.

Порядок в chain (предложение): CUDA → onnx (если CPU x86_64) → OpenVINO → CPU.

Почему откладывается: политика experimental backend — не сюрпризить существующих пользователей до накопления опыта. Источник: ADR-006.


Отклонённые направления

(пока пусто — добавлять сюда то, что попробовали и решили не делать, с причиной)