feat(diarization): добавлено разделение транскрипта по говорящим

Зачем:
- локальным транскриптам нужна структура реплик для конспектов и протоколов.

Что:
- добавлены пословные таймкоды для всех ASR-бэкендов и сведение с Sherpa-ONNX.
- реализованы CLI-флаги, деградация без потери ASR и speaker Markdown.
- добавлены проверяемый кеш моделей, тесты и документация.

Проверка:
- `pytest` — 283 passed, 1 skipped.
- `pyright` — 0 errors.
- Ruff и `git diff --check` — без ошибок.
- выполнены три контрольных прогона на реальных записях.
This commit is contained in:
Dmitriy Dementiev
2026-08-14 18:55:42 +03:00
parent 63ba41d906
commit 726718197f
23 changed files with 2522 additions and 187 deletions
@@ -0,0 +1,48 @@
# Приёмка speaker diarization в CLI
**Дата:** 2026-08-14
**Статус:** ручная приёмка реализации задачи #24 на трёх контрольных записях.
## Профиль запуска
- ASR: `onnx`, `gigaam-v3-e2e-rnnt`, русский язык;
- диаризация: Pyannote segmentation 3.0 и WeSpeaker ResNet34 LM;
- автоматическое число говорящих, порог кластеризации `0,89`;
- 8 потоков CPU, модели в локальном кеше;
- обычный ASR и запуск с `--diarize` выполнялись последовательно.
## Результаты
| Запись | Длительность | Обычный ASR | С диаризацией | Кластеры | Неназначенные слова |
|---|---:|---:|---:|---:|---:|
| Data Test | 26:00 | 137,5 с | 326,2 с | 4 (один малый, 19,1 с) | 201 |
| T2 BDMA | 14:51 | 83,0 с | 184,2 с | 2 | 65 |
| Yantar | 20:22 | 100,1 с | 259,7 с | 2 | 43 |
Все три запуска завершились быстрее реального времени. Четвёртый прогон T2
BDMA после исправления склейки пунктуации повторно подтвердил два кластера и
65 неназначенных слов.
## Инварианты
- после удаления только форматных пробелов перед Unicode-пунктуацией и
символами текст speaker-вывода на всех трёх записях в точности совпал с
обычным ASR: 21 788, 10 520 и 12 055 символов соответственно;
- повторный T2-прогон последней версии также дал точное совпадение 10 520 из
10 520 символов;
- слова не потерялись и не поменяли порядок; неизвестный говорящий остаётся в
выводе как `Speaker ?`;
- CLI показал число кластеров, неназначенные слова и малый остаточный кластер,
не скрывая диагностические данные.
## Память и стоимость
Во время финального T2-прогона рабочий процесс наблюдался на уровне 905 МБ RSS.
Это согласуется с отдельным замером последовательных проходов: 900–1035 МБ для
ASR и 366–469 МБ для диаризации. Подробные условия и ограничения приведены в
[отчёте Intel i7](2026-08-14-diarization-intel-i7.md).
Диаризация остаётся опциональной: на контрольных записях полное время выросло
примерно в 2,2–2,6 раза. При этом сбой диаризации не удаляет готовый ASR-текст и
не останавливает обработку остальных файлов batch-запуска.