{"record":{"id":"70d969e57569f265","repo":"openai/whisper","slug":"this-model-doesn-t-have-language-tokens-so-it-can","errorCode":null,"errorMessage":"This model doesn't have language tokens so it can't perform lang id","messagePattern":"This model doesn't have language tokens so it can't perform lang id","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"whisper/decoding.py","lineNumber":42,"sourceCode":"    of the most probable language tokens and the probability distribution over all language tokens.\n    This is performed outside the main decode loop in order to not interfere with kv-caching.\n\n    Returns\n    -------\n    language_tokens : Tensor, shape = (n_audio,)\n        ids of the most probable language tokens, which appears after the startoftranscript token.\n    language_probs : List[Dict[str, float]], length = n_audio\n        list of dictionaries containing the probability distribution over all languages.\n    \"\"\"\n    if tokenizer is None:\n        tokenizer = get_tokenizer(\n            model.is_multilingual, num_languages=model.num_languages\n        )\n    if (\n        tokenizer.language is None\n        or tokenizer.language_token not in tokenizer.sot_sequence\n    ):\n        raise ValueError(\n            \"This model doesn't have language tokens so it can't perform lang id\"\n        )\n\n    single = mel.ndim == 2\n    if single:\n        mel = mel.unsqueeze(0)\n\n    # skip encoder forward pass if already-encoded audio features were given\n    if mel.shape[-2:] != (model.dims.n_audio_ctx, model.dims.n_audio_state):\n        mel = model.encoder(mel)\n\n    # forward pass using a single token, startoftranscript\n    n_audio = mel.shape[0]\n    x = torch.tensor([[tokenizer.sot]] * n_audio).to(mel.device)  # [n_audio, 1]\n    logits = model.logits(x, mel)[:, 0]\n\n    # collect detected languages; suppress all non-language tokens\n    mask = torch.ones(logits.shape[-1], dtype=torch.bool)","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/openai/whisper/blob/5f86d1d86363843179951550570367b37c5d6f78/whisper/decoding.py#L24-L60","documentation":"whisper.detect_language() needs a tokenizer whose prompt sequence contains a language token (<|xx|> after <|startoftranscript|>). English-only models ('.en' checkpoints, or get_tokenizer(multilingual=False)) have no language tokens, so the check tokenizer.language_token not in sot_sequence raises ValueError before any inference.","triggerScenarios":"Calling whisper.detect_language(model) on a model loaded as 'base.en'/'large-v2.en'; or building DecodingOptions/Tokenizer manually with multilingual=False and passing it to detect_language; the code path builds a default tokenizer from model.is_multilingual and it comes back English-only.","commonSituations":"Switching a pipeline from 'base' to 'base.en' for speed and forgetting a detect_language() call; fine-tuned checkpoints whose dims.n_vocab reflect the English vocabulary; code that assumes every model supports lang id.","solutions":["Use a multilingual model: whisper.load_model('base') instead of 'base.en'","Skip detect_language() for English-only models and hardcode language='en' in transcribe()","Gate the call on model.is_multilingual before invoking detect_language()"],"exampleFix":"# before\nmodel = whisper.load_model(\"base.en\")\nlang, _ = whisper.detect_language(model, mel)  # ValueError\n\n# after\nmodel = whisper.load_model(\"base\")\nlang, _ = whisper.detect_language(model, mel)\n# or keep .en model and skip detection:\n# result = whisper.transcribe(model, path, language=\"en\")","handlingStrategy":"type-guard","validationCode":"def supports_lang_id(model) -> bool:\n    return model.is_multilingual","typeGuard":"from whisper import Whisper\n\ndef can_detect_language(model: Whisper) -> bool:\n    return bool(getattr(model, \"is_multilingual\", False))","tryCatchPattern":"try:\n    _, probs = whisper.detect_language(model, mel)\nexcept ValueError as e:\n    if \"language tokens\" in str(e):\n        probs = {\"en\": 1.0}  # English-only model: assume en\n    else:\n        raise","preventionTips":["Branch on model.is_multilingual before any detect_language() call","For '.en' models always pass language='en' to transcribe()","Centralize model selection so language-id code cannot receive English-only models"],"tags":["language-id","tokenizer","model-config","multilingual"],"backgroundTag":null,"analyzedSha":"5f86d1d86363843179951550570367b37c5d6f78","analyzedAt":"2026-08-14T18:53:59.547Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}