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