chore(diarization): добавлена обвязка замеров в .scratch

- Зачем:
  - тикеты карты #10-#13 опираются на измерительную обвязку, которая до сих пор
    жила во временном каталоге сессии и исчезла бы вместе с ним.
- Что:
  - перенесены четыре скрипта разведки: ASR, один прогон диаризации, свип порога
    кластеризации и подсчёт чистоты ASR-сегментов.
  - общая часть вынесена в common.py: пути от корня репозитория вместо
    захардкоженных, конфигурация диаризатора, проверка наличия моделей.
  - починен замер пиковой памяти: нужен экспорт K32GetProcessMemoryInfo из
    kernel32 и явные argtypes, иначе дескриптор процесса уезжает 32-битным.
  - модели и выход замеров исключены из истории локальным .gitignore.
- Проверка:
  - export PYTHONIOENCODING=utf-8
  - uv run --with sherpa-onnx python .scratch/diarization/bench_diar.py "<запись>" 8 0.9

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dmitriy Dementiev
2026-08-12 15:35:20 +03:00
co-authored by Claude Opus 5
parent 87030e9718
commit 1cb6a36c92
7 changed files with 550 additions and 0 deletions
+49
View File
@@ -0,0 +1,49 @@
"""Замер ASR тем же путём, что использует CLI — для соотношения с диаризацией.
uv run python .scratch/diarization/bench_asr.py <файл> [модель]
sherpa-onnx здесь не нужен: скрипт зовёт бэкенд проекта напрямую.
"""
from __future__ import annotations
import sys
import time
from pathlib import Path
from common import peak_rss_mb, use_project_sources
use_project_sources()
from local_transcriber.backends.onnx_asr import OnnxAsrBackend # noqa: E402
DEFAULT_MODEL = "gigaam-v3-e2e-rnnt"
COMPUTE_TYPE = "int8"
def main(audio_path: str, model_name: str) -> None:
backend = OnnxAsrBackend(compute_type_explicit=False)
t0 = time.perf_counter()
model_path = backend.ensure_model_available(model_name, COMPUTE_TYPE)
model = backend.create_model(model_path, "onnx", COMPUTE_TYPE)
t_load = time.perf_counter() - t0
t0 = time.perf_counter()
result = backend.transcribe(model, Path(audio_path), "ru")
t_asr = time.perf_counter() - t0
rss = peak_rss_mb()
print(f"файл: {audio_path}")
print(f"модель: {model_name} ({COMPUTE_TYPE})")
print(f"длительность: {result.duration / 60:.1f} мин")
print(f"загрузка модели: {t_load:.1f} с")
print(f"ASR: {t_asr:.1f} с -> {result.duration / t_asr:.1f}x RTF")
print(f"пиковая память процесса: {rss:.0f} МБ" if rss else "память: снять не удалось")
print(f"сегментов: {len(result.segments)}")
if __name__ == "__main__":
if len(sys.argv) < 2:
raise SystemExit(__doc__)
main(sys.argv[1], sys.argv[2] if len(sys.argv) > 2 else DEFAULT_MODEL)