From 9ae013ad0f7c1829c203042b6c3c2ad64b556ba3 Mon Sep 17 00:00:00 2001 From: Dmitriy Dementiev Date: Wed, 12 Aug 2026 12:19:07 +0300 Subject: [PATCH] =?UTF-8?q?fix(onnx):=20=D0=BF=D0=BE=D0=B4=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D0=BA=D0=B8=20=D0=BF=D1=80=D0=B5=D0=B4=D0=BB=D0=B0?= =?UTF-8?q?=D0=B3=D0=B0=D1=8E=D1=82=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BD=D0=B0=20=D0=BF=D0=BB=D0=B0=D1=82?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B5=20=D0=B1=D1=8D=D0=BA=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - подсказки в ошибке и предупреждении называли только OpenVINO и CUDA, которых нет на macOS и ARM, поэтому пользователю там предлагались заведомо нерабочие команды. - Что: - в оба сообщения добавлен вариант --device cpu, работающий на любой платформе. - для large-v3-turbo подсказки по cpu и cuda подставляют medium, так как faster-whisper turbo не поддерживает. - Проверка: - uv run pytest -q: 243 passed, 1 skipped. --- src/local_transcriber/backends/onnx_asr.py | 23 +++++++++++++++++----- tests/test_onnx_asr.py | 10 ++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/local_transcriber/backends/onnx_asr.py b/src/local_transcriber/backends/onnx_asr.py index 5946ea1..c73212b 100644 --- a/src/local_transcriber/backends/onnx_asr.py +++ b/src/local_transcriber/backends/onnx_asr.py @@ -55,6 +55,9 @@ _PARAKEET_V3_LANGUAGES = frozenset( _WHISPER_MODEL_NAMES = frozenset( {"tiny", "base", "small", "medium", "large-v3", "large-v3-turbo"} ) +# faster-whisper не знает turbo, поэтому для cpu и cuda подсказываем medium. +# Источник правды — MODEL_REPOS в backends/faster_whisper.py и backends/openvino.py +_OPENVINO_ONLY_WHISPER_MODELS = frozenset({"large-v3-turbo"}) MODEL_CATALOG: dict[str, OnnxModelSpec] = { "gigaam-v3": OnnxModelSpec( @@ -253,11 +256,13 @@ class OnnxAsrBackend: if model_name in MODEL_ALIASES: return MODEL_ALIASES[model_name] if model_name in _WHISPER_MODEL_NAMES: + fallback = _whisper_fallback_model(model_name) raise ValueError( f"Модель '{model_name}' относится к Whisper и не поддерживается " "ONNX-бэкендом. Без CUDA --device auto выбирает ONNX; " - f"укажите --device openvino-cpu --model {model_name} " - "или --device cuda --model medium." + f"укажите --device openvino-cpu --model {model_name} на x86, " + f"--device cpu --model {fallback} на любой платформе " + f"или --device cuda --model {fallback} при NVIDIA GPU." ) if "/" in model_name or model_name.count("-") >= 2: # Looks like a raw onnx-asr name — allow passthrough @@ -280,9 +285,10 @@ class OnnxAsrBackend: warnings.warn( f"Язык '{language}' не поддерживается моделью '{self._model_name}' " f"(поддерживаются: {supported}). Результат может быть некорректным. " - "Для других языков используйте " - "--device openvino-cpu --model medium " - "или --device cuda --model medium.", + "Для других языков возьмите Whisper: " + "--device openvino-cpu --model medium на x86, " + "--device cpu --model medium на любой платформе " + "или --device cuda --model medium при NVIDIA GPU.", UserWarning, stacklevel=2, ) @@ -304,6 +310,13 @@ def _preferred_compute_type(quantizations: frozenset[str | None]) -> str: raise ValueError("Для ONNX-модели не указаны доступные квантизации") +def _whisper_fallback_model(model_name: str) -> str: + """Модель для подсказки про faster-whisper: turbo там недоступен.""" + if model_name in _OPENVINO_ONLY_WHISPER_MODELS: + return "medium" + return model_name + + def _model_language(spec: OnnxModelSpec | None) -> str | None: if spec is not None and len(spec.supported_languages) == 1: return next(iter(spec.supported_languages)) diff --git a/tests/test_onnx_asr.py b/tests/test_onnx_asr.py index b8783f6..d29aeb0 100644 --- a/tests/test_onnx_asr.py +++ b/tests/test_onnx_asr.py @@ -257,6 +257,7 @@ class TestTranscribe: UserWarning, match=( r"Язык 'en'.*--device openvino-cpu --model medium.*" + r"--device cpu --model medium.*" r"--device cuda --model medium" ), ): @@ -460,6 +461,13 @@ class TestModelAliases: ): backend._resolve_model("medium") + def test_whisper_error_offers_platform_independent_backend(self): + """На macOS и ARM нет ни OpenVINO, ни CUDA — нужен путь через cpu.""" + backend = OnnxAsrBackend() + + with pytest.raises(ValueError, match=r"--device cpu --model medium"): + backend._resolve_model("medium") + def test_turbo_whisper_error_suggests_models_supported_by_backends(self): backend = OnnxAsrBackend() @@ -469,4 +477,6 @@ class TestModelAliases: message = str(exc_info.value) assert "--device openvino-cpu --model large-v3-turbo" in message assert "--device cuda --model medium" in message + assert "--device cpu --model medium" in message assert "--device cuda --model large-v3-turbo" not in message + assert "--device cpu --model large-v3-turbo" not in message