- Зачем: - onnx-asr модель должна создаваться с квантизацией и VAD для разбивки аудио на сегменты. - Что: - метод create_model вызывает onnx_asr.load_model с квантизацией и cpu_preprocessing=True. - подгружается Silero VAD, прикрепляется к модели через with_vad. - написаны 3 теста: проверка аргументов load_model, загрузка VAD, передача fp16. - Проверка: - uv run pytest tests/test_onnx_asr.py -v
118 lines
3.9 KiB
Python
118 lines
3.9 KiB
Python
"""Tests for onnx-asr backend."""
|
|
|
|
import pytest
|
|
from local_transcriber.backends.onnx_asr import OnnxAsrBackend, MODEL_ALIASES
|
|
|
|
|
|
class TestEnsureModelAvailable:
|
|
def test_returns_model_id_for_gigaam(self):
|
|
backend = OnnxAsrBackend()
|
|
result = backend.ensure_model_available("gigaam-v3", "int8")
|
|
assert result == "gigaam-v3-ctc"
|
|
|
|
def test_returns_model_id_for_parakeet(self):
|
|
backend = OnnxAsrBackend()
|
|
result = backend.ensure_model_available("parakeet-v3", "fp16")
|
|
assert result == "nemo-parakeet-tdt-0.6b-v3"
|
|
|
|
def test_stores_compute_type(self):
|
|
backend = OnnxAsrBackend()
|
|
backend.ensure_model_available("gigaam-v3", "float32")
|
|
assert backend._resolved_model_id == "gigaam-v3-ctc"
|
|
assert backend.actual_compute_type == "float32"
|
|
|
|
|
|
class TestCreateModel:
|
|
def test_calls_load_model_with_correct_args(self, monkeypatch):
|
|
"""Verify create_model passes correct args to onnx_asr.load_model."""
|
|
calls = []
|
|
|
|
def fake_load_model(model=None, path=None, quantization=None,
|
|
cpu_preprocessing=None, **kwargs):
|
|
calls.append({
|
|
"model": model, "path": path, "quantization": quantization,
|
|
"cpu_preprocessing": cpu_preprocessing,
|
|
})
|
|
return FakeAsrAdapter()
|
|
|
|
class FakeAsrAdapter:
|
|
def with_vad(self, vad):
|
|
return self
|
|
|
|
monkeypatch.setattr("onnx_asr.load_model", fake_load_model)
|
|
|
|
backend = OnnxAsrBackend()
|
|
backend.actual_compute_type = "int8"
|
|
model = backend.create_model("gigaam-v3-ctc", "onnx", "int8")
|
|
|
|
assert len(calls) == 1
|
|
assert calls[0]["quantization"] == "int8"
|
|
assert calls[0]["cpu_preprocessing"] is True
|
|
assert model is not None
|
|
|
|
def test_loads_silero_vad(self, monkeypatch):
|
|
"""Verify Silero VAD is loaded and attached to model."""
|
|
vad_calls = []
|
|
|
|
def fake_load_vad(model, **kwargs):
|
|
vad_calls.append(model)
|
|
return "fake_vad"
|
|
|
|
def fake_load_model(**kwargs):
|
|
return FakeAsrAdapter()
|
|
|
|
class FakeAsrAdapter:
|
|
def with_vad(self, vad):
|
|
self._vad = vad
|
|
return self
|
|
|
|
monkeypatch.setattr("onnx_asr.load_model", fake_load_model)
|
|
monkeypatch.setattr("onnx_asr.load_vad", fake_load_vad)
|
|
|
|
backend = OnnxAsrBackend()
|
|
model = backend.create_model("gigaam-v3-ctc", "onnx", "int8")
|
|
|
|
assert vad_calls == ["silero"]
|
|
|
|
def test_fp16_compute_type(self, monkeypatch):
|
|
"""Verify fp16 compute_type is passed through."""
|
|
calls = []
|
|
|
|
def fake_load_model(model=None, quantization=None, **kwargs):
|
|
calls.append(quantization)
|
|
return FakeAsrAdapter()
|
|
|
|
class FakeAsrAdapter:
|
|
def with_vad(self, vad):
|
|
return self
|
|
|
|
monkeypatch.setattr("onnx_asr.load_model", fake_load_model)
|
|
monkeypatch.setattr("onnx_asr.load_vad", lambda model, **kw: None)
|
|
|
|
backend = OnnxAsrBackend()
|
|
backend.create_model("parakeet-v3", "onnx", "fp16")
|
|
|
|
assert calls == ["fp16"]
|
|
|
|
|
|
class TestModelAliases:
|
|
def test_gigaam_v3_resolves(self):
|
|
backend = OnnxAsrBackend()
|
|
result = backend._resolve_model("gigaam-v3")
|
|
assert result == "gigaam-v3-ctc"
|
|
|
|
def test_parakeet_v3_resolves(self):
|
|
backend = OnnxAsrBackend()
|
|
result = backend._resolve_model("parakeet-v3")
|
|
assert result == "nemo-parakeet-tdt-0.6b-v3"
|
|
|
|
def test_raw_name_passes_through(self):
|
|
backend = OnnxAsrBackend()
|
|
result = backend._resolve_model("nemo-canary-1b-v2")
|
|
assert result == "nemo-canary-1b-v2"
|
|
|
|
def test_unknown_alias_raises(self):
|
|
backend = OnnxAsrBackend()
|
|
with pytest.raises(ValueError, match="Неподдерживаемая модель"):
|
|
backend._resolve_model("nonexistent-model")
|