- Зачем: - требовалось оценить стоимость опциональной диаризации на доступном слабом Intel baseline. - Что: - зафиксированы ASR, RTFx и peak RSS на трёх контрольных записях. - замер peak RSS адаптирован для Linux и macOS. - недоступный Core i5 явно заменён Core i7-6820HQ с сохранением ограничения применимости. - Проверка: - uv run ruff check .scratch/diarization/common.py. - uv run pytest -q: 243 passed, 1 skipped.
4.2 KiB
4.2 KiB
Обвязка замеров диаризации
Исследовательские скрипты для карты
Карта: диаризация спикеров в транскрипте (#8).
Не часть пакета: они опираются на sherpa-onnx, которого нет в зависимостях
проекта, и живут в .scratch/, а не в src/.
Результаты первого прогона описаны в разведочном замере.
Модели
Скачиваются один раз в models/, в git не попадают (см. .gitignore рядом).
mkdir -p models && cd models
curl -sSL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/speaker-segmentation-models/sherpa-onnx-pyannote-segmentation-3-0.tar.bz2
tar xjf sherpa-onnx-pyannote-segmentation-3-0.tar.bz2
curl -sSL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/speaker-recongition-models/wespeaker_en_voxceleb_resnet34_LM.onnx
Сегментация — 6,9 МБ, эмбеддинги — 26,5 МБ. Опечатка recongition в URL
относится к самому релизу sherpa-onnx, это не ошибка набора.
Скрипты
| Скрипт | Что делает | Тикеты |
|---|---|---|
bench_asr.py |
ASR тем же путём, что CLI: время, RTF, память | #13 |
bench_diar.py |
один прогон диаризации, сохраняет разметку в segments-<порог>.tsv |
#12, #13 |
bench_sweep.py |
свип порога кластеризации и явного числа говорящих | #10 |
bench_conflict.py |
доля ASR-сегментов, внутри которых меняется говорящий | #11 |
common.py |
пути, конфигурация диаризатора, замер памяти | — |
Запуск
Из корня репозитория. PYTHONIOENCODING=utf-8 нужен, иначе вывод падает на
консоли cp1251.
export PYTHONIOENCODING=utf-8
uv run python .scratch/diarization/bench_asr.py "<путь к записи>"
uv run --with sherpa-onnx python .scratch/diarization/bench_diar.py "<путь>" 8 0.89
uv run --with sherpa-onnx python .scratch/diarization/bench_sweep.py "<путь>"
uv run --with sherpa-onnx python .scratch/diarization/bench_conflict.py "<путь>"
Что стоит знать до запуска
- Порог кластеризации откалиброван. По умолчанию стоит 0,89 — единственное проверенное значение, которое без знания числа участников дало правильные 3 / 2 / 2 кластера на трёх калибровочных фрагментах. Решение и ограничения описаны в отчёте о калибровке.
- Свип дорогой. Каждая конфигурация — полный прогон сегментации и эмбеддингов, около 2,5 минут на 26-минутную запись, и время от настроек кластеризации практически не зависит. Свип вести на коротком фрагменте.
- Чистота сегментов меряется относительно диаризации. Если её границы систематически смещены, метрика измеряет не то, что кажется. Проверка границ на слух — тикет #12, и он намеренно идёт до калибровки.
- Замер памяти чинился. В разведке
psapi.GetProcessMemoryInfoмолча возвращал ноль;common.peak_rss_mb()теперь зовётK32GetProcessMemoryInfoиз kernel32 и проверяет код возврата. На Linux и macOS используетсяresource.getrusage()с поправкой на разные единицы измерения.