Files
local-transcriber/docs/benchmarks/2026-08-14-asr-segment-speaker-mixing.md
Dmitriy Dementiev b8092aade5 docs(diarization): подтверждено смешение в ASR-сегментах
- Зачем:
  - требовалось проверить долю смешанных ASR-сегментов на трёх записях, включая разговоры на двоих.
- Что:
  - добавлен отчёт с долями сегментов и времени для трёх рабочих созвонов.
  - обвязка замеров переведена на откалиброванный порог 0,89.
  - исследовательский скрипт приведён к формату ruff.
- Проверка:
  - выполнены три полных прогона bench_conflict.py с WeSpeaker и порогом 0,89.
  - uv run ruff check и ruff format --check прошли успешно.
2026-08-14 11:44:02 +03:00

103 lines
7.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Смешение говорящих внутри ASR-сегментов
**Дата:** 2026-08-14
**Статус:** проверка на трёх русскоязычных рабочих созвонах. Не оценка DER и
не решение о единице привязки спикера к тексту.
## Вопрос
Воспроизводится ли смешение говорящих внутри ASR-сегментов на других записях,
или результат разведки — особенность одной встречи на троих?
В [разведочном замере](2026-08-12-diarization-feasibility.md) 27% сегментов
контрольной записи содержали не меньше секунды чужой речи. На них приходилось
больше половины времени ASR-сегментов. Проверка повторена на тех же трёх
записях, на которых калибровалась диаризация, включая два разговора на двоих.
## Метод
ASR выполнялся через модель по умолчанию ONNX-пути
`gigaam-v3-e2e-rnnt` INT8 с языком `ru`. Диаризация выполнялась через
`sherpa-onnx` 1.13.5 с выбранной в
[калибровке](2026-08-14-diarization-calibration.md) конфигурацией:
- сегментация `sherpa-onnx-pyannote-segmentation-3-0`;
- эмбеддинги `wespeaker_en_voxceleb_resnet34_LM.onnx`;
- `FastClusteringConfig.threshold=0.89`;
- автоматическое определение числа кластеров (`num_clusters=-1`).
Для каждого ASR-сегмента считалось перекрытие с интервалами каждого кластера.
Кластер с максимальным перекрытием считался мажоритарным, а сумма перекрытий
остальных кластеров — чужой речью. Сегменты разделены на четыре категории:
- **чистый** — перекрытие только с одним кластером;
- **с поддакиванием** — меньше 1 секунды чужой речи;
- **с чужой репликой** — не меньше 1 секунды чужой речи;
- **без спикера** — нет перекрытия с интервалами диаризации.
Время категории — сумма длительностей попавших в неё ASR-сегментов. Это не
сумма времени речи: интервалы разных кластеров могут перекрываться при
наложенной речи. Метрика отвечает на узкий вопрос, насколько огрубляет текст
одна метка спикера на весь ASR-сегмент. Она не измеряет точность диаризации.
## Результаты
| Запись | Участников | ASR-сегментов | Чистые | Поддакивание <1 с | Чужая реплика ≥1 с | Без спикера |
|---|---:|---:|---:|---:|---:|---:|
| Data Test | 3 | 274 | 164 (59,9%) | 30 (10,9%) | **74 (27,0%)** | 6 (2,2%) |
| T2 BDMA | 2 | 223 | 167 (74,9%) | 34 (15,2%) | **14 (6,3%)** | 8 (3,6%) |
| Yantar | 2 | 339 | 275 (81,1%) | 20 (5,9%) | **24 (7,1%)** | 20 (5,9%) |
| Запись | Время всех ASR-сегментов | Время сегментов с чужой репликой ≥1 с | Доля времени |
|---|---:|---:|---:|
| Data Test | 21,89 мин | **11,20 мин** | **51,2%** |
| T2 BDMA | 12,56 мин | **1,53 мин** | **12,2%** |
| Yantar | 15,93 мин | **2,67 мин** | **16,8%** |
На двух разговорах на двоих вместе чужая реплика не меньше секунды встречается
в 38 из 562 сегментов (6,8%) и затрагивает 4,20 из 28,49 минуты (14,7%). По
сравнению со встречей на троих это в четыре раза меньше по доле сегментов и
примерно в 3,5 раза меньше по доле времени.
## Вывод
Смешение говорящих внутри ASR-сегмента — общее свойство проверенного материала,
а не аномалия одной записи: оно воспроизвелось на обоих разговорах на двоих.
Однако тяжесть сильно зависит от характера разговора. Значение 27% сегментов и
51% времени не переносится на двухсторонние созвоны: там получено 6–7%
сегментов и 12–17% времени.
Мажоритарная метка на весь ASR-сегмент поэтому остаётся заметным огрублением
даже на разговорах на двоих, а на плотной встрече втроём теряет реплики в
массовом масштабе. Эти данные не выбирают единицу привязки сами по себе, но
исключают предположение, что сегментная привязка безопасна для всех обычных
созвонов без пословной привязки или явной пометки качества.
## Ограничения
- Все три записи — русскоязычные рабочие созвоны одного пользователя; другие
микрофоны, шумы и стили разговора не представлены.
- Диаризация служит опорной разметкой и сама содержит ошибки. На контрольной
записи есть ложный остаточный кластер, редкие пропуски и неполная разметка
перекрывающейся речи.
- На двухсторонних записях один голос заметно доминирует по времени. Баланс
реплик может влиять на долю смешанных сегментов.
- Порог 1 секунда разделяет короткие вставки и потенциально потерянные реплики,
но не доказывает смысловую важность каждого фрагмента.
## Воспроизводимость
Расчёт выполняется скриптом
[`bench_conflict.py`](../../.scratch/diarization/bench_conflict.py):
```powershell
$env:PYTHONIOENCODING = "utf-8"
uv run --with sherpa-onnx python .scratch/diarization/bench_conflict.py `
"<путь к записи>" 0.89 8
```
Медиа и сырые JSON не добавлены в репозиторий: они содержат локальные пути и
относятся к рабочим созвонам. SHA-256 всех трёх исходных файлов зафиксированы в
[отчёте о калибровке](2026-08-14-diarization-calibration.md).