docs(diarization): зафиксированы ADR и спецификация
- Зачем: - решения карты должны стать устойчивой основой для реализации диаризации. - Что: - добавлены ADR-007 и спецификация пословной диаризации. - дополнен доменный словарь и удалены закрытые направления из backlog. - Проверка: - git diff --cached --check.
This commit is contained in:
@@ -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 с на реплику). Вынести в опцию/конфиг или уменьшить
|
||||
дефолт.
|
||||
|
||||
**Почему откладывается:** при диаризации абзацы будут ломаться по смене
|
||||
спикера естественно — сначала решить с диаризацией, чтобы не делать
|
||||
ручку, которая устареет.
|
||||
|
||||
---
|
||||
|
||||
### Словарь замен технических терминов — запасной план
|
||||
|
||||
**Что:** Пост-обработка текста сегментов словарём замен по границам слов
|
||||
|
||||
Reference in New Issue
Block a user