From a3d0213cb3c6731876cb039a85859ea147ca9f5c Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Sat, 25 Apr 2026 21:19:33 +0300 Subject: [PATCH] =?UTF-8?q?feat(onnx-asr):=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D1=81=D0=BA=D0=B5=D0=BB=D0=B5=D1=82?= =?UTF-8?q?=20=D0=B1=D1=8D=D0=BA=D0=B5=D0=BD=D0=B4=D0=B0=20=D1=81=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B0=D1=81=D0=BE=D0=B2=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - onnx-asr бэкенд должен распознавать короткие алиасы (gigaam-v3, parakeet-v3) и raw-имена (nemo-canary-1b-v2). - Что: - создан файл backends/onnx_asr.py с MODEL_ALIASES и классом OnnxAsrBackend. - метод _resolve_model: преобразует алиасы, пропускает raw-имена, выдаёт ValueError для неизвестных. - написаны 4 теста на разрешение алиасов. - Проверка: - uv run pytest tests/test_onnx_asr.py::TestModelAliases -v --- src/local_transcriber/backends/onnx_asr.py | 27 ++++++++++++++++++++++ tests/test_onnx_asr.py | 26 +++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/local_transcriber/backends/onnx_asr.py create mode 100644 tests/test_onnx_asr.py diff --git a/src/local_transcriber/backends/onnx_asr.py b/src/local_transcriber/backends/onnx_asr.py new file mode 100644 index 0000000..190c6f2 --- /dev/null +++ b/src/local_transcriber/backends/onnx_asr.py @@ -0,0 +1,27 @@ +"""Бэкенд транскрипции на основе onnx-asr (GigaAM, Parakeet, FastConformer).""" + +from __future__ import annotations + +MODEL_ALIASES: dict[str, str] = { + "gigaam-v3": "gigaam-v3-ctc", + "parakeet-v3": "nemo-parakeet-tdt-0.6b-v3", +} + +SUPPORTED_ALIASES = ", ".join(MODEL_ALIASES) + + +class OnnxAsrBackend: + """Бэкенд транскрипции через onnx-asr (ONNX Runtime).""" + + def _resolve_model(self, model_name: str) -> str: + """Resolve alias to onnx-asr model name. Raw names pass through.""" + if model_name in MODEL_ALIASES: + return MODEL_ALIASES[model_name] + if "/" in model_name or model_name.count("-") >= 2: + # Looks like a raw onnx-asr name — allow passthrough + return model_name + raise ValueError( + f"Неподдерживаемая модель '{model_name}'. " + f"Доступные алиасы: {SUPPORTED_ALIASES}. " + f"Либо укажите полное имя модели onnx-asr." + ) diff --git a/tests/test_onnx_asr.py b/tests/test_onnx_asr.py new file mode 100644 index 0000000..4cceb3a --- /dev/null +++ b/tests/test_onnx_asr.py @@ -0,0 +1,26 @@ +"""Tests for onnx-asr backend.""" + +import pytest +from local_transcriber.backends.onnx_asr import OnnxAsrBackend, MODEL_ALIASES + + +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")