{"record":{"id":"a9c46283e8edb65c","repo":"unslothai/unsloth","slug":"language-language-is-not-supported-by-stt-mode","errorCode":null,"errorMessage":"Language '{language}' is not supported by STT model '{model_id}'.","messagePattern":"Language '(.+?)' is not supported by STT model '(.+?)'\\.","errorType":"exception","errorClass":"SttLanguageError","httpStatus":422,"severity":"error","filePath":"studio/backend/core/inference/stt_ggml_sidecar.py","lineNumber":1099,"sourceCode":"        model: Optional[str] = None,\n        language: Optional[str] = None,\n        fast: bool = False,\n        cancel_event: Optional[threading.Event] = None,\n    ) -> dict:\n        \"\"\"Transcribe encoded audio bytes via whisper-server.\n\n        Accepts any container PyAV can decode (same validation and caps as the\n        Transformers sidecar). Returns {text, language, duration, model}.\n        \"\"\"\n        self._raise_if_update_in_progress()\n        ensure_engine_available()\n        model_id = resolve_ggml_model_id(model)\n        lang = normalize_whisper_language(language)\n        if cancel_event is not None and cancel_event.is_set():\n            raise SttTranscriptionCancelledError(\"Transcription cancelled.\")\n        known_languages = _known_whisper_languages()\n        if lang is not None and known_languages is not None and lang not in known_languages:\n            raise SttLanguageError(\n                f\"Language '{language}' is not supported by STT model '{model_id}'.\"\n            )\n        # Reject a missing model before decoding so a long clip does not burn CPU\n        # only to 409 (matches the Transformers sidecar's preflight).\n        self._ensure_model_downloaded(model_id)\n        decoded_audio = _decode_audio_bounded(audio, cancel_event)\n        if cancel_event is not None and cancel_event.is_set():\n            raise SttTranscriptionCancelledError(\"Transcription cancelled.\")\n        wav_bytes = _pcm_to_wav_bytes(decoded_audio)\n        with self._lock:\n            try:\n                if cancel_event is None:\n                    self.load(model_id)\n                else:\n                    self.load(model_id, request_cancel_event = cancel_event)\n                text = self._post_inference(wav_bytes, lang, fast, cancel_event)\n                if cancel_event is not None and cancel_event.is_set():\n                    raise SttTranscriptionCancelledError(\"Transcription cancelled.\")","sourceCodeStart":1081,"sourceCodeEnd":1117,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/studio/backend/core/inference/stt_ggml_sidecar.py#L1081-L1117","documentation":"SttLanguageError raised in transcribe() after normalize_whisper_language: the requested language code is set, the known-language table is available, and the normalized code is not in _known_whisper_languages(). It prevents burning a decode + HTTP round-trip on a language whisper.cpp will reject or silently mishandle.","triggerScenarios":"transcribe(..., language='xx') where 'xx' normalizes to a code absent from the whisper language table — typo'd codes, full names like 'French' where a code ('fr') is expected, or codes from a different model family.","commonSituations":"UI language picker sends a display name instead of an ISO code; locale-derived code (e.g. 'en-US') not normalized to 'en'; hardcoded language string drifts after a refactor.","solutions":["Send a Whisper-supported ISO 639-1 code (e.g. 'fr', 'en', 'de') or omit language for auto-detect.","Validate against the same known-language set in the UI before submitting.","Check normalize_whisper_language's expectations if unsure of the accepted input forms."],"exampleFix":"// before\nresult = sidecar.transcribe(audio_bytes, language=\"French\")\n\n// after\nresult = sidecar.transcribe(audio_bytes, language=\"fr\")","handlingStrategy":"validation","validationCode":"from core.inference.stt_ggml_sidecar import normalize_whisper_language, _known_whisper_languages\nlang = normalize_whisper_language(language)\nknown = _known_whisper_languages()\nif lang is not None and known is not None and lang not in known:\n    reject_language_input(language)","typeGuard":"def is_supported_language(language: str | None) -> bool:\n    lang = normalize_whisper_language(language)\n    known = _known_whisper_languages()\n    return lang is None or known is None or lang in known","tryCatchPattern":"try:\n    sidecar.transcribe(audio, language=language)\nexcept SttLanguageError as exc:\n    show_language_error(exc)  # or retry with language=None for auto-detect","preventionTips":["Send ISO 639-1 codes only; map display names to codes in the UI layer.","Constrain the language picker to the known whisper language set.","Allow 'auto' (None) as an escape hatch instead of guessing codes."],"tags":["stt","ggml","language-code","validation"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}