- Зачем:
- тикеты карты #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>
50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
"""Замер 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)
|