unslothai/unsloth · error · SttLanguageError

Language '{language}' is not supported by STT model '{model_

Error message

Language '{language}' is not supported by STT model '{model_id}'.

What it means

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.

Source

Thrown at studio/backend/core/inference/stt_ggml_sidecar.py:1099

        model: Optional[str] = None,
        language: Optional[str] = None,
        fast: bool = False,
        cancel_event: Optional[threading.Event] = None,
    ) -> dict:
        """Transcribe encoded audio bytes via whisper-server.

        Accepts any container PyAV can decode (same validation and caps as the
        Transformers sidecar). Returns {text, language, duration, model}.
        """
        self._raise_if_update_in_progress()
        ensure_engine_available()
        model_id = resolve_ggml_model_id(model)
        lang = normalize_whisper_language(language)
        if cancel_event is not None and cancel_event.is_set():
            raise SttTranscriptionCancelledError("Transcription cancelled.")
        known_languages = _known_whisper_languages()
        if lang is not None and known_languages is not None and lang not in known_languages:
            raise SttLanguageError(
                f"Language '{language}' is not supported by STT model '{model_id}'."
            )
        # Reject a missing model before decoding so a long clip does not burn CPU
        # only to 409 (matches the Transformers sidecar's preflight).
        self._ensure_model_downloaded(model_id)
        decoded_audio = _decode_audio_bounded(audio, cancel_event)
        if cancel_event is not None and cancel_event.is_set():
            raise SttTranscriptionCancelledError("Transcription cancelled.")
        wav_bytes = _pcm_to_wav_bytes(decoded_audio)
        with self._lock:
            try:
                if cancel_event is None:
                    self.load(model_id)
                else:
                    self.load(model_id, request_cancel_event = cancel_event)
                text = self._post_inference(wav_bytes, lang, fast, cancel_event)
                if cancel_event is not None and cancel_event.is_set():
                    raise SttTranscriptionCancelledError("Transcription cancelled.")

View on GitHub (pinned to 203007d190)

Solutions

  1. Send a Whisper-supported ISO 639-1 code (e.g. 'fr', 'en', 'de') or omit language for auto-detect.
  2. Validate against the same known-language set in the UI before submitting.
  3. Check normalize_whisper_language's expectations if unsure of the accepted input forms.

Example fix

// before
result = sidecar.transcribe(audio_bytes, language="French")

// after
result = sidecar.transcribe(audio_bytes, language="fr")
Defensive patterns

Strategy: validation

Validate before calling

from core.inference.stt_ggml_sidecar import normalize_whisper_language, _known_whisper_languages
lang = normalize_whisper_language(language)
known = _known_whisper_languages()
if lang is not None and known is not None and lang not in known:
    reject_language_input(language)

Type guard

def is_supported_language(language: str | None) -> bool:
    lang = normalize_whisper_language(language)
    known = _known_whisper_languages()
    return lang is None or known is None or lang in known

Try / catch

try:
    sidecar.transcribe(audio, language=language)
except SttLanguageError as exc:
    show_language_error(exc)  # or retry with language=None for auto-detect

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of unslothai/unsloth@203007d190 (2026-08-15). Data as JSON: /api/errors/a9c46283e8edb65c. Report an issue: GitHub.