test(diarization): добавлен стенд сравнения CPU-моделей

- Зачем:
  - требовалось сравнить облегченные модели диаризации на старом CPU без изменения рабочей конфигурации.
- Что:
  - добавлен воспроизводимый и возобновляемый прогон матрицы Pyannote FP32/INT8 с WeSpeaker и TitaNet.
  - зафиксированы измерения 108 ячеек, ограничения эксперимента и решение сохранить модель по умолчанию.
  - локальные записи в каталоге tmp исключены из индекса Git.
- Проверка:
  - .venv/bin/python -m pytest.
  - /tmp/local-transcriber-ruff-bin/ruff check scripts/benchmarks/diarization_calibration.py tests/test_diarization_calibration.py.
This commit is contained in:
Dmitry Dementiev committed 2026-08-30 12:02:34 +03:00
1 parent 95f295c37c
commit 1e14f2687a
8 files changed
+2704 -234

No files matched your search

+37 -12
View File
@@ -2,6 +2,23 @@
**Статус**: Принято
**Дата**: 2026-08-14
**Обновлено**: 2026-08-30
## Решение
Диаризацию реализуем как явно включаемый пост-процессинг через `sherpa-onnx`.
Говорящий назначается слову с временной привязкой, а не целому сегменту
распознавания. Модель по умолчанию остаётся прежней: Pyannote Segmentation 3.0 FP32,
WeSpeaker ResNet34 LM, порог кластеризации `0,89` и автоматическое число
кластеров. Известное число говорящих можно передать явно.
Повторный CPU-тест FP32/INT8 × WeSpeaker/TitaNet не меняет это решение.
INT8 с WeSpeaker дал только около 2% среднего ускорения без существенного
выигрыша памяти и с худшими прокси-метриками. TitaNet оказался примерно на
четверть быстрее, но потребовал ещё 147–149 МиБ RSS и не прошёл условие приёмки
для общего автоматического порога. TitaNet можно исследовать только для режима
с явно известным числом говорящих. Такой эксперимент должен завершиться
слуховой проверкой. Код и модели по умолчанию на него не переключаем.
## Контекст
@@ -21,12 +38,20 @@
## Эксперимент
Локальная связка `sherpa-onnx` с сегментацией Pyannote 3.0 и эмбеддингами
WeSpeaker ResNet34 LM проверена на трёх записях с известным составом. Для
автоматического определения числа голосовых кластеров выбран порог 0,89: это
единственное проверенное значение, которое на трёх контрольных фрагментах дало
3 / 2 / 2 кластера. На полной встрече втроём остался ложный кластер длительностью
19,1 секунды; поэтому малые кластеры нельзя молча отбрасывать, а разметку нельзя
считать эталоном точных границ и перекрывающейся речи.
WeSpeaker ResNet34 LM проверена на трёх записях с известным составом. В исходной
калибровке для автоматического определения числа голосовых кластеров выбран
порог 0,89: среди проверенных тогда значений только он дал на трёх контрольных
фрагментах `3 / 2 / 2` кластера. На полной встрече втроём остался ложный кластер
длительностью 19,1 секунды; поэтому малые кластеры нельзя молча отбрасывать, а
разметку нельзя считать эталоном точных границ и перекрывающейся речи.
В повторном CPU-переборе на тех же пятиминутных фрагментах FP32 + WeSpeaker
прошёл условие приёмки `3 / 2 / 2` на плато `0,85–0,89`, а INT8 + WeSpeaker —
на `0,85–0,90`.
Это не отменяет порог 0,89: новый прогон не имел повторов и новой слуховой
проверки. Обе связки TitaNet провалили условие приёмки во всех проверенных
точках; число содержательных кластеров не использовалось как оправдание лишних
голосовых кластеров.
Двуязычная CAMPPlus zh/en оказалась примерно на 30% быстрее и при известном
числе участников улучшила прокси-метрику на двух записях, но для неё не нашлось
@@ -44,6 +69,8 @@ WeSpeaker ResNet34 LM проверена на трёх записях с изв
[калибровке](../benchmarks/2026-08-14-diarization-calibration.md),
[смешении говорящих](../benchmarks/2026-08-14-asr-segment-speaker-mixing.md) и
[производительности на Intel](../benchmarks/2026-08-14-diarization-intel-i7.md).
Сравнение облегчённых моделей и границы его применимости описаны в
[отдельном отчёте](../benchmarks/2026-08-30-lightweight-diarization-cpu.md).
### Сглаживание неизвестного говорящего
@@ -78,12 +105,7 @@ speaker Markdown хранит только начало реплики. Тем
невозможна, потому что в нём уже потеряны доли секунды, конец слова и причина
неопределённости.
## Решение
Диаризацию реализуем как явно включаемый пост-процессинг через `sherpa-onnx`.
Первая версия использует Pyannote segmentation 3.0, WeSpeaker ResNet34 LM,
порог кластеризации 0,89 и автоматическое число кластеров; известное число
участников можно передать явно.
## Сведение слов и разметки говорящих
Говорящий назначается [слову с временной
привязкой](../../CONTEXT.md#language), а не сегменту распознавания. Каждый
@@ -119,6 +141,9 @@ ASR-бэкенд приводит свой результат к общему н
- Последовательный режим задаёт корректный baseline. Параллельный запуск и
автоматическое включение на мощных устройствах требуют отдельных измерений
после стабилизации.
- Pyannote INT8 и TitaNet не становятся конфигурациями по умолчанию только на
основании CPU-теста. Для TitaNet следующий допустимый эксперимент —
режим с явно известным числом говорящих, повторами и слуховой проверкой.
## Отклонённые альтернативы