docs(diarization): зафиксированы ADR и спецификация

- Зачем:
  - решения карты должны стать устойчивой основой для реализации диаризации.
- Что:
  - добавлены ADR-007 и спецификация пословной диаризации.
  - дополнен доменный словарь и удалены закрытые направления из backlog.
- Проверка:
  - git diff --cached --check.
This commit is contained in:
Dmitriy Dementiev
2026-08-14 15:55:25 +03:00
parent b260dab047
commit b8333ba583
4 changed files with 302 additions and 69 deletions
-69
View File
@@ -179,75 +179,6 @@ openvino-cpu, запись 25:59) с облачным сервисом Hypescrib
LLM для чистки текста, сопоставление Speaker N с именами — это работа
поверх готового транскрипта.
### Диаризация — разделение говорящих
**Что:** Опциональный пост-процессинг (не четвёртый бэкенд): диаризация
даёт интервалы «кто когда говорил», результат сводится с сегментами ASR,
formatter ломает абзац на смене спикера и подписывает `Speaker 1:`.
Ставится как extra: `uv sync --extra diarization`.
**Почему:** Без спикеров MoM не собрать — это ключевой разрыв с облаком
по внешнему ревью, и никакое качество распознавания его не компенсирует.
Заодно естественно решает «разбивку на реплики» (приоритет №4).
**Промежуточный статус 2026-08-12:** проведена разведка, описанная в
[разведочном замере диаризации](benchmarks/2026-08-12-diarization-feasibility.md).
Она закрыла вопрос о движке и открыла более важный вопрос о единице привязки.
**Движок — вопрос практически закрыт.** `sherpa-onnx` ставится на Windows с
Python 3.13, содержит готовый `OfflineSpeakerDiarization`, не тянет torch и не
требует токена Hugging Face; модели сегментации и эмбеддингов весят около 33 МБ.
Скорость — 11,1× RTFx, то есть примерно полторы длительности ASR. Вариант
`pyannote.audio` остаётся отклонённым по прежней причине: torch и HF-токен с
принятием лицензии. Отдельный ADR имеет смысл заводить вместе с решением о
единице привязки, а не только про движок.
Замечание для будущих заходов: обе ML-части диаризации уже лежат в
`onnx-asr` 0.12 — `PyAnnoteVad` содержит полную локальную сегментацию pyannote
(powerset на трёх спикеров, склейка окон), а `WespeakerEmbeddings` даёт
эмбеддинги. Публичный API схлопывает сегментацию до речь/не-речь, `load_se` не
экспортирован, кластеризации нет. Собирать диаризацию самим на этих деталях —
экономия 33 МБ ценой опоры на приватный API; при разведке этот путь не
выбирался.
**Единица привязки — настоящая развилка, решения нет.** Схема «мажоритарный
спикер на весь ASR-сегмент», записанная здесь раньше, замером не подтвердилась:
27% сегментов содержат не менее секунды чужой речи, и на них приходится больше
половины времени транскрипта. Причина — границы сегментов идут по тишине
(Silero VAD), а в ВКС собеседники отвечают встык. Варианты:
- **пословная привязка** — `onnx-asr` отдаёт потокенные таймкоды
(`TimestampedResult`), сегмент режется на границе токена при смене
говорящего; ASR по-прежнему видит длинное аудио, контекст RNN-T и пунктуация
не страдают. Недоступно на OpenVINO GenAI — там потокенных таймкодов нет;
- **диаризация первым проходом**, ASR по интервалам говорящего — чистота
гарантирована, но короткие куски лишают RNN-T контекста и портят пунктуацию;
- **привязка к сегменту с честной пометкой** — оставить огрубление, но считать
чистоту и предупреждать в шапке, как уже делается для повторов и потери
хвоста.
**Уточнить перед запуском:** воспроизводится ли доля 27% на других записях,
включая разговор на двоих; правильность границ диаризации на слух, а не только
совпадение числа говорящих; калибровка порога кластеризации (на пороге из
примеров получилось 29 спикеров вместо трёх); эмбеддинги, обученные не только
на английском; производительность на целевом Intel Core i5.
---
### Ручка нарезки абзацев в formatter
**Что:** «Минутные простыни» в транскрипте — не свойство модели, а наши
константы группировки `_PAUSE_THRESHOLD_S = 2.0` / `_MAX_PARAGRAPH_S =
60.0` в `formatter.py` (сырых сегментов много: 23-минутная запись — 360
сегментов, ~4 с на реплику). Вынести в опцию/конфиг или уменьшить
дефолт.
**Почему откладывается:** при диаризации абзацы будут ломаться по смене
спикера естественно — сначала решить с диаризацией, чтобы не делать
ручку, которая устареет.
---
### Словарь замен технических терминов — запасной план
**Что:** Пост-обработка текста сегментов словарём замен по границам слов