Калибровка диаризации: порог кластеризации и модель эмбеддингов на русской речи #10

Closed
opened 2026-08-12 15:05:32 +03:00 by ddmitry · 1 comment
Owner

Часть карты: Карта: диаризация спикеров в транскрипте (#8)

Question

При каких настройках sherpa-onnx даёт диаризацию, которой можно доверять на
нашем материале?

Из разведки известно: на пороге кластеризации 0,5 из примеров sherpa-onnx
получилось 29 говорящих вместо трёх, на 0,9 — верное число. Это одна запись, на
ней же порог и подбирался, поэтому значение принимать нельзя.

  • подобрать порог FastClusteringConfig.threshold на нескольких записях с
    известным составом участников, включая разговор на двоих;
  • проверить, помогает ли явное указание числа участников (num_clusters) и
    насколько результат от него отличается;
  • сравнить эмбеддинги: используемый wespeaker_en_voxceleb_resnet34_LM обучен
    на англоязычном VoxCeleb; проверить хотя бы одну многоязычную альтернативу
    (например, из семейства 3D-Speaker) на русской речи;
  • зафиксировать лицензии выбранных моделей.

Метод. Каждая конфигурация — это полный прогон сегментации и эмбеддингов,
около 2,5 минут на 26-минутную запись, и число прогонов растёт произведением
записей, порогов и моделей эмбеддингов. Свип вести на коротких фрагментах,
полные записи оставить для проверки финального кандидата, иначе тикет не влезет
в одну сессию.

Важно для соседних тикетов. Смена модели эмбеддингов меняет и время работы,
поэтому результат этого тикета может потребовать перепроверки замера на
целевом i5.

Вход от слуховой проверки

Проверка границ диаризации на слух показала, что на пороге 0,9 три основных голоса в целом устойчивы, но остаются ложный остаточный кластер, небольшие пропуски и неполная разметка перекрывающейся речи.

Поэтому совпадение числа кластеров с числом участников не может быть единственным критерием калибровки. Финального кандидата нужно прослушать на плотном диалоге, проверить устойчивость «голос → кластер», пропуски, остаточные кластеры и перекрытия; короткий почти пустой кластер нельзя автоматически считать отдельным участником.

Ответ — рекомендуемая пара «порог + модель эмбеддингов» с данными, на которых
она выбрана, и понимание, насколько результат устойчив между записями.

Методика разведки описана в
docs/benchmarks/2026-08-12-diarization-feasibility.md.

Часть карты: [Карта: диаризация спикеров в транскрипте](https://git.dementev.space/ddmitry/local-transcriber/issues/8) (#8) ## Question При каких настройках `sherpa-onnx` даёт диаризацию, которой можно доверять на нашем материале? Из разведки известно: на пороге кластеризации 0,5 из примеров `sherpa-onnx` получилось 29 говорящих вместо трёх, на 0,9 — верное число. Это одна запись, на ней же порог и подбирался, поэтому значение принимать нельзя. - подобрать порог `FastClusteringConfig.threshold` на нескольких записях с известным составом участников, включая разговор на двоих; - проверить, помогает ли явное указание числа участников (`num_clusters`) и насколько результат от него отличается; - сравнить эмбеддинги: используемый `wespeaker_en_voxceleb_resnet34_LM` обучен на англоязычном VoxCeleb; проверить хотя бы одну многоязычную альтернативу (например, из семейства 3D-Speaker) на русской речи; - зафиксировать лицензии выбранных моделей. **Метод.** Каждая конфигурация — это полный прогон сегментации и эмбеддингов, около 2,5 минут на 26-минутную запись, и число прогонов растёт произведением записей, порогов и моделей эмбеддингов. Свип вести на коротких фрагментах, полные записи оставить для проверки финального кандидата, иначе тикет не влезет в одну сессию. **Важно для соседних тикетов.** Смена модели эмбеддингов меняет и время работы, поэтому результат этого тикета может потребовать перепроверки замера на целевом i5. ## Вход от слуховой проверки [Проверка границ диаризации на слух](https://git.dementev.space/ddmitry/local-transcriber/issues/12) показала, что на пороге 0,9 три основных голоса в целом устойчивы, но остаются ложный остаточный кластер, небольшие пропуски и неполная разметка перекрывающейся речи. Поэтому совпадение числа кластеров с числом участников не может быть единственным критерием калибровки. Финального кандидата нужно прослушать на плотном диалоге, проверить устойчивость «голос → кластер», пропуски, остаточные кластеры и перекрытия; короткий почти пустой кластер нельзя автоматически считать отдельным участником. Ответ — рекомендуемая пара «порог + модель эмбеддингов» с данными, на которых она выбрана, и понимание, насколько результат устойчив между записями. Методика разведки описана в `docs/benchmarks/2026-08-12-diarization-feasibility.md`.
ddmitry added the wayfinder:task label 2026-08-12 15:05:32 +03:00
ddmitry self-assigned this 2026-08-14 09:47:25 +03:00
Author
Owner

Решение: для автоматического определения числа спикеров рекомендую wespeaker_en_voxceleb_resnet34_LM.onnx + FastClusteringConfig.threshold=0.89, num_clusters=-1.

Почему:

  • свип на трёх русскоязычных созвонах с известным составом (3 / 2 / 2 участника) дал для WeSpeaker точные 3 / 2 / 2 кластера только на 0,89; на 0,90 контрольная запись уже склеивается до двух, на 0,88 Yantar остаётся разбит на три;
  • полные прогоны кандидата: контроль — 4 кластера, из них 3 содержательных и ложный остаток 19,1 с (1,3% речи); T2 BDMA — 2; Yantar — 2;
  • на двух полных записях с независимыми таймкодами Hypescribe mapped speaker purity составила 0,749 и 0,906. Это сравнительный прокси, не DER: опорные границы грубые;
  • полный контрольный прогон на 0,90 повторён: массивы всех 340 интервалов на 0,89 и 0,90 идентичны, включая границы и номера кластеров. Поэтому к кандидату напрямую относится слуховая проверка из #12: основные голоса стабильны, ложный остаточный кластер, небольшие пропуски и неполные перекрытия сохраняются.

num_clusters помогает: когда число участников известно, его стоит передавать явно как страховку. Для WeSpeaker на двух записях с опорными метками это не ухудшило purity.

Сравнение моделей:

  • официальная двуязычная 3D-Speaker CAMPPlus zh/en проверена на тех же фрагментах. Она быстрее на этой машине (средний RTF 0,083 против 0,118) и при известном числе участников дала purity 0,801 / 0,911;
  • однако общего автоматического порога для неё нет: 1,05 даёт 3 / 3 / 3 кластера, а 1,10 — 2 / 2 / 3, то есть либо остаются малые остатки, либо склеиваются реальные голоса;
  • китайская 3D-Speaker ERes2Net base также переразбивает записи и не заменяет дефолт.

Лицензии: выбранная WeSpeaker/VoxCeleb модель — CC BY 4.0; 3D-Speaker и CAMPPlus — Apache 2.0. ONNX-артефакты брались из официального релиза k2-fsa/sherpa-onnx.

Воспроизводимый отчёт: docs/benchmarks/2026-08-14-diarization-calibration.md. Скрипт свипа: scripts/benchmarks/diarization_calibration.py. Сырые JSON не добавлены: они содержат локальные пути к рабочим записям; в отчёте есть SHA-256 медиа и моделей.

Проверки: uvx ruff check и ruff format --check — чисто; uv run pytest — 243 passed, 1 skipped.

Замер сделан на Ryzen 7 8845H и не заменяет приёмку производительности на целевом Intel Core i5 11-го поколения.

Решение: для автоматического определения числа спикеров рекомендую `wespeaker_en_voxceleb_resnet34_LM.onnx` + `FastClusteringConfig.threshold=0.89`, `num_clusters=-1`. Почему: - свип на трёх русскоязычных созвонах с известным составом (3 / 2 / 2 участника) дал для WeSpeaker точные 3 / 2 / 2 кластера только на 0,89; на 0,90 контрольная запись уже склеивается до двух, на 0,88 Yantar остаётся разбит на три; - полные прогоны кандидата: контроль — 4 кластера, из них 3 содержательных и ложный остаток 19,1 с (1,3% речи); T2 BDMA — 2; Yantar — 2; - на двух полных записях с независимыми таймкодами Hypescribe mapped speaker purity составила 0,749 и 0,906. Это сравнительный прокси, не DER: опорные границы грубые; - полный контрольный прогон на 0,90 повторён: массивы всех 340 интервалов на 0,89 и 0,90 идентичны, включая границы и номера кластеров. Поэтому к кандидату напрямую относится слуховая проверка из #12: основные голоса стабильны, ложный остаточный кластер, небольшие пропуски и неполные перекрытия сохраняются. `num_clusters` помогает: когда число участников известно, его стоит передавать явно как страховку. Для WeSpeaker на двух записях с опорными метками это не ухудшило purity. Сравнение моделей: - официальная двуязычная 3D-Speaker CAMPPlus zh/en проверена на тех же фрагментах. Она быстрее на этой машине (средний RTF 0,083 против 0,118) и при известном числе участников дала purity 0,801 / 0,911; - однако общего автоматического порога для неё нет: 1,05 даёт 3 / 3 / 3 кластера, а 1,10 — 2 / 2 / 3, то есть либо остаются малые остатки, либо склеиваются реальные голоса; - китайская 3D-Speaker ERes2Net base также переразбивает записи и не заменяет дефолт. Лицензии: выбранная WeSpeaker/VoxCeleb модель — CC BY 4.0; 3D-Speaker и CAMPPlus — Apache 2.0. ONNX-артефакты брались из официального релиза `k2-fsa/sherpa-onnx`. Воспроизводимый отчёт: `docs/benchmarks/2026-08-14-diarization-calibration.md`. Скрипт свипа: `scripts/benchmarks/diarization_calibration.py`. Сырые JSON не добавлены: они содержат локальные пути к рабочим записям; в отчёте есть SHA-256 медиа и моделей. Проверки: `uvx ruff check` и `ruff format --check` — чисто; `uv run pytest` — 243 passed, 1 skipped. Замер сделан на Ryzen 7 8845H и не заменяет приёмку производительности на целевом Intel Core i5 11-го поколения.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: ddmitry/local-transcriber#10