One voice, switching language mid-sentence, and the 23 languages it might be speaking at any moment: the 22 scheduled languages of India and English, drawn from four families.
Table of contents 12 parts · 58 min
next or previous part back to the top
Every voice arrives wrapped in a language, the way a river carries the colour of the soil it has crossed. Long before the words resolve, a listener has already tasted the water: the fall of the stress, the curl of a retroflex, the verb that waits patiently at the end of the sentence. A trained ear knows a raga from its first phrase, before the melody has told you anything at all.
Spoken language identification is that first phrase, heard by a machine.
It is the smallest decision in a speech system, and the one every later decision inherits. Which recogniser to wake, which way to translate, which voice should answer: all of it waits on a single label, usually decided in the first second or two of sound. This post is about why, in 2026, we think that decision deserves a model of its own, and about the one we built for the 22 scheduled languages of India and English: Anuvani-LID.
The first question every speech system asks
Before a machine can transcribe, translate or reply, it has to answer a question most of us never notice ourselves asking: which language is this? That is spoken language identification, or LID. Given a stretch of audio, the system names the language being spoken from a fixed list of candidates.
Humans are astonishingly good at it. Four-day-old infants already tell their mother’s language apart from an unfamiliar one, long before they understand a single word (Mehler et al., 1988). They are listening to rhythm and melody, not vocabulary. A machine must learn the same trick from the raw signal: sixteen thousand air-pressure samples a second, with no spaces, no letters and no script.
A useful picture is the front desk of a large multilingual hospital. The receptionist does not treat anyone. They decide which specialist you see. If they get that wrong, the best specialist in the building cannot help you, because they are not hearing your problem in your language.
In a modern voice pipeline, LID sits just after voice-activity detection, and its one label steers four things at once (Li, Ma & Lee, 2013):
- which speech recogniser, or which language setting, transcribes the audio;
- which direction a translation system runs;
- which language the assistant’s language model replies in, and which voice speaks the reply;
- which human team a call is handed to.
In India this is daily infrastructure, not a thought experiment. Kisan Call Centres answer farmers in 22 languages (Department of Agriculture & Farmers Welfare). The Tele-MANAS mental-health helpline routes callers to state cells by language (PIB, 2026). Bhashini offers automatic language detection across its national voice services (PIB, 2026). As our paper puts it, errors at this stage propagate: “a Maithili call sent to a Hindi recogniser degrades every later component.”
One label steers four things at once. Here a Maithili call is labelled Hindi, and every downstream component inherits the mistake. Flip the switch to give the identifier the right label.
A short history: from phonotactics to self-supervised encoders
LID is one of the oldest problems in speech technology, and its history is a story of steadily richer representations of the same signal (Li, Ma & Lee, 2013).
Sound sequences (1990s). Languages differ in which sounds they allow and in what order. Early systems exploited that directly: recognise a string of phones, then score it with a small n-gram model per language. Zissman’s comparison of four such approaches on telephone speech set the template for a decade (Zissman, 1996), and NIST’s Language Recognition Evaluations turned the problem into a shared benchmark (Sadjadi et al., 2018).
Utterance embeddings (2010s). The field then learned to summarise a whole utterance as a single vector. i-vectors compressed an utterance’s acoustic statistics into a few hundred numbers (Dehak et al., 2011). Deep networks trained directly on language labels overtook them, especially on short clips (Lopez-Moreno et al., 2014). x-vectors pooled frame-level features into a learned embedding (Snyder et al., 2018); attentive statistics pooling let the network decide which frames mattered (Okabe et al., 2018); and ECAPA-TDNN refined the recipe into today’s workhorse (Desplanques et al., 2020). VoxLingua107 made 107-language training data widely available (Valk & Alumäe, 2021), and compact models such as NVIDIA’s AmberNet followed (Jia et al., 2023).
Self-supervised encoders (2020 onward). wav2vec 2.0 showed that a network could learn speech structure from unlabelled audio (Baevski et al., 2020). XLSR-53 and XLS-R scaled that across dozens, then 128, languages (Conneau et al., 2021; Babu et al., 2022), and w2v-BERT added masked prediction (Chung et al., 2021). In this era one pre-trained encoder sprouts several small heads: a CTC head for transcription (Graves et al., 2006) and a classification head for language. Meta’s MMS is the clearest example: 1,107-language ASR built from per-language adapters and CTC heads, shipped alongside separate LID models covering up to 4,017 languages (Pratap et al., 2024). NVIDIA found that multilingual self-supervised Conformers are “accidental learners” of language identity (Bartley et al., 2023). For Indian languages, IndicWav2Vec, IndicSUPERB and the 279k-hour MahaDhwani encoder brought the same approach home (Javed et al., 2022; Javed et al., 2023; Bhogale et al., 2025).
A parallel thread: the language as a token. Alongside this, researchers began folding LID into the recogniser. Watanabe, Hori and Hershey made the language a symbol the end-to-end model emits before the transcript (2017). Google trained single models on nine Indian languages, with and without a language-ID input (Toshniwal et al., 2018; Kannan et al., 2019). Later work added auxiliary LID objectives inside the encoder (Chen et al., 2023). That thread leads straight to the models that dominate today.
Thirty years of steadily richer representations of the same signal, and a parallel thread that folded the language decision into the recogniser as a token.
One model for everything: the text-generation turn
By 2020, natural-language processing had found an intoxicating idea. GPT-2 had framed language models as “unsupervised multitask learners” (Radford et al., 2019). T5 recast every NLP task as text-to-text (Raffel et al., 2020). Then GPT-3 showed that one next-token predictor with 175 billion parameters could translate, answer questions and do arithmetic from a prompt and a few examples, with no task-specific head at all (Brown et al., 2020).
The lesson that crossed into speech was simple and powerful. With enough data and compute, stop building a head per task. Turn every task into open-ended text generation, and let one model learn them all.
Whisper is where that lesson landed. An encoder reads 30 seconds of log-Mel spectrogram; an autoregressive decoder writes text. The paper is explicit about the design: “We use a simple format to specify all tasks and conditioning information as a sequence of input tokens to the decoder.” The first of those tokens is the language: “we predict the language being spoken which is represented by a unique token for each language in our training set (99 total)” (Radford et al., 2023). A Hindi transcript therefore begins:
<|startoftranscript|> <|hi|> <|transcribe|> <|notimestamps|> नमस्ते, आप कैसे हैं? <|endoftext|>
LID became a side effect of generation. The model’s belief about the language is simply whichever language token wins the first decoding step.
The label grew a script. Whisper’s tokens are two-letter ISO 639-1-style codes, with no notion of writing system. Later systems widened the code. Meta’s Omnilingual ASR, covering more than 1,600 languages, conditions on {language}_{script} pairs such as hin_Deva and urd_Arab: an ISO 639-3 language code joined to an ISO 15924 script code (Omnilingual ASR team, 2025; repo). Google’s Chirp 3 uses BCP-47 locale tags such as pa-Guru-IN (docs). Qwen3-ASR writes the language as a plain-text prefix before the transcript (Qwen Team, 2026).
The family tree kept growing. OWSM reproduced Whisper-style training on public data (Peng et al., 2023). Qwen-Audio unified more than 30 audio tasks under hierarchical tags (Chu et al., 2023). Mistral’s Voxtral (July 2025) joins a Whisper large-v3 encoder to Mistral language decoders, in 3B and 24B variants, adds a dedicated transcribe-mode token, and advertises “automatic language detection” (Mistral AI, 2025; Voxtral, 2025). Qwen3-Omni and Qwen3.5-Omni fold recognition into omni-modal models (Qwen Team, 2025; 2026). At the frontier, Gemini 3.5 Flash and OpenAI’s GPT-audio treat “which language is this?” as one more question to answer in text.
| System | How the language decision is made | Label format |
|---|---|---|
| Whisper, OWSM | Predicted as the first decoder token | <|hi|> (first decoded token) |
| Voxtral | Detected inside the model; transcribe-mode token | internal |
| Qwen3-ASR | Written as a text prefix before the transcript | language Hindi |
| Omnilingual ASR | Optional input; no detector shipped | hin_Deva |
| NVIDIA Canary | Required input prompt | source_lang='en' |
| Google Chirp 3 | Input list, or auto |
hi-IN, pa-Guru-IN |
| Meta MMS | Selects a per-language adapter; separate LID model | hin |
| Gemini, GPT-audio | Answered in free text from a prompt | free text |
It is worth saying plainly: this was a real advance. One training run, one model, remarkable robustness, and language identification apparently for free. Qwen3-ASR reports 97.9% average LID accuracy across four mainstream benchmarks. The question this post asks is narrower. For the first decision in a voice pipeline, is “for free” good enough?
Where is the language decided? In a classifier head trained for it, in the first token an autoregressive decoder happens to write, or in a line of text a language model is asked for.
Our position: decouple the first decision
Despite all of this progress, we believe the language decision belongs in a model of its own. It can be optional for a pipeline that already knows its language. For any voice agent that does not, it is the first component you build.
The field is quietly converging on the same view from the other side. The newest recognisers increasingly ask for the language rather than detect it. Omnilingual ASR takes an optional language_script code, and conditioning on it “largely resolves the wrong-script problem” of its CTC models. NVIDIA’s Canary requires source_lang. AI4Bharat’s IndicConformer is called as model(wav, "hi", "ctc"). Meta’s MMS loads a per-language adapter. And vendors advise the same thing in their docs: Sarvam says to “always specify the language code when you know the language of the audio. This improves accuracy and reduces processing time” (Sarvam docs).
So the real question is not whether a voice system needs a language decision. It is who makes it, how well, and whether you can see it. A dedicated model gives you six things a language token cannot:
- Weights tuned for one job. Every gradient step is spent separating languages, not predicting the next word.
- A calibrated confidence. A probability you can threshold, so the system can abstain, ask, or fall back.
- Its own time resolution. A decision per turn or per window, rather than one per 30-second chunk or per file.
- Its own label space. Languages your recogniser has never seen, and an honest “none of these”.
- Its own life cycle. Benchmarked, versioned and rolled back independently of the recogniser.
- A small footprint. Small enough to run on a phone or a CPU, in front of any recogniser you choose.
The rest of this post defends that position in three passes: first the theory of why a dedicated objective learns language better, then the linguistic and data realities that make the problem hard, and finally the systems case.
Inside a recogniser the language decision is a token nothing downstream can inspect. Made by a model of its own, it becomes a label with a confidence, and a router can send the call on, or ask.
Why a dedicated objective learns language better
This is the technical heart of the argument. It rests on three observations: the evidence for language lives in the acoustics, not the text; an autoregressive recogniser spends almost none of its training signal on that evidence; and a dedicated classifier can use a toolkit that a language token cannot.
The signal is far richer than the text
Written Hindi is a few Devanagari characters per word, three bytes each in UTF-8. Across 17 languages, spoken language carries linguistic information at a strikingly constant rate of about 39 bits per second (Coupé et al., 2019). The waveform that carries it runs at 256,000 bits per second (16 kHz, 16-bit), and even a compact 80-band log-Mel front end produces 8,000 numbers a second. That surplus is not noise. It holds the speaker, the room, the channel, the emotion, and, crucially, cues to the language that never reach the page.
Spoken-language-recognition research has long organised those cues into a hierarchy (Li, Ma & Lee, 2013): acoustic-phonetic (which sounds exist), phonotactic (which sequences are allowed), prosodic (rhythm, stress, tone) and lexical. Rhythm alone separates language classes measurably (Ramus, Nespor & Mehler, 1999). Our paper catalogues the cues that matter for India: the degree of retroflexion (stronger in Tamil than Hindi, weaker in Nepali), Hindi’s four-way stop series and Gujarati’s breathy vowels, vowel length that is contrastive in Dravidian languages but not in Bengali or Assamese, lexical tone in Punjabi, Dogri, Bodo and Meitei, and rare segments such as Sindhi implosives and Santali checked finals.
And one thing is missing from speech entirely: script. Devanagari alone serves at least ten of our 23 classes, and Hindi and Urdu are famously “one language, two scripts” (King, 1994). A model trained to emit text must guess a writing system from sound, a variable the audio simply does not contain.
LID is a problem about the acoustic signal. An objective defined on text tokens sees it only indirectly.
What each objective actually optimises
A dedicated LID model minimises a loss on a softmax over languages. Every parameter update follows the gradient of one question: which language?
Here x is the audio, ℓ the true language, and γ the focal parameter (γ = 0 recovers ordinary cross-entropy). Trained this way, deep classifiers drift toward neural collapse: features of each class tighten around their mean, and the class means spread into a maximally separated, equiangular configuration (Papyan, Han & Donoho, 2020). That is precisely the geometry you want when Hindi, Urdu and Maithili sit a few phonetic cues apart.
An autoregressive recogniser minimises something else: the average surprise of every token in the transcript, with the language token as just the first.
The language term carries a weight of 1/T. In Whisper’s tokenizer we measured about 1.1 tokens per English word and 5.7 per Hindi word, so a 30-second segment yields roughly 85 target tokens in English and 430 in Hindi. The language decision therefore receives about 1% of the supervision in English and about 0.2% in Hindi. The languages that most need a good LID get the smallest share of it. (This is our estimate, not a published measurement.)
Two further details weaken that signal. Whisper’s language targets were not human labels at all: “these language targets are sourced from the aforementioned VoxLingua107 model”, a separate LID classifier (Radford et al., 2023). And in the standard fine-tuning recipe the language token is fixed per dataset, so the “LID” target becomes a constant (Hugging Face, 2022).
Shared weights, competing objectives. When one network serves several objectives, their gradients can conflict, and the dominant objective wins the shared parameters (Yu et al., 2020; Sener & Koltun, 2018; Kendall et al., 2018). Multilingual models show the same pattern as negative interference and the “curse of multilinguality” (Wang, Lipton & Tsvetkov, 2020; Conneau et al., 2020). Inside an autoregressive recogniser, language identification is the minority objective, sharing every weight with next-token prediction.
Reading the wrong layer. A decoder cross-attends to the final encoder layer. But language identity does not peak there. Layer-wise analyses of self-supervised speech models show information shifting across depth (Pasad et al., 2021; Pasad et al., 2023). In our encoder, linear-probe macro-F1 for language rises to 0.56 at blocks 9–11 of the pre-trained model and collapses to 0.13 at block 17. After fine-tuning it peaks at blocks 11–12 (0.86).
The toolkit a language token cannot use
A dedicated model can be shaped around the problem. Each tool below has a literature behind it, and our staged study measured what it is worth.
- Pooling. Statistics and attentive statistics pooling compress a variable-length utterance into one vector, attending to the few frames that carry a retroflex burst or a tonal contour (Snyder et al., 2018; Okabe et al., 2018). In our study, pooling heads differed by only about 1 point: the head matters less than you would think.
- Layer aggregation. A learned softmax-weighted sum over every encoder block, as in SUPERB and ELMo’s scalar mix, lets the classifier read language where it lives (Yang et al., 2021; Peters et al., 2018). It added 0.9 points in-domain and lifted every acoustic family: telephony +2.8, noise +1.9, confusable pairs +1.4.
- The loss decides calibration. Focal loss down-weights easy examples by (1 − p)γ, concentrating gradient on hard, confusable clips (Lin et al., 2017), and improves calibration (Mukhoti et al., 2020). Cosine-margin heads such as AM-Softmax and ArcFace sharpen embeddings but produce badly calibrated scores (Wang et al., 2018; Deng et al., 2019). In our study they reached an expected calibration error of 0.75–0.79; focal loss reached 0.023 with the best macro-F1. Post-hoc temperature scaling (Guo et al., 2017) then cut our all-23 test ECE from 0.054 to 0.008.
- Sampling for a skewed world. Temperature sampling, pℓ ∝ nℓ1/T, trades head for tail (Arivazhagan et al., 2019). At T = 2 the two languages under 500 hours that the in-domain test covers, Dogri and Konkani, rose from 0.742 to 0.930 F1, and Dogri alone from 0.50 to 0.89. Stacking a second rebalancer (Menon et al., 2021) counted the prior twice and cost 3.5 points in-domain; the two largest classes collapsed, English from 0.906 to 0.699 F1 and Hindi from 0.713 to 0.344.
- Augmentation aimed at deployment. Duration cropping, MUSAN noise and babble, room impulses, 8 kHz codecs and SpecAugment (Ko et al., 2015; Snyder et al., 2015; Ko et al., 2017; Park et al., 2019). Cropping alone added 9.5 points at 0.5 s; multi-talker babble took our babble conditions from 0.804 to 0.920.
- Curriculum and weight averaging. A competence curriculum raised the weight of the confusable Indo-Aryan cluster as training progressed (Platanios et al., 2019), and a uniform “soup” of seven checkpoints ranked first of 31 candidates (Wortsman et al., 2022).
None of these levers is available to a language token without retraining the whole recogniser around it. A dedicated model can pull all of them at once.
The numbers
| Objective | Targets per segment | Share on the language |
|---|---|---|
| Dedicated LID | 1 label | 100% |
| Autoregressive ASR, English, 30 s | ≈ 85 | 1 / 85 ≈ 1.2% |
| Autoregressive ASR, Hindi, 30 s | ≈ 430 | 1 / 430 ≈ 0.23% |
The whole training signal of one example, and how much of it is spent on which language. A dedicated identifier spends all of it on the language. A recogniser spends one token in 85 on it for English and one in 430 for Hindi: the languages that most need a good identifier get the smallest share. Our estimate, not a published measurement.
Language identity peaks in the middle of the encoder, not at the end. The audio climbs a stack of 17 identical Conformer blocks; a linear probe finds language at 0.56 in blocks 9–11 of the pre-trained model but only 0.13 at block 17, and 0.86 at blocks 11–12 after fine-tuning. A decoder cross-attends to block 17 alone; learned layer weights read all seventeen.
When the language token is wrong, the whole inference breaks
In an autoregressive recogniser the language token is the first domino. Get it right and it is invisible. Get it wrong and every token after it inherits the mistake.
The mechanism: a wrong first token becomes a wrong task
An autoregressive decoder conditions each step on its own earlier outputs. In training it sees the true prefix; at inference it sees its own guesses. That mismatch, known as exposure bias, means an early error is carried forward rather than corrected (Bengio et al., 2015; Ranzato et al., 2016). The language token is the earliest error there is.
Whisper’s training data explains what the model does next. When a clip’s audio language and transcript language disagreed, OpenAI dropped it from recognition training, but “if the transcript language is English” they kept the pair “as X→en speech translation training examples instead” (Radford et al., 2023, §2.1). A mismatch between the language token and the audio is therefore something the model learned to treat as translation. English audio decoded with --language fr comes back as fluent French (openai/whisper #2285). Peng et al. even observed Whisper translating code-switched speech into Mandarin, a direction it was never trained on (Peng et al., 2023).
This is what makes the failure dangerous. The output is fluent, so it looks like success. It belongs with the failure modes the hallucination literature has documented in neural recognisers: output that is “fluent and coherent” but untethered from what was said (Frieske & Shi, 2024); whole invented phrases in about 1% of Whisper transcripts, 38% of which contained explicit harms (Koenecke et al., 2024); and, in Whisper’s own words, “complete hallucination where the model will output a transcript entirely unrelated to actual audio.”
The measurements
When researchers split results by whether the language was identified correctly, the gap is not a few points. It is the difference between a usable transcript and a useless one.
| Study | Setting | Language right | Language wrong |
|---|---|---|---|
| Yan, Pratap, Watanabe & Auli, 2024 | MMS on FLEURS-102 (14.4% of clips misidentified) | 20.8% WER | 69.1% WER |
| Amooie et al., 2026 | Bilingual XLS-R, Frisian–Dutch | 14.1% WER | 53.3% WER |
| Amooie et al., 2026 | Danish–Swedish | 20.7% WER | 59.7% WER |
| Amooie et al., 2026 | Slovak–Czech | 24.5% WER | 35.4% WER |
| Yang, Huang & Lee, 2024 | Whisper, Mandarin–English code-switching, token pair | 26.8% MER (zh + en) | 54.2% MER (zh + es) |
| Peng et al., 2023 | Whisper on SEAME, English words | 44.7% WER (zh + en prompt) | 85.5% WER (detected token) |
Adversaries know this too. By fooling only Whisper’s language detector, Olivier and Raj pushed WER above 100% for Armenian and Lithuanian and to 75% or more for Czech, Danish and Indonesian; outputs became “a mostly nonsensical mix of the true and target language” (Olivier & Raj, 2023).
The same conclusion appears across very different architectures. “Language-agnostic ASR performance highly relies on the accuracy of LID as wrong LID predictions may lead to transcription in the wrong language” (Kwok, Yip & Chng, 2024). “Performance can deteriorate dramatically when LID is absent”, because of “cascaded errors inherent in the implicit language identification and monolingual recognition pipeline” (Li et al., 2025). “A key to understanding their imbalanced performance across different languages is to examine if the model actually knows which language it should transcribe” (Chen et al., 2023). And for CTC models, which have no token at all, the failure shows up as script: they “often fail due to script misprediction… the decoded characters belong to another language altogether” (Omnilingual ASR team, 2025).
In the wild
- Speech-LLMs. A Google DeepMind study reports that “models often misidentify the output language, compromising transcription fidelity and downstream application quality”; Gemini Flash produced wrong-language output on 0.6–2.2% of clips with no language hint (Kim et al., 2026). At a million calls a day, that is 6,000 to 22,000 wrong-language transcripts.
- Hindi and Urdu. Whisper users report Hindi detected as Urdu, and Urdu or Persian script even when
language='hi'is set (#1662). A Hindi speaker’s audio in a realtime voice agent came back “in japanese, urdu, and some other scripts” (openai-realtime-agents #46). - Model upgrades. Whisper large-v3 transcribed an English clip as Indonesian where large-v2 did not; a Hugging Face maintainer called it “a model regression from large-v2 -> v3” (transformers #27937).
- One decision per file.
openai-whisperprints “Detecting language using up to the first 30 seconds” and applies the answer to the entire recording (transcribe.py). Forty seconds of leading silence led whisper.cpp to decide the audio was Catalan (#1104). Whisper’s maintainer is candid: “It’s intended for monolingual audio inputs” (#1160).
Catastrophic WER, then hallucination
Wrong LID not only causes catastrophic WER but also triggers hallucination in autoregressive speech models. The two failures are easy to run together, and the arithmetic of the error rate separates them. Word error rate counts the substitutions, deletions and insertions needed to turn a transcript into what was said, and divides by the number of words said: (S + D + I) / N. A recogniser that writes every word in the wrong script, or translates every word, substitutes all of them and scores 100%. That is catastrophic, but it is bounded: the model is still following the audio, one wrong word for each word spoken, as in Figure 7. Substitutions and deletions can never outnumber the words spoken, so an error rate above 100% has only one source: insertions, words nobody said. Past 100%, a recogniser has invented more words than it recognised.
Error rates past that line turn up wherever the language decision fails. The attack on Whisper’s language detector described above pushed them past it for Armenian and Lithuanian (Olivier & Raj, 2023). On Pashto, where no Whisper model wrote Pashto script in more than 0.8% of utterances, zero-shot word error rates ran from 90% to 297%, and the medium model reached 461% on Common Voice; as the author notes, “a model generating Arabic-script output on Pashto audio has not achieved ASR in any interpretable sense” (Rahman, 2026).
Why the model keeps writing. The training objective explains the second failure. A recogniser trained only to predict the next token has learned that fluent text is rewarded whether or not the audio supports it. Studying LLM-based recognisers, Shivakumar and colleagues describe hallucinations as outputs with “high insertion rates” that “arise when the model deviate from input stimuli (speech signal), prioritizing distributional patterns resulting in semantically and phonetically unrelated outputs”. On meeting audio it was not trained on, their 8-billion-parameter model reached word error rates of 100.26% on headset microphones and 227.98% on distant ones, and on the distant microphones insertions alone came to 195.4 words for every hundred spoken. In the authors’ words, “the WER explodes to greater than 100% which is suggestive of increased hallucinations”. A reinforcement-learning stage that rewards low error rates directly cut those insertions to 9.0 and the error rate to 39.69% (Shivakumar et al., 2025; Figure 7c). The lesson for the language token is direct. It is the strongest “distributional pattern” a decoder is ever handed: it sets the prior for every step that follows. Hand it the wrong one and the model is being asked, from its first step, to prefer its prior to the audio.
The shape of the failure. What follows a wrong token has a recognisable form. The decoder starts in the wrong script or the wrong language, meets words that its prior cannot place, fills them with words that were never spoken, and often falls into a loop, because once a phrase has repeated a few times the repetition is itself the most likely continuation. With 30% of the audio masked, Whisper-small produced 51,797 insertions, 86% of them in such loops, “catastrophic autoregressive cycling where the decoder repeats phrases hundreds of times”; on Indian-accented speech, Whisper-large-v3’s insertion rate reached 9.62% (Ginjala et al., 2026). Long-form decoding “often exhibit[s] hallucinations, repetition loops, and content omissions” (Ahn et al., 2026), and non-speech segments alone are enough to trigger a recurring set of invented phrases (Barański et al., 2025). Figure 7b draws the pattern out word by word for a Hindi, an Urdu and a Maithili caller. Handed the wrong token, the recogniser loops on one phrase twenty times and writes about three times as many words as were spoken, so its error rate climbs to about 300%; handed the right code by a dedicated identifier, it returns the sentence as spoken.
The same Hindi audio, decoded with the Hindi, Urdu and English language tokens. Only the first token changed; the recogniser followed it into another script and then into another language. Scored against what was said, both wrong transcripts have a word error rate of 100%, though one of them holds exactly the right words. That is the catastrophic half of the failure; Figure 7b shows the other half, hallucination.
Wrong LID not only causes catastrophic WER but also triggers hallucination in autoregressive speech models. Handed the wrong first token, the recogniser writes in the wrong script or the wrong language, falls into a loop that writes one phrase 20 times, invents words that were never said, and finds its way back only at the end. It writes about three times as many words as the caller spoke, so its word error rate climbs to about 300%; past 100%, a transcript holds more invented words than recognised ones. Given the right code by a dedicated identifier, the same recogniser returns the sentence as spoken. The sentences are constructed to show the documented pattern, not recorded model outputs, and the error rates are those of the illustration; real loops run longer still, with Whisper repeating a phrase hundreds of times (Ginjala et al., 2026).
The numbers
| System, audio and training | Insertions | Deletions | Substitutions | WER |
|---|---|---|---|---|
| 8B, distant microphones (AMI-SDM), trained on the next token only (SFT) | 195.4 | 17.4 | 15.3 | 227.98% |
| 8B, distant microphones (AMI-SDM), after the reward on word error rate (GRPO) | 9.0 | 20.2 | 10.5 | 39.69% |
| 8B, headset microphones (AMI-IHM), trained on the next token only (SFT) | 82 | 10.5 | 7.7 | 100.26% |
| 8B, headset microphones (AMI-IHM), after the reward on word error rate (GRPO) | 4.6 | 11.6 | 6.0 | 22.16% |
| 2B, distant microphones (AMI-SDM), trained on the next token only (SFT) | 56.7 | 16.6 | 14.6 | 87.88% |
| 2B, distant microphones (AMI-SDM), after the reward on word error rate (GRPO) | 7.4 | 18.1 | 12.1 | 37.59% |
| 2B, headset microphones (AMI-IHM), trained on the next token only (SFT) | 38.4 | 10.3 | 7.3 | 56.0% |
| 2B, headset microphones (AMI-IHM), after the reward on word error rate (GRPO) | 2.8 | 10.96 | 6.3 | 20.0% |
Past 100%, a word error rate is made of words nobody said. Each bar splits the error into substitutions, deletions and insertions; the first two can never outnumber the words spoken, so whatever crosses the 100% line is insertions. Trained only to predict the next token, the 8-billion-parameter recogniser inserted 195.4 words for every hundred spoken on the distant microphones, and its error rate reached 227.98%. After a reinforcement-learning stage that rewards low word error rate, the same model inserted 9.0 and scored 39.69%. This audio is out of domain rather than mislabelled, but the mechanism is the one a wrong language token sets off: a decoder that follows its prior instead of the audio.
Data and linguistic constraints: where the problem gets hard
On clean, long, read speech in well-resourced languages, LID looks solved. Deployed audio is none of those things. The two largest multilingual speech efforts of the decade open with the same admission. MMS: “current speech technology is restricted to about one hundred languages which is a small fraction of the over 7,000 languages spoken around the world” (Pratap et al., 2024). Omnilingual ASR: “most of the world’s 7,000+ languages remain unsupported, leaving thousands of long-tail languages behind. Expanding ASR coverage has been costly and limited by architectures that restrict language support” (Omnilingual ASR team, 2025).
LID inherits both halves of that problem. Few languages have data, and the ones that sound alike crowd each other. India has both at once.
Twenty-two languages by constitutional design
India’s Eighth Schedule began with 14 languages. Sindhi was added in 1967; Konkani, Manipuri and Nepali in 1992; Bodo, Dogri, Maithili and Santali in 2004 (Ministry of Home Affairs, 2017). English is an official language of the Union by statute but is not scheduled (Official Languages Act, 1963).
The 2011 Census rationalised 19,569 raw mother-tongue returns into 1,369 mother tongues and grouped them into 121 languages; 96.71% of the population returned a scheduled language. Speaker numbers span four orders of magnitude, from Hindi (528M, 43.6%) to Bodo (1.5M) and Sanskrit (24,821) (Office of the Registrar General, 2018). The labels are administrative, not uniform linguistic units. The Census category “Hindi” groups 56 mother tongues, including Bhojpuri (50.6M), Rajasthani (25.8M), Chhattisgarhi (16.2M) and Magahi (12.7M), and Maithili itself was counted under Hindi until 2001. The government notes that no fixed criterion separates a language from a dialect. An LID system must learn class boundaries that are partly conventional.
Four families, one linguistic area
Fifteen scheduled languages are Indo-Aryan, four Dravidian, two Tibeto-Burman and one Austroasiatic (Munda). Indo-Aryan speakers make up 78.1% of the population and Dravidian speakers 19.6% (Glottolog 5.3; Census 2011).
Genealogy understates how alike these languages sound. Emeneau (1956) described India as a linguistic area: across families, most languages have retroflex consonants contrasting with dentals, verb-final clauses with postpositions, chains of conjunctive participles and echo words. Masica (1976) extended the analysis. Retroflex systems are distributed geographically rather than genetically (Arsenault, 2017), and Assamese is a notable exception, having merged dentals and retroflexes into alveolars (Mahanta, 2012). Indian LID research has accordingly noted heavily overlapping phone sets (Dey, Sahidullah & Saha, 2022). On FLEURS, the South Asian group has the lowest LID accuracy of any language group (Conneau et al., 2023).
Close relatives and dialect continua
Several scheduled languages are sisters, or former “dialects”, of one another:
- Hindi and Urdu are sister languoids under Hindustani and share one colloquial form (Hammarström et al., 2026; Kachru, 2008). Urdu→Hindi is the single most common error in VoxLingua107 (Valk & Alumäe, 2021).
- Punjabi and Dogri share 93% of basic vocabulary (Kogan, 2016), and Grierson (1916) described Dogri as a dialect of Punjabi.
- Konkani and Marathi share 80–82% of basic vocabulary; Grierson (1905) treated Konkani as a Marathi dialect.
- Assamese, Bengali and Odia share 86–88% of basic vocabulary and one Glottolog node, and share numeral-classifier morphology with Maithili (Emeneau, 1956).
- Maithili speakers from the eastern dialect area commonly shift to Hindi when talking to speakers from other regions (Central Institute of Indian Languages).
Lexicostatistics measures vocabulary, not acoustics. But these are exactly the pairs where LID systems err, ours included: Hindi→Maithili (4.7% of Hindi clips), Urdu→Hindi (4.0%), Odia→Assamese (3.3%), Konkani→Marathi (2.3%). Some confusions cross family lines but not geography: Assamese→Bodo (3.0%) and Manipuri→Bodo (2.7%) reflect centuries of contact in north-eastern India, an areal similarity that no family tree records (Thomason, 2000). Of all our residual errors, 61% stay within the reference language’s family.
The numbers
| Spoken | Labelled as | Share of clips |
|---|---|---|
| Hindi | Maithili | 4.7% |
| Urdu | Hindi | 4.0% |
| Odia | Assamese | 3.3% |
| Assamese | Bodo | 3.0% |
| Manipuri | Bodo | 2.7% |
| Konkani | Marathi | 2.3% |
Errors follow geography and history. The largest confusions run between sisters and neighbours: Hindi→Maithili, Urdu→Hindi, Konkani→Marathi and Odia→Assamese within a family; Assamese→Bodo and Manipuri→Bodo across family lines but not across the north-east. Languages are placed roughly by region; the map shows coastlines only.
Scarce and skewed data
Speech resources do not track population. Urdu has more than 50 million first-language speakers but less audio in our pool than Maithili or Nepali, while English is abundant because most of its 128.5 million Indian speakers use it as a second or third language. Our 54,643-hour training pool holds 13,039 hours of English and 369 of Kashmiri, a 35-fold imbalance. Most openly available LID models cover only 15–21 of the 23 classes.
Low-resource languages are left with scarce training data. Figure 9 sets every class’s hours in our pool against its first-language speakers. The head is heavy: eight classes have more than 2,000 hours each, led by English (13,039) and Hindi (8,121), and together they hold 76% of the pool. The tail is thin: Kashmiri (369 hours), Konkani (375), Sindhi (390), Santali (394) and Dogri (478) have under 500 hours each, though each is the first language of 2.3 to 7.4 million people, and Manipuri (539) and Bodo (590) are barely above them. Between them the five scarcest hold 2,006 hours, under 4% of the pool and less than a sixth of what English has on its own. Per speaker the spread is wider still: about 15 hours per million speakers for Hindi and 14 for Urdu, but nearly 400 for Nepali and Bodo, so a language’s size does not predict how much of it a model will hear.
This is a pool assembled for a dedicated identifier from 18 corpora, and it is still thin enough to constrain the research: the balanced 1,000-hour subset of our first experiments could hold only 20 of the 23 classes, because Kashmiri, Santali and Sindhi had too little audio at that scale. In our staged study, trained on the natural distribution, the two languages under 500 hours that the in-domain test covers, Dogri and Konkani, reached 0.742 F1 against 0.949 for the eight largest; temperature sampling, described above, closed most of that gap.
The numbers
| Language | Family | First-language speakers (millions) | Training hours | Hours per million speakers |
|---|---|---|---|---|
| English | Germanic (English) | 0.26 (128.5 in all) | 13,039 | 50,150 (101 in all) |
| Hindi | Indo-Aryan | 528.3 | 8,121 | 15.4 |
| Marathi | Indo-Aryan | 83 | 4,792 | 57.7 |
| Tamil | Dravidian | 69 | 3,560 | 51.6 |
| Bengali | Indo-Aryan | 97.2 | 3,517 | 36.2 |
| Kannada | Dravidian | 43.7 | 3,287 | 75.2 |
| Telugu | Dravidian | 81.1 | 3,184 | 39.3 |
| Maithili | Indo-Aryan | 13.6 | 2,143 | 158 |
| Odia | Indo-Aryan | 37.5 | 1,827 | 48.7 |
| Malayalam | Dravidian | 34.8 | 1,544 | 44.4 |
| Gujarati | Indo-Aryan | 55.5 | 1,500 | 27.0 |
| Punjabi | Indo-Aryan | 33.1 | 1,339 | 40.5 |
| Nepali | Indo-Aryan | 2.9 | 1,150 | 397 |
| Assamese | Indo-Aryan | 15.3 | 987 | 64.5 |
| Sanskrit | Indo-Aryan | 0.025 | 828 | 33,359 |
| Urdu | Indo-Aryan | 50.8 | 691 | 13.6 |
| Bodo | Tibeto-Burman | 1.5 | 590 | 393 |
| Manipuri | Tibeto-Burman | 1.8 | 539 | 299 |
| Dogri | Indo-Aryan | 2.6 | 478 | 184 |
| Santali | Austroasiatic | 7.4 | 394 | 53.2 |
| Sindhi | Indo-Aryan | 2.8 | 390 | 139 |
| Konkani | Indo-Aryan | 2.3 | 375 | 163 |
| Kashmiri | Indo-Aryan | 6.8 | 369 | 54.3 |
Training audio does not follow speakers. Speaker numbers span four orders of magnitude, from Hindi’s 528 million to Sanskrit’s 24,821; training hours run from English’s 13,039 to Kashmiri’s 369, a 35-fold spread. Five scheduled languages have under 500 hours each (Kashmiri 369, Konkani 375, Sindhi 390, Santali 394, Dogri 478), though each is the first language of 2.3 to 7.4 million people. Urdu has more than 50 million speakers but less audio than Maithili or Nepali, and English is abundant because most of its 128.5 million speakers use it as a second or third language. The diagonals mark 10, 100 and 1,000 training hours per million speakers.
General-purpose ASR is skewed further still. Of Whisper’s 680,000 training hours, 65% are English; 98 other languages share 117,000 hours, and “WER halves for every 16× increase in training data” (model card; Radford et al., 2023). Whisper has no language token at all for 8 of the 22 scheduled languages: Odia, Maithili, Konkani, Dogri, Bodo, Santali, Manipuri and Kashmiri (tokenizer.py). Omnilingual ASR trains on 63,592 hours of English but 236.7 of Hindi, 7.6 of Manipuri (character error rate 51.1%) and 7.3 of Kashmiri (165.8%) (results table).
Here a dedicated LID has a structural advantage that is easy to miss. A recogniser needs transcripts; a language identifier needs one label per clip. The IISc Vaani corpus holds 205.5 hours of Manipuri audio but 0.46 hours transcribed; 465.5 hours of Maithili against 20.8; 31.5 hours of Kashmiri against 0.06 (Vaani). IndicVoices collected 7,348 hours and transcribed 1,639 (Javed et al., 2024). A standalone LID can learn from all of that audio. A joint recogniser can learn language only from the transcribed slice. For the hardest, lowest-resource languages, that is a 20- to 500-fold difference in usable data.
The speaker: multilingual, code-mixing, accented
In 2011, 26.0% of Indians reported a second language and 7.1% a third (Census 2011, Table C-17). About 17% of Hindi–English social-media posts mix languages (Bali et al., 2014), and in code-switched speech more than half of the embedded segments last only 200–400 ms (Barras et al., 2020): shorter than many single words. The language changes faster than any 30-second window can follow. Language diarization, locating where each language is spoken, has become its own benchmark on Indian conversations, and it is far from solved: the best team at DISPLACE 2024 still had a 25.05% language-diarization error rate (Baghel et al., 2023; Kalluri et al., 2024).
“India is not a contest over who can post the best accuracy number. It is a man on a four-thousand-rupee phone, a ceiling fan whirring overhead, who begins a sentence in Hindi, finishes it in Bengali, and drops an Indian-accented English word somewhere in the middle.”
That English word is its own challenge. English has only 0.26 million first-language speakers in India but 128.5 million speakers in total. Indian English is an L1-influenced variety (Kachru, 1983), with apical, often retroflex /t d/, a merged /v/–/w/ and syllable-based timing (Masica, 1972; Wiltshire & Harnsberger, 2006). Acoustically, it sits closer to the other 22 classes than native English does. General-purpose LID struggles here: in one study, per-speaker accuracy on English ranged “from 35% for a speaker with a distinctive Indian accent to 100%” (Kukk & Alumäe, 2022). Mother-tongue influence runs the other way too: our own model confuses English mostly with Hindi (2.7%), Santali (2.0%) and Marathi (1.7%), exactly the L1-conditioned pattern the phonetics literature predicts.
The channel: short, noisy and narrowband
Voice queries last one or two seconds. A large share of rural access is 8 kHz telephony: G.711 caps bandwidth at 4 kHz (ITU-T, 1988), and 41% of India’s 1.35 billion telephone subscriptions are rural (TRAI, 2026). Many of the phonetic cues above are sparse, and a one-second clip may contain none of them. Systems that look strong in-corpus fall apart across corpora: Indian LID has been measured at 11.8% equal error rate in-corpus against 43.3% cross-corpus (Dey, Saha & Sahidullah, 2021), and IndicSUPERB accuracy falls from 98.2% on seen speakers to 90.8% on unseen ones (Javed et al., 2023).
Not only India
Confusable clusters are the rule wherever languages share a history, which is why the field’s flagship evaluations are built around them.
- NIST’s 2017 Language Recognition Evaluation focused on “differentiating closely related languages (14 in total) drawn from 5 language clusters, namely Arabic, Chinese, English, Iberian, and Slavic” (Sadjadi et al., 2018).
- Its 2022 successor found the greatest confusability among Southern African languages (Ndebele, Tsonga, Venda, Xhosa, Zulu), between South African English and Indian-accented South African English, and among Tunisian, Algerian and Libyan Arabic (Lee et al., 2023).
- Arabic is a dialect continuum across seventeen countries (Shon et al., 2020).
- In Europe, bilingual LID reaches only 80.0% on Finnish–Estonian, and misidentified Danish–Swedish clips carry 59.7% WER (Amooie et al., 2026).
- In Southeast Asia, Qwen3-ASR’s remaining FLEURS errors “stem from confusion between Malay (ms) and Indonesian (id)” (Qwen Team, 2026).
- In China, Whisper large-v3 labels Cantonese as Mandarin
zhrather thanyue(#2419).
India is the extreme case: every one of these properties at once, across 1.4 billion people.
Confusable clusters are the rule wherever languages share a history: the five clusters of NIST’s LRE17, the Southern African languages of LRE22, the Arabic continuum, Malay and Indonesian, Danish and Swedish, Finnish and Estonian. India is the extreme case: every one of these properties at once. Coastlines only; no borders drawn.
Specialization erodes what little LID there is
General-purpose recognisers are trained on the internet’s idea of speech: podcasts, lectures, videos. Many of the places where speech technology matters most sound nothing like that.
The domains that need their own recognisers
- Medicine. Clinical documentation lives on drug names, dosages and anatomy spoken fast by tired people. On real clinical interviews in Indian hospitals, Whisper large-v3 scored 46.8% WER in English, 71.7% in Hindi and 98.6% in Kannada (Kumar et al., 2025). The first multilingual medical ASR dataset appeared only recently (Le-Duc et al., 2025), which tells you medical ASR has been built one language at a time.
- Law. Adalat AI transcribes proceedings in roughly a quarter of India’s courtrooms. Its engineers found Indic transcripts stopping mid-sentence because Whisper’s token cap is too small for Indic scripts, and had to shrink their windows to six or seven seconds (Adalat AI).
- Finance. Earnings calls mix jargon, numbers and speakers from every accent; Earnings-22 was built precisely because general models struggle on them (Del Rio et al., 2022).
- Aviation. Air-traffic-control speech is fast, formulaic, noisy and accented, and open models are fine-tuned specifically for it (van Doorn et al., 2024).
- Children. Child speech differs acoustically from adult speech, and Whisper must be fine-tuned to close the gap (Attia et al., 2024).
- Public services. Kisan Call Centre agronomy, Tele-MANAS mental-health calls and Bhashini’s citizen services each carry their own vocabulary, in 22 languages.
The standard remedy is to fine-tune a general model on domain data. Prompt-conditioned fine-tuning of Whisper cut WER by up to 33% on unseen domains, including medical conversation, air-traffic control and financial meetings (Liao et al., 2023). It works. But look at what it does to language identification.
What fine-tuning does to the language decision
It forgets other languages. Fully fine-tuning Whisper on four new languages raised the average WER on its four original languages from 11.68% to 32.29%; Chinese went from 14.37% to 68.93% (Song et al., 2024). Fine-tuning Whisper large-v3 on 12 hours of Irish took Welsh from 27.5% to 96.8% WER and Occitan from 64.2% to 79.8% (Qian et al., 2024). Notably, the Irish was trained under the English language token, because adding a new token performed slightly worse. The language slot had become a convenience, not an identity.
It confuses old languages with new ones. After Whisper was extended to ten new languages, most language-agnostic errors came from English audio being labelled as Esperanto, one of the additions (Kwok, Yip & Chng, 2024).
It trains the language slot to a constant. The standard fine-tuning recipe fixes the language for the dataset, so every training example carries the same language target (Hugging Face, 2022). A medical Hindi model is taught to say “Hindi” every time, whatever it hears.
There is an honest nuance. Probing a Whisper encoder after English and multilingual medical fine-tuning, Kahali et al. found language identity still almost perfectly linearly separable (F1 ≥ 0.99 from the first layer on) (Kahali et al., 2026). The knowledge survives in the encoder. What degrades is the decoder’s one-token read-out of it, which is exactly what a dedicated classifier replaces.
Why this makes an external LID mandatory
Every standard fix for forgetting moves the language decision outside the model. Language-specific LoRA modules must be selected by language (Song et al., 2024). MMS adapters are loaded by language. A fleet of domain models (medical Hindi, legal Tamil, agricultural Marathi) is routed by language. Specialization does not merely weaken built-in LID. It makes an external LID a requirement, and one well-built LID can then serve the entire fleet.
A fleet of domain recognisers, medical Hindi to agricultural Marathi, is routed by language. One well-built identifier serves the whole fleet; without it, every specialist must guess from a language slot it was fine-tuned to keep constant.
The systems case, strongest first
Theory and linguistics explain why built-in LID is weak. The engineering reasons to decouple it are just as strong, and for anyone building voice agents they are the ones that bite first. In order of importance:
1. Voice agents need the language before the transcript
A voice agent chooses its TTS voice, its LLM prompt and its reply language from the caller’s language, and it has roughly 800 ms before a conversation starts to feel slow (WebRTC.ventures, 2026). Vendor LID was not built for that budget: AWS streaming needs at least one second of speech, Azure’s at-start mode returns “in less than 5 seconds”, AWS batch recommends 30 seconds, AssemblyAI 15–90 seconds and Speechmatics 60 (AWS; Azure; AssemblyAI; Speechmatics). Builders end up hand-rolling the component: one LiveKit user’s workaround was to listen to the “first 3 seconds… and detect with whisper” before locking the session (livekit/agents #1335). When the language silently defaults, everything downstream is corrupted: a Pipecat integration “labels every transcript it produces as Hindi, regardless of what language was actually spoken” (pipecat #5691).
2. Short clips break the 30-second design
Whisper pads every input to 30 seconds, so a one-second “haan” costs a full 30-second encoder pass, and WhisperX warns that for shorter audio “language detection may be inaccurate” (asr.py). Classic LID research has always known that duration is the enemy: x-vector cost nearly triples from 30 s to 3 s clips (Snyder et al., 2018). Real turns are one to three seconds long. A dedicated model can be trained for them, with duration cropping as its most valuable single augmentation.
3. An honest “none of these”
A language token lives in a closed set. Whisper’s detector masks every non-language logit and takes the argmax of what remains (decoding.py). Vendors say the same about their own systems. Azure: “The Speech service returns one of the candidate languages provided even if those languages weren’t in the audio.” AWS: English audio offered Chinese, French and German candidates “is likely to match your media to German… and produce a German-language transcription.” A standalone model can be trained and evaluated open-set, with rejection as a first-class output.
4. A confidence you can act on
Implicit LID often hides its decision entirely. NVIDIA’s Indic ASR service “supports automatic language detection but does not produce detected language code in output” (NVIDIA NIM). Where vendors do expose it, they bolt on thresholds: AssemblyAI’s language_confidence_threshold, Speechmatics’ low_confidence_action. The LID community, by contrast, has always scored calibration explicitly through NIST’s Cavg (Lee et al., 2023). A calibrated probability is what lets an agent say “sorry, which language would you prefer?” instead of confidently answering in the wrong one.
5. Routing and throughput, stated precisely
It is tempting to claim that built-in LID ruins batching. For Whisper-style models it does not: the language is a per-sequence prompt token, and Hugging Face has supported a different language per batch item since v4.41 (PR #29688). The real costs are three.
- Weight-routed models need the language before they run. MMS swaps per-language adapters; language-specific LoRA must be selected; IndicConformer’s API takes one language per call; fleets of per-language models split by construction. None can detect the language for itself.
- Built-in detection is not free.
openai-whisperencodes the first window once to detect the language and again to decode it, and a low-confidence decode triggers temperature fallback: up to six re-decodes, each re-running the encoder (transcribe.py). - Decode length depends on the language. On parallel text, Whisper’s tokenizer needs about 6× as many tokens for Hindi and Tamil as for English, and 9–13× for Bengali, Punjabi, Malayalam and Gujarati (our measurement). In static batches those sequences become stragglers, and the token cap forces shorter Indic windows (the Adalat AI story above).
An upstream LID fixes all three: it routes to the right weights, buckets traffic by language, and sets the chunking policy per script.
The numbers
| Language | Tokens relative to English |
|---|---|
| Gujarati | 12.90× |
| Malayalam | 11.36× |
| Punjabi | 10.63× |
| Bengali | 9.69× |
| Kannada | 8.91× |
| Marathi | 6.39× |
| Hindi | 6.10× |
| Tamil | 6.03× |
| Nepali | 5.04× |
| Urdu | 3.11× |
| Russian | 1.77× |
| French | 1.61× |
| German | 1.48× |
| Spanish | 1.48× |
| English | 1.00× |
Whisper tokens needed for the same text, relative to English. Indian languages pay three to thirteen times over; Gujarati, Malayalam and Punjabi more than tenfold. Measured on the parallel Universal Declaration of Human Rights texts with Whisper’s multilingual tokenizer.
6. Every multilingual corpus is gated by an LID
Whisper’s own data was filtered by a separate audio language detector (Radford et al., 2023, §2.1). OWSM v4 found YODAS riddled with “incorrect language labels” and cleaned it before training (Peng et al., 2025). NVIDIA’s Granary runs Whisper twice, “first for language ID prediction, then for transcription”, and drops clips below 0.8 LID probability (Koluguri et al., 2025). YODAS itself reports that its attempts at language identification “are not significantly successful” (Li et al., 2023). For the eight scheduled languages Whisper cannot even name, Whisper cannot be that gate. An Indic LID is infrastructure for building the next Indic recogniser.
7. Cost and the edge
Routing, analytics, moderation and dataset filtering need the language, not the transcript. Running a 1.55-billion-parameter encoder–decoder for that is like hiring a translator to tell you which language a letter is in. Dedicated LIDs are small by comparison, from ECAPA-TDNN (21M) and AmberNet (29M) to Anuvani-LID (115.6M, and 84M in its 12-block form).
8. The language token is an attack surface
A universal 0.64-second audio segment can mute Whisper on more than 97% of inputs (Raina et al., 2024), and attacks aimed only at the language detector wreck transcription (Olivier & Raj, above). An independent audio LID, cross-checked against a text LID on the transcript, is a cheap second opinion that data pipelines already use.
9. Upgrades should not silently change routing
When LID lives inside the recogniser, every recogniser upgrade is also a routing change, as the large-v2 to large-v3 regressions showed. Commercial APIs change between versions too; our paper records the exact snapshots it queried for that reason. A standalone LID is benchmarked, versioned and rolled back on its own schedule.
Introducing Anuvani-LID
This is why we built Anuvani-LID: a dedicated spoken language identifier for the 22 scheduled languages of India and English. It is a 115.6M-parameter self-supervised Conformer, fine-tuned on 54,643 hours of speech from 18 corpora (31.24 million utterances), and it makes one decision, well: which of 23 languages is this?
The model
Audio becomes 80-band log-Mel features (25 ms windows, 10 ms hop), subsampled four-fold to 40 ms frames. These feed the 17 Conformer blocks of AI4Bharat’s MahaDhwani encoder (Gulati et al., 2020; Bhogale et al., 2025), pre-trained without labels on 279,000 hours of Indian audio. Instead of reading only the last block, the head reads all of them through learned weights:
Attentive statistics pooling turns those frames into a 1,024-dimensional mean-and-deviation vector, projected to a 256-dimensional embedding and a 23-way classifier, trained end to end with focal loss (γ = 2) and label smoothing of 0.1. The recipe came out of a six-stage controlled study: temperature sampling at T = 1.75 with floors for English (16%) and Hindi (11%); a competence curriculum over the confusable Indo-Aryan cluster; speed perturbation, MUSAN noise, room impulses, 8 kHz µ-law codec simulation, one-to-six-talker babble and bimodal crops from 0.25 to 16 seconds; AdamW for 425,000 steps on six RTX A6000 GPUs (about three days); and a uniform soup of seven checkpoints, chosen from 31 candidates. At inference, a single temperature (0.674) calibrates the probabilities.
Audio becomes 80-band log-Mel frames and climbs 17 Conformer blocks. The head reads all 17 through learned weights, pools the frames into a 1,024-dimensional mean-and-deviation vector, projects it to a 256-dimensional embedding and decides among 23 languages with a focal-loss classifier. Beside it, the recipe that came out of the six-stage study.
How we tested it
On clean, in-domain speech, every head we tried in our first pilot reached about 98% accuracy within a point of the others. The benchmark had saturated, so we rebuilt the ruler first (Geirhos et al., 2020; Kiela et al., 2021).
- SUITE-102 has 102 conditions and 318,861 utterances. Its headline tier is the IndicVoices test set: 300 spontaneous utterances per language from 1,308 speakers, none of whom appear in training. Cross-corpus tiers come from FLEURS, SPRING-INX, MUCS, Kathbath and Common Voice. Each source is expanded into crops from 0.25 to 10 seconds, noise at 0 and 5 dB, reverberation, 8 kHz telephony, babble, confusable-cluster subsets and open-set trials (music, eight non-Indian languages and Chhattisgarhi, a close relative of Hindi outside our label set).
- SUITE-42 is a balanced panel of 42 of those conditions for comparing commercial systems: 47,730 identical clips on 37 core conditions over the ten languages every system supports, plus 17,229 clips on an all-23 panel. Prompted APIs were given the list of candidate languages, which favours them; Anuvani-LID always chose among all 23.
How we built it: six stages, in order
The recipe beside Figure 13 was not designed in one sitting. It is what was left standing after a benchmark and six stages of controlled experiments, run in order, each starting from the recipe the stage before it had settled. Stages I to V ran at reduced scale, 1,000 to 4,000 hours, so that many arms were affordable. Stage VI trained the final recipe once, on all 54,643 hours.
| Stage | Data (classes) | Arms | What it settled |
|---|---|---|---|
| 0 · Benchmark | — | — | A held-out suite with many axes |
| I · Head, loss and adaptation | 1,000 h, balanced (20) | 25 | Attentive statistics pooling, focal loss, full fine-tuning |
| II · Rebalancing | 4,000 h, production skew (23) | 16 | T ≈ 2; one rebalancer, not two; a learned mix of all layers |
| III · Augmentation | 4,000 h, production skew (23) | 8 | Duration crops, noise, room impulses, codec, babble |
| IV · Curriculum | 4,000 h, production skew (23) | 5 | A confusability ramp on the 15 Indo-Aryan languages |
| V · Optimisation | 4,000 h proxy (23) | 15 | Peak learning rate 3 × 10−4; T = 1.75 with floors for English and Hindi |
| VI · Full scale | 54,643 h (23) | 1 run, 31 candidates | An exponential moving average; an average of seven checkpoints |
Three rules held from the first stage to the last.
- One factor at a time, where the arms allow it. Most arms change one thing against a fixed reference, and the data, the budget and the benchmark stay frozen for the whole stage, so a difference between two arms has one explanation. Where an arm changed more than one thing, the stage says so.
- The benchmark decides, not the training curve. Every arm is scored once, after training, on a benchmark of hard conditions: other corpora, short crops, noise, reverberation, telephony, confusable clusters. Not all of it is held out from training, and each stage says where it is not. The curves below show how each run behaved. They do not rank the arms, and Stage I shows why.
- A difference must clear the noise. Training is not deterministic. In Stage II, two runs with the same configuration finished 3.2 points apart in cross-corpus macro-F1. Stages I to V trained one run per arm, so we read every comparison against that figure: a gap of less than about three points between two runs is a tie, unless the same sign across many conditions or a second seed says otherwise. A significance test on the benchmark’s clips cannot say otherwise: it measures how firmly the clips separate two checkpoints, not how far a checkpoint moves when training is repeated.
In the charts that follow, a faint line is what the trainer logged, one batch every 50 steps, and the solid line over it is its running mean. Point at a chart to read every series at that step; the panels of a figure move together. A key in the legend hides or shows its series, and every figure keeps its numbers in a table underneath.
Stage 0A ruler that can rank
first sweep: 1,000 h · 20 languages · 4 epochs · five heads scored on five slices of the rebuilt benchmark
The first sweep taught us nothing about architecture, and that was its result. Five pooling heads, trained for four epochs on the same 1,000 hours, ended between 0.976 and 0.985 accuracy on clean validation speech (Figure 14, top). Their training curves lie on top of one another. A benchmark on which everything scores 98% cannot say which design to carry forward.
So, with the sweep paused, we scored the five finished checkpoints on slices built to be hard: speech from IndicVoices, a corpus the 1,000-hour subset did not contain; subsets of confusable languages; and crops of one second and of half a second (Figure 14, bottom). Macro-F1 fell from 0.88–0.90 on the clean benchmark to 0.79–0.80 on the new corpus, 0.43–0.48 at one second and 0.18–0.23 at half a second. The order changed as well: the ECAPA-TDNN head, first on clean validation, was last on every hard slice. With one run per head those gaps are inside the noise, and we did not read a ranking into them. What the gauge established is that hard conditions pull models apart and clean ones do not. The suite grew from these slices into the 54 conditions that score Stage I, and by Stage VI into the 102 of SUITE-102.
Training accuracy
| step | Attentive statistics | Mean and deviation | Multi-head attention | NetVLAD | ECAPA-TDNN |
|---|---|---|---|---|---|
| 74 | 0.057 | 0.063 | 0.144 | 0.121 | 0.166 |
| 1,974 | 0.918 | 0.930 | 0.943 | 0.950 | 0.940 |
| 4,024 | 0.965 | 0.970 | 0.971 | 0.975 | 0.968 |
| 5,974 | 0.978 | 0.983 | 0.980 | 0.985 | 0.979 |
| 8,024 | 0.984 | 0.989 | 0.986 | 0.990 | 0.986 |
| 9,974 | 0.984 | 0.988 | 0.988 | 0.991 | 0.989 |
| 12,024 | 0.987 | 0.990 | 0.992 | 0.991 | 0.991 |
| 13,949 | 0.986 | 0.989 | 0.991 | 0.990 | 0.990 |
Clean validation accuracy
| step | Attentive statistics | Mean and deviation | Multi-head attention | NetVLAD | ECAPA-TDNN |
|---|---|---|---|---|---|
| 3,507 | 0.969 | 0.968 | 0.963 | 0.963 | 0.973 |
| 7,014 | 0.967 | 0.974 | 0.979 | 0.970 | 0.972 |
| 10,521 | 0.980 | 0.976 | 0.981 | 0.973 | 0.982 |
| 14,028 | 0.983 | 0.976 | 0.984 | 0.977 | 0.985 |
Faint: the accuracy of one logged batch. Solid: its running mean. The validation axis starts at 0.95.
The numbers
| Head | Clean validation accuracy | Clean benchmark | A corpus not in training | Confusable languages | Crops of 1 s | Crops of 0.5 s |
|---|---|---|---|---|---|---|
| Attentive statistics | 0.983 | 0.888 | 0.798 | 0.791 | 0.467 | 0.210 |
| Mean and deviation | 0.976 | 0.895 | 0.802 | 0.792 | 0.476 | 0.226 |
| Multi-head attention | 0.984 | 0.899 | 0.794 | 0.784 | 0.436 | 0.189 |
| NetVLAD | 0.977 | 0.889 | 0.802 | 0.792 | 0.473 | 0.213 |
| ECAPA-TDNN | 0.985 | 0.882 | 0.786 | 0.779 | 0.427 | 0.181 |
On clean speech every head looks the same; on hard speech none of them looks good. Top: five pooling heads trained on the same 1,000 h end between 0.976 and 0.985 accuracy on clean validation, and their training curves coincide. Bottom: the same five checkpoints scored on slices of the rebuilt benchmark. Macro-F1 falls from 0.88–0.90 on the clean benchmark to 0.18–0.23 on half-second crops, and the head that led on clean validation is last on every hard slice. Training logs (Weights & Biases) and the benchmark scorecard of the first sweep.
The learning rate had been settled before that first sweep began. Fine-tuning recipes often give a new head a larger rate than the pre-trained encoder beneath it (Howard & Ruder, 2018). A 1,500-step probe compared that recipe, a head rate ten times the encoder’s, with a single rate of 10−4 for everything, on three heads of increasing size. It did not help the larger heads it was meant to help: NetVLAD reached 0.982 with one rate and 0.980 with two. Three of the six runs ended at chance with a NaN loss, so the probe is weaker evidence than it looks, and it was not repeated after the loss was fixed. We kept the simpler setting: one learning rate for the whole network.
Stage IHead, loss and adaptation: what reads the encoder, and how much of it to train
1,000 h, balanced · 20 languages · 25 arms · 4 epochs each · one run per arm · scored on 54 conditions
Stage I asked three questions about what sits on top of the encoder: how to pool frames into one vector, which loss to train with, and how much of the encoder to adapt. The reference was attentive statistics pooling, an additive-angular-margin loss and full fine-tuning, and the pooling and loss arms each changed one of those. All of them trained on the same 1,000-hour subset of 20 languages, built to give each a similar share (27 to 53 hours; Kashmiri, Santali and Sindhi had too little audio), under one budget: four epochs, 14,028 steps of 144 utterances, AdamW (Loshchilov & Hutter, 2019) with cosine decay, at a peak learning rate of 10−4 for every arm that trains the whole network and 3 × 10−4 or 10−3 for the arms that train less of it. Twenty-five arms were scored on the 54-condition predecessor of SUITE-102. Its cross-corpus slice pools 10,755 clips from four corpora; one of them, Kathbath, also supplied a fifth of the training audio, and its clips in the slice come from its validation split.
The pooling arms were mean and standard deviation (Snyder et al., 2018), multi-head attentive pooling (after India, Safari & Hernando, 2019), NetVLAD (Arandjelović et al., 2016), an ECAPA-TDNN back-end (Desplanques et al., 2020) and attentive statistics pooling (Okabe et al., 2018) over a learned mix of all 17 layers (Yang et al., 2021). The loss arms were cross-entropy, with and without label smoothing (Szegedy et al., 2016), AM-Softmax (Wang et al., 2018), logit-adjusted cross-entropy (Menon et al., 2021) and focal loss (Lin et al., 2017). The adaptation arms froze the encoder, unfroze its top six blocks, or trained bottleneck adapters (Houlsby et al., 2019) or LoRA (Hu et al., 2022) inside a frozen encoder. Eleven further arms put an ECAPA-TDNN back-end on a layer mix, with a layer norm before it, and varied its width, its loss and its training data; these change several things at once against the reference.
The macro-F1 axis starts at 0.79. An arrow marks an arm below it. Cosine-margin heads were scored on their raw cosines, without the scale of 30 they trained with.
The numbers
| Arm | Cross-corpus | 95% interval | Clean | Degraded | Short | Confusable | ECE |
|---|---|---|---|---|---|---|---|
| Mean and deviation | 0.828 | 0.821–0.835 | 0.903 | 0.773 | 0.442 | 0.861 | 0.791 |
| Multi-head attention | 0.825 | 0.818–0.832 | 0.905 | 0.774 | 0.415 | 0.859 | 0.789 |
| NetVLAD | 0.834 | 0.827–0.840 | 0.901 | 0.785 | 0.440 | 0.863 | 0.790 |
| ECAPA-TDNN back-end | 0.827 | 0.821–0.833 | 0.892 | 0.772 | 0.430 | 0.855 | 0.774 |
| Attentive, on all 17 layers | 0.837 | 0.829–0.842 | 0.905 | 0.789 | 0.444 | 0.870 | 0.789 |
| Cross-entropy | 0.836 | 0.829–0.844 | 0.899 | 0.772 | 0.413 | 0.869 | 0.060 |
| Cross-entropy, label smoothing | 0.836 | 0.829–0.842 | 0.900 | 0.782 | 0.453 | 0.866 | 0.082 |
| AM-Softmax | 0.838 | 0.831–0.845 | 0.902 | 0.781 | 0.410 | 0.867 | 0.791 |
| Logit-adjusted cross-entropy | 0.826 | 0.818–0.833 | 0.885 | 0.765 | 0.405 | 0.863 | 0.072 |
| Focal, γ = 2 (selected) | 0.840 | 0.833–0.848 | 0.884 | 0.767 | 0.407 | 0.871 | 0.023 |
| Top six blocks | 0.806 | 0.797–0.814 | 0.906 | 0.731 | 0.406 | 0.845 | 0.753 |
| Bottleneck adapters | 0.822 | 0.815–0.828 | 0.898 | 0.757 | 0.404 | 0.849 | 0.792 |
| LoRA | 0.821 | 0.814–0.828 | 0.890 | 0.758 | 0.405 | 0.854 | 0.793 |
| Frozen encoder | 0.362 | 0.353–0.371 | 0.584 | 0.253 | 0.178 | 0.408 | 0.354 |
| ECAPA: All layers, margin loss | 0.833 | 0.827–0.840 | 0.910 | 0.776 | 0.461 | 0.864 | 0.771 |
| ECAPA: All layers, margin loss, 512 channels | 0.834 | 0.827–0.840 | 0.901 | 0.780 | 0.455 | 0.866 | 0.774 |
| ECAPA: Focal, γ = 2 | 0.828 | 0.821–0.834 | 0.901 | 0.774 | 0.454 | 0.857 | 0.037 |
| ECAPA: Focal, γ = 1 | 0.829 | 0.822–0.835 | 0.905 | 0.773 | 0.455 | 0.856 | 0.066 |
| ECAPA: Focal, γ = 3 | 0.823 | 0.815–0.829 | 0.896 | 0.768 | 0.456 | 0.857 | 0.028 |
| ECAPA: Class-balanced focal | 0.828 | 0.821–0.835 | 0.897 | 0.769 | 0.456 | 0.858 | 0.042 |
| ECAPA: Focal, 512 channels | 0.830 | 0.822–0.836 | 0.900 | 0.773 | 0.457 | 0.864 | 0.039 |
| ECAPA: Focal on a margin | 0.835 | 0.828–0.841 | 0.905 | 0.781 | 0.463 | 0.866 | 0.776 |
| ECAPA: Focal, top six blocks | 0.815 | 0.806–0.822 | 0.904 | 0.748 | 0.435 | 0.854 | 0.035 |
| ECAPA: Focal, duration crops | 0.835 | 0.829–0.841 | 0.897 | 0.780 | 0.496 | 0.859 | 0.021 |
| ECAPA: Focal, distilled to 1 s | 0.734 | 0.725–0.742 | 0.841 | 0.632 | 0.502 | 0.775 | 0.128 |
Twenty-five arms around one reference. Cross-corpus macro-F1 is drawn with 95% bootstrap intervals over 10,755 clips: the five pooling heads span 0.825 to 0.837 and their intervals overlap; the frozen encoder, the distilled student and the two arms that unfreeze only the top six blocks fall furthest behind. Calibration error, on a log scale, splits by the kind of head: 0.75 to 0.79 for the fine-tuned cosine-margin heads, which the benchmark scored on their raw cosines, so that no clip was given more than 0.123 confidence; 0.02 to 0.08 for softmax heads, scored as trained (0.13 under distillation). Focal loss with attentive pooling has the highest macro-F1 (0.840) and an ECE of 0.023. Anuvani-LID paper, Figure 4; confidence from the predictions saved with each scorecard.
Pooling matters little. Under the margin loss the five pooling choices land between 0.825 and 0.837 cross-corpus macro-F1, and their intervals overlap (Figure 15). At this scale a more elaborate head buys nothing that can be measured.
Only the softmax heads were scored as probabilities. A cosine-margin head outputs a cosine between −1 and 1 for each language; in training the loss multiplies it by a scale of 30. The benchmark scored the cosines as they came, without that scale. Over 20 languages no clip then received a confidence above 0.123, while 84% to 88% of clips were right, so every fine-tuned margin head shows a calibration error of 0.75 to 0.79: the gap between the two. That number describes how the heads were scored, not how well they can be calibrated, which this stage did not measure. The softmax heads were scored as they trained, and reach 0.02 to 0.08, and 0.13 under distillation. Among them, with attentive pooling, focal loss has an ECE of 0.023, 2.6 times lower than cross-entropy’s, in line with Mukhoti et al., 2020, and the highest macro-F1 of all 25 arms (0.840). It costs no parameters and no compute: the network is the reference network with its objective changed and its last layer an ordinary softmax layer.
The accuracy ranking is inside the noise. Focal loss leads AM-Softmax (0.838) and cross-entropy (0.836) by 0.2 to 0.4 points, with one run each, against a run-to-run spread of about three. On accuracy alone we could not have chosen. Metrics also disagree: the arm that reads all 17 layers classifies 1.1% more clips correctly than the focal arm, although its macro-F1 is lower. So we kept both ideas, focal loss now, for a head whose confidence can be read as it comes and is the best calibrated of those, and the layer mix as a lever to test again at larger scale.
The encoder must be fine-tuned. A frozen encoder reaches only 0.362, the one gap among the adaptation arms that dwarfs the noise. Unfreezing the top six blocks reaches 0.806, adapters 0.822 and LoRA 0.821, each a little behind full fine-tuning; like the reference, each is a margin head, scored the same way. These arms also trained at a higher learning rate, so they are not a pure test of how much to adapt. The whole network trains.
A bigger back-end is not a better one. Given focal loss, the ECAPA-TDNN back-ends are softmax heads too, but the best of the eleven reaches 0.835 cross-corpus macro-F1, below attentive pooling with focal loss, for 23 million more parameters. Focal loss and the back-end do not add up: with focal loss the back-end scores 0.828, with the margin loss 0.833, and neither reaches 0.840. All of it is inside the noise.
Training accuracy
| step | Focal, γ = 2 | Cross-entropy | All 17 layers, margin loss | LoRA | Top six blocks | Frozen encoder |
|---|---|---|---|---|---|---|
| 74 | 0.074 | 0.067 | 0.055 | 0.151 | 0.093 | 0.099 |
| 1,974 | 0.907 | 0.922 | 0.950 | 0.891 | 0.933 | 0.826 |
| 4,024 | 0.958 | 0.971 | 0.977 | 0.945 | 0.969 | 0.902 |
| 5,974 | 0.973 | 0.975 | 0.986 | 0.957 | 0.980 | 0.928 |
| 8,024 | 0.980 | 0.983 | 0.992 | 0.974 | 0.986 | 0.940 |
| 9,974 | 0.976 | 0.984 | 0.991 | 0.975 | 0.986 | 0.944 |
| 12,024 | 0.982 | 0.988 | 0.991 | 0.983 | 0.989 | 0.948 |
| 13,949 | 0.982 | 0.987 | 0.992 | 0.980 | 0.987 | 0.951 |
Clean validation accuracy
| step | Focal, γ = 2 | Cross-entropy | All 17 layers, margin loss | LoRA | Top six blocks | Frozen encoder |
|---|---|---|---|---|---|---|
| 3,507 | 0.969 | 0.961 | 0.965 | 0.902 | 0.976 | 0.738 |
| 7,014 | 0.970 | 0.976 | 0.968 | 0.939 | 0.987 | 0.797 |
| 10,521 | 0.975 | 0.982 | 0.973 | 0.942 | 0.989 | 0.822 |
| 14,028 | 0.977 | 0.984 | 0.977 | 0.941 | 0.990 | 0.826 |
Faint: the accuracy of one logged batch. Solid: its running mean. The validation axis starts at 0.7.
The numbers
| Arm | Clean validation accuracy | Benchmark: cross-corpus macro-F1 |
|---|---|---|
| Focal, γ = 2 | 0.977 | 0.840 |
| Cross-entropy | 0.984 | 0.836 |
| All 17 layers, margin loss | 0.977 | 0.837 |
| LoRA | 0.941 | 0.821 |
| Top six blocks | 0.990 | 0.806 |
| Frozen encoder | 0.826 | 0.362 |
Curves separate the frozen encoder from everything else, and little more. Every arm that fine-tunes the whole encoder ends between 0.97 and 0.99 on clean validation. Unfreezing only the top six blocks gives the third-highest clean validation accuracy of all 25 arms (0.990) and the third-lowest cross-corpus score on the benchmark (0.806). Training logs (Weights & Biases).
Figure 16 is why the benchmark, not the curve, ranks the arms. On clean validation every arm that fine-tunes the whole encoder ends between 0.97 and 0.99, and where the order is not flat it misleads. The two arms that unfreeze only the top six blocks have the highest and the third-highest clean validation accuracy of all 25, 0.992 and 0.990. On the benchmark’s cross-corpus slice they rank 22nd and 23rd. The curves earn their place for one thing: they show at a glance that a frozen encoder is not a contender, and that nothing diverged.
IndicVoices crops
| position | Focal, γ = 2 (selected) | Cross-entropy, label smoothing | All 17 layers, margin loss | ECAPA, all layers | ECAPA, focal, duration crops | ECAPA, focal, distilled to 1 s |
|---|---|---|---|---|---|---|
| 0.25 s | 0.075 | 0.106 | 0.102 | 0.080 | 0.092 | 0.152 |
| 0.5 s | 0.192 | 0.266 | 0.247 | 0.242 | 0.282 | 0.324 |
| 1 s | 0.432 | 0.503 | 0.500 | 0.490 | 0.523 | 0.506 |
| 2 s | 0.671 | 0.709 | 0.718 | 0.713 | 0.713 | 0.646 |
| 3 s | 0.775 | 0.797 | 0.802 | 0.787 | 0.784 | 0.706 |
FLEURS crops
| position | Focal, γ = 2 (selected) | Cross-entropy, label smoothing | All 17 layers, margin loss | ECAPA, all layers | ECAPA, focal, duration crops | ECAPA, focal, distilled to 1 s |
|---|---|---|---|---|---|---|
| 0.25 s | 0.120 | 0.144 | 0.133 | 0.128 | 0.151 | 0.224 |
| 0.5 s | 0.292 | 0.342 | 0.335 | 0.349 | 0.397 | 0.446 |
| 1 s | 0.602 | 0.644 | 0.649 | 0.635 | 0.675 | 0.647 |
| 2 s | 0.830 | 0.861 | 0.864 | 0.865 | 0.861 | 0.787 |
| 3 s | 0.913 | 0.933 | 0.933 | 0.931 | 0.915 | 0.826 |
Kathbath crops
| position | Focal, γ = 2 (selected) | Cross-entropy, label smoothing | All 17 layers, margin loss | ECAPA, all layers | ECAPA, focal, duration crops | ECAPA, focal, distilled to 1 s |
|---|---|---|---|---|---|---|
| 0.25 s | 0.122 | 0.145 | 0.152 | 0.141 | 0.188 | 0.368 |
| 0.5 s | 0.318 | 0.386 | 0.389 | 0.376 | 0.496 | 0.692 |
| 1 s | 0.660 | 0.695 | 0.711 | 0.721 | 0.779 | 0.885 |
| 2 s | 0.889 | 0.895 | 0.908 | 0.910 | 0.938 | 0.936 |
| 3 s | 0.944 | 0.951 | 0.959 | 0.958 | 0.972 | 0.939 |
The numbers (IndicVoices crops)
| Arm | 0.25 s | 0.5 s | 1 s | 2 s | 3 s |
|---|---|---|---|---|---|
| Focal, γ = 2 (selected) | 0.075 | 0.192 | 0.432 | 0.671 | 0.775 |
| Cross-entropy, label smoothing | 0.106 | 0.266 | 0.503 | 0.709 | 0.797 |
| All 17 layers, margin loss | 0.102 | 0.247 | 0.500 | 0.718 | 0.802 |
| ECAPA, all layers | 0.080 | 0.242 | 0.490 | 0.713 | 0.787 |
| ECAPA, focal, duration crops | 0.092 | 0.282 | 0.523 | 0.713 | 0.784 |
| ECAPA, focal, distilled to 1 s | 0.152 | 0.324 | 0.506 | 0.646 | 0.706 |
Between three seconds and a quarter of a second every arm loses most of its accuracy. The selected arm falls from 0.775 to 0.075 on IndicVoices crops. At one second the arm that reads all 17 layers (0.500) and label smoothing (0.503) lead the last-layer heads, and training on cropped clips helps a back-end by 3.6 points. Distilling to one-second clips wins below one second and loses above it. Benchmark scorecards of the six arms.
Short clips are a different problem. Clip length moves macro-F1 more than any design choice in the stage (Figure 17). On IndicVoices crops the selected arm falls from 0.775 at three seconds to 0.432 at one and 0.075 at a quarter of a second. At one second the focal arm is the weakest of the ten pooling and loss arms. Three things helped there, and all three return later in the programme. Reading all 17 layers reached 0.500 under the margin loss, where the last-layer margin heads score 0.45 to 0.48. Label smoothing reached 0.503, against 0.456 for plain cross-entropy. And training on cropped clips added 4.5 points at half a second and 3.6 at one second to the same back-end without crops, and nothing at three seconds, the mark of a model matched to its training lengths. Distilling a full-clip teacher into a student that sees one second led every arm at a quarter and at half a second on all three corpora, and at one second only on Kathbath, a corpus the model had trained on (0.885 against 0.660 for the selected arm). Above that it fell behind, and its cross-corpus macro-F1 fell to 0.734.
One language disappears. Macro-F1 over 20 classes can hide a class at zero. On IndicVoices the focal arm recalls 20% of Dogri clips, the best of any arm, and the mean-and-deviation arm recalls none: it calls 141 of 200 Dogri clips Punjabi. Dogri and Punjabi are close relatives, and the subset was built to give every language a similar share of the audio, so this is confusability, not scarcity. It is the thread Stage II picks up with sampling, and the layer analysis picks up again inside the network.
What Stage I settled. Attentive statistics pooling, focal loss with γ = 2, and full fine-tuning at a single learning rate. The ECAPA-TDNN back-end was dropped, more for engineering than for accuracy: it adds a second network to train, export and serve, and it did not win on the cross-corpus slice. It did help on short clips: without crops the fully fine-tuned back-ends score 0.454 to 0.463 on the benchmark’s short-clip slice, against 0.407 for the selected arm, and crops took one to 0.496. The cropped training data, which any head can use, came back in Stage III.
Stage IIRebalancing: how far to flatten a skewed pool
4,000 h in the production language mix · 23 languages · 16 arms · 1 epoch each, three at 2 · scored on 55 conditions
Stage I trained on a balanced subset, so it could say nothing about imbalance: its two arms built for a skewed pool had no skew to correct. The real pool is far from balanced. English has 13,039 hours and Dogri 478. Stage II therefore moved to a 4,000-hour replica of the pool as it was catalogued then, which keeps its skew (English is 35% of the replica’s audio, Dogri 0.5%), added the three languages Stage I had left out, and held the Stage I model fixed. One question remained: how far should training flatten that mix?
The standard tool is temperature sampling: draw language ℓ with probability pℓ ∝ nℓ1/T, where nℓ is its share of the pool (Arivazhagan et al., 2019; Conneau et al., 2020). At T = 1 languages are sampled as the data comes, at T = 2 by the square root of their size, and as T grows without bound, equally. We trained six temperatures for one epoch each, 15,123 steps of 144 utterances.
Macro-F1, by temperature
| position | Cross-corpus | Clean benchmark |
|---|---|---|
| T = 1 (as the data comes) | 0.890 | 0.923 |
| T = 1.5 | 0.916 | 0.944 |
| T = 2 | 0.919 | 0.946 |
| T = 3 | 0.916 | 0.947 |
| T = 5 | 0.915 | 0.945 |
| T = ∞ (uniform) | 0.898 | 0.922 |
F1 by resource tier
| position | Under 500 h (Dogri, Konkani) | 500 to 1,000 h (5) | 1,000 to 2,000 h (5) | Over 2,000 h (8) |
|---|---|---|---|---|
| T = 1 (as the data comes) | 0.742 | 0.940 | 0.937 | 0.949 |
| T = 1.5 | 0.902 | 0.950 | 0.963 | 0.939 |
| T = 2 | 0.930 | 0.949 | 0.968 | 0.935 |
| T = 3 | 0.953 | 0.947 | 0.973 | 0.930 |
| T = 5 | 0.959 | 0.940 | 0.980 | 0.922 |
| T = ∞ (uniform) | 0.932 | 0.929 | 0.965 | 0.887 |
F1 of two languages
| position | Dogri (478 h) | English (13,039 h) |
|---|---|---|
| T = 1 (as the data comes) | 0.499 | 0.987 |
| T = 1.5 | 0.813 | 0.934 |
| T = 2 | 0.886 | 0.906 |
| T = 3 | 0.921 | 0.959 |
| T = 5 | 0.956 | 0.898 |
| T = ∞ (uniform) | 0.914 | 0.842 |
T = 1 samples languages as the data comes; T = ∞ samples them equally. Bands are 95% bootstrap intervals. Tiers are by hours in the full training pool; a tier’s F1 is the mean over the languages of it that the clean benchmark scores. No axis starts at zero.
The numbers
| Temperature | Cross-corpus | Clean | Under 500 h | 500 to 1,000 h | 1,000 to 2,000 h | Over 2,000 h | Dogri | English |
|---|---|---|---|---|---|---|---|---|
| T = 1 (as the data comes) | 0.890 | 0.923 | 0.742 | 0.940 | 0.937 | 0.949 | 0.499 | 0.987 |
| T = 1.5 | 0.916 | 0.944 | 0.902 | 0.950 | 0.963 | 0.939 | 0.813 | 0.934 |
| T = 2 | 0.919 | 0.946 | 0.930 | 0.949 | 0.968 | 0.935 | 0.886 | 0.906 |
| T = 3 | 0.916 | 0.947 | 0.953 | 0.947 | 0.973 | 0.930 | 0.921 | 0.959 |
| T = 5 | 0.915 | 0.945 | 0.959 | 0.940 | 0.980 | 0.922 | 0.956 | 0.898 |
| T = ∞ (uniform) | 0.898 | 0.922 | 0.932 | 0.929 | 0.965 | 0.887 | 0.914 | 0.842 |
One knob, six settings. First panel: macro-F1 rises from T = 1 to T = 1.5 and is flat within 0.4 points from 1.5 to 5; cross-corpus peaks at T = 2 (0.919). Uniform sampling scored 0.898 here, but its identical twin scored 0.930, so the drop at that end is one run’s. Second panel: mean F1 of the languages in each resource tier on the clean benchmark. Under 500 h it scores two languages, Dogri and Konkani; they rise from 0.742 to 0.930 between T = 1 and T = 2, while the eight over 2,000 h slip from 0.949 to 0.935. Third panel: the largest language and the one that moves most. Anuvani-LID paper, Figure 5, with the clean benchmark and two languages added from the same scorecards.
A rise, then a plateau. Cross-corpus macro-F1 rises from 0.890 at T = 1 to 0.919 at T = 2 (Figure 18, first panel), and the clean benchmark rises with it. From 1.5 to 5 the curve is flat within 0.4 points, so the choice inside that range is not one the data can make. The rise is three points, at the edge of what one run can show. At the other end, uniform sampling scored 0.898 in this sweep; but it was trained twice, and the identical second run scored 0.930, above every temperature. Whether flattening all the way costs accuracy, this stage cannot say.
The mechanism is a trade. Raising the temperature moves accuracy from the large languages to the small ones (Figure 18, second panel). Between T = 1 and T = 2 the languages under 500 hours rise from 0.742 to 0.930 mean F1, while the eight languages above 2,000 hours slip from 0.949 to 0.935. The clean benchmark scores only two of the five smallest, Dogri and Konkani, and the rise is Dogri’s, from 0.50 to 0.89; Konkani stays at 0.97 to 0.99. Under uniform sampling the large languages fell to 0.887 in one run and held 0.930 in its identical twin, so that end of the trade is not established. The largest language pays most. English scores 0.987 as the data comes and 0.906 at T = 2 (Figure 18, third panel). That is one language in one run, and it wobbles from arm to arm, but the direction came back at full scale, and it is why the final recipe puts a floor under English and Hindi.
Tiers are by hours in the full training pool: eight languages over 2,000 h; under 500 h, the two of five that the clean benchmark scores, Dogri and Konkani. No F1 axis starts at zero.
The numbers
| Arm | F1, over 2,000 h | F1, under 500 h | Clean macro-F1 | ECE, cross-corpus |
|---|---|---|---|---|
| Focal, T = 1 (no rebalancing) | 0.949 | 0.742 | 0.923 | 0.045 |
| Sampler at T = 2, focal γ = 2 | 0.935 | 0.930 | 0.946 | 0.046 |
| Logit-adjusted loss, T = 1 | 0.918 | 0.921 | 0.938 | 0.009 |
| Class-balanced focal, T = 1 | 0.929 | 0.930 | 0.942 | 0.062 |
| Logit-adjusted loss on T = 2 | 0.859 | 0.945 | 0.911 | 0.035 |
| Class-balanced focal on T = 2 | 0.902 | 0.942 | 0.930 | 0.042 |
| Focal γ = 1, T = 2 | 0.927 | 0.951 | 0.947 | 0.033 |
| Focal γ = 3, T = 2 | 0.942 | 0.965 | 0.957 | 0.078 |
A loss can correct the prior, or the sampler can; not both. Alone, each lifts the two smallest languages the benchmark scores from 0.742 to above 0.92. Stacked on a sampler that has already flattened the mix, logit adjustment takes 7.6 points from the eight largest languages (0.935 to 0.859) and class-balanced focal 3.3. Focal strength changes little except calibration: γ = 3 raises ECE to 0.078. The paper reports the stacked arm by its two largest classes: in-domain macro-F1 falls 3.5 points, English from 0.906 to 0.699 F1 and Hindi from 0.713 to 0.344. Benchmark scorecards of the eight arms.
Rebalance once. A loss can correct for class frequency too. Logit adjustment adds the log prior to the logits (Menon et al., 2021); here it replaces focal loss with plain cross-entropy. The other arm weights each class in the focal loss by the inverse square root of its clip count, a simpler form of the class-balanced loss of Cui et al., 2019. Alone, either does the sampler’s job: with languages sampled as the data comes, logit adjustment matches temperature sampling on the four plain cross-corpus sets, 0.925 against 0.925 at T = 3, and is the best-calibrated arm of the stage, an ECE of 0.011 on the clean benchmark against 0.046 for plain focal loss at T = 1. Stacked on a sampler at T = 2 the prior is counted twice. In-domain macro-F1 falls 3.5 points and the two largest classes collapse, English from 0.906 to 0.699 F1 and Hindi from 0.713 to 0.344; across the eight largest languages logit adjustment costs 7.6 points, and class-balanced focal 3.3 (Figure 19). The sampler stays the one rebalancer.
Focal strength is not a lever. γ = 1, 2 and 3 are 1.1 points apart on the clean benchmark. On 47 of the 55 conditions the three differ by less than the 3.2 points that separated two identical runs; the other eight are all crops of one second or less, where the largest gap is 4.5 points. The paper reads the same runs as γ = 3 gaining 1.0 point on the four plain cross-corpus sets and 3.6 over the six one-second conditions: single runs, the first inside the 3.2-point floor and the second among the short crops where the three part. What does move for certain is calibration: γ = 3 raises ECE from 0.046 to 0.078. γ = 2 stays.
Training loss (log scale)
| step | Head reads all 17 layers | Head reads the last layer |
|---|---|---|
| 124 | 3.781 | 3.915 |
| 4,299 | 0.223 | 0.318 |
| 8,699 | 0.118 | 0.205 |
| 12,899 | 0.089 | 0.156 |
| 17,299 | 0.054 | 0.097 |
| 21,499 | 0.045 | 0.088 |
| 25,899 | 0.045 | 0.075 |
| 30,099 | 0.034 | 0.059 |
Clean validation accuracy
| step | Head reads all 17 layers | Head reads the last layer |
|---|---|---|
| 15,123 | 0.944 | 0.924 |
| 30,246 | 0.945 | 0.934 |
IndicVoices crops, macro-F1
| position | Head reads all 17 layers | Head reads the last layer |
|---|---|---|
| 0.25 s | 0.058 | 0.090 |
| 0.5 s | 0.252 | 0.256 |
| 1 s | 0.564 | 0.534 |
| 2 s | 0.816 | 0.790 |
| 3 s | 0.898 | 0.874 |
Faint: one logged batch. Solid: its running mean. Below, each point is the mean over the conditions of its family. No axis but the crop panel’s starts at zero.
The numbers
| Acoustic family | Conditions | Last layer | All 17 layers | Change, points |
|---|---|---|---|---|
| Clean benchmark | 1 | 0.958 | 0.967 | +0.9 |
| Undegraded, five sets | 5 | 0.940 | 0.955 | +1.5 |
| Noise at 5 dB | 4 | 0.892 | 0.912 | +2.0 |
| Noise at 0 dB | 4 | 0.866 | 0.884 | +1.8 |
| Reverberation | 4 | 0.900 | 0.916 | +1.6 |
| 8 kHz telephony | 4 | 0.902 | 0.930 | +2.8 |
| Babble | 4 | 0.784 | 0.790 | +0.7 |
At equal budget the head that reads all 17 layers trains to a lower loss. On the benchmark it raises clean macro-F1 from 0.958 to 0.967 and every acoustic family with it, telephony most (+2.8 points), and five of the six SPRING-INX conditions by 3.0 to 3.8 points. It loses on the shortest clips: 2.9 to 4.8 points on every condition at a quarter of a second. None of the family gains is larger than the three points two identical runs can differ by. Training logs (Weights & Biases) and benchmark scorecards.
The layer mix returns. Stage I had kept one idea in reserve: let the head read a learned mix of all 17 layers instead of the last one. Stage II tested it at equal budget, two epochs each, with that one setting changed (Figure 20). In-domain macro-F1 rose from 0.958 to 0.967 and every acoustic family improved: telephony by 2.8 points, noise by 1.9, reverberation by 1.6, babble by 0.7. Five of the six SPRING-INX conditions gained 3.0 to 3.8 points. None of the family gains clears three points alone. The shortest clips went the other way: every condition at a quarter of a second lost 2.9 to 4.8 points, and every one at half a second lost up to 3.5. We adopted the mix for the breadth of the gain on full-length speech, and because when the next stage trained the same recipe again as its baseline it scored 0.967 once more. The short clips were left to the next stage’s duration crops.
A second epoch helped as well, 0.946 to 0.958 on the clean benchmark with the same sign on every slice. We took the direction, that later screens should run two epochs, and did not claim the size.
What Stage II settled. Sample near T = 2; rebalance in the sampler and nowhere else; keep focal loss at γ = 2; read all 17 layers. And one rule that outlasted the stage: a result is not a result until it clears three points, or repeats.
Stage IIIAugmentation: train on the conditions you will be tested on
4,000 h replica of the pool · 23 languages · 8 arms: seven at 2 epochs, and a babble run of 65,000 steps against the full stack without babble · one run per arm
By the end of Stage II the model was strong on full-length clean speech and weak exactly where a deployed identifier works: on a second of audio, in noise, in a reverberant room, over a telephone line. Stage III asked which perturbations of the training audio close those gaps. One rule was fixed before any run: an augmentation earns its place if it lifts the conditions it imitates without lowering clean speech.
The Stage II recipe already perturbed its audio in two ways, and both stayed on in every arm: speed perturbation (Ko et al., 2015), and SpecAugment (Park et al., 2019), which masks bands of the spectrogram, two in frequency and ten in time. That recipe is the baseline. Each arm changed one thing against it, and the last stacked them. Additive noise comes from 930 MUSAN noise clips at 0 to 15 dB (Snyder et al., 2015) and reverberation from 60,000 simulated room impulse responses (Ko et al., 2017). A codec arm passes audio through 8 kHz µ-law telephony. A duration arm crops half of all clips to a random length. One arm softens SpecAugment, from ten time masks to two. The noise clips and the impulse responses are the same pools the benchmark’s noise and reverberation conditions were built from, so those two families measure robustness to sounds and rooms the model has heard in training, not to new ones.
The first screen collapsed, and taught two things. We first ran the ladder for one epoch per arm. Three of its six arms finished at exactly chance: validation accuracy 0.0435, one in 23, with a loss that was no longer a number within the first 300 steps. All three carried the reverberation perturbation, which divides the reverberated clip by its own peak. On a clip of pure digital silence that is zero divided by zero; one such clip makes the batch loss NaN, and the optimiser carries it into almost every weight. The trigger was inferred, not caught: no silent clip turned up among those checked, but injecting silent clips reproduced the collapse. The repair has three layers: perturbations that skip a degenerate clip and return it clean, a guard that zeroes the gradients of any step that produces a non-finite one, and tests that inject silent clips. The second lesson was harder to read. That screen’s SpecAugment arm widened the masks, to ten time masks of up to a tenth of a clip each, and ended its epoch at 0.825 validation accuracy against the baseline’s 0.933. Masks wide enough to blank a short clip, or one epoch too short for a regulariser to pay back its cost: the screen cannot separate the two. The ladder was run again with both changed, at two epochs, with the masks softened instead of widened, on the layer-mix model Stage II had just adopted.
Training loss (log scale)
| step | Baseline | Noise and room impulses | Duration crop | Full stack |
|---|---|---|---|---|
| 124 | 3.830 | 4.085 | 4.081 | 4.056 |
| 4,749 | 0.194 | 0.279 | ||
| 8,699 | 0.120 | 0.180 | ||
| 12,799 | 0.249 | 0.353 | ||
| 16,774 | 0.247 | 0.341 | ||
| 20,799 | 0.054 | 0.122 | ||
| 26,149 | 0.049 | 0.104 | 0.196 | 0.319 |
| 30,399 | 0.191 | 0.293 |
Training accuracy
| step | Baseline | Noise and room impulses | Duration crop | Full stack |
|---|---|---|---|---|
| 124 | 0.079 | 0.069 | 0.047 | 0.038 |
| 4,749 | 0.918 | 0.885 | ||
| 8,699 | 0.948 | 0.920 | ||
| 12,799 | 0.889 | 0.848 | ||
| 16,774 | 0.901 | 0.853 | ||
| 20,799 | 0.974 | 0.951 | ||
| 26,149 | 0.978 | 0.952 | 0.914 | 0.867 |
| 30,399 | 0.919 | 0.875 |
Macro-F1, by clip length
| position | Baseline | Noise and room impulses | Duration crop | Full stack |
|---|---|---|---|---|
| 0.25 s | 0.073 | 0.041 | 0.154 | 0.157 |
| 0.5 s | 0.303 | 0.267 | 0.398 | 0.410 |
| 1 s | 0.648 | 0.657 | 0.712 | 0.723 |
| 2 s | 0.869 | 0.881 | 0.898 | 0.905 |
| 3 s | 0.935 | 0.942 | 0.949 | 0.951 |
Faint: one logged batch. Solid: its running mean. The baseline is the Stage II recipe, which already perturbs speed and masks the spectrogram. Below, each point is one arm’s change against it; the figure beside each row is the full stack’s. The loss axis is logarithmic and the accuracy axis starts at 0.6.
The numbers
| Arm | Clean speech | Crops of 0.5 s | Crops of 1 s | Noise | Reverberation | 8 kHz telephony | Babble | Confusable languages |
|---|---|---|---|---|---|---|---|---|
| Baseline (macro-F1) | 0.962 | 0.303 | 0.648 | 0.894 | 0.919 | 0.933 | 0.792 | 0.979 |
| Softer SpecAugment (change, points) | +0.6 | +0.9 | +0.3 | +0.6 | +0.6 | −0.1 | +1.0 | +0.2 |
| Noise and room impulses (change, points) | −0.2 | −3.6 | +0.9 | +3.2 | +1.6 | +0.6 | +1.6 | −0.1 |
| 8 kHz codec (change, points) | +0.1 | +0.2 | +0.2 | +0.9 | +0.6 | +1.0 | +0.1 | +0.3 |
| Duration crop (change, points) | −0.3 | +9.5 | +6.4 | +1.3 | +1.2 | +0.4 | −0.5 | 0.0 |
| Full stack (change, points) | −0.4 | +10.7 | +7.5 | +3.8 | +2.0 | +1.2 | +2.0 | +0.2 |
The run that is hardest to train is the best on the benchmark. Top: with the full stack the training loss ends eight times higher and training accuracy ten points lower than the baseline’s, and macro-F1 on short crops rises at every length. Bottom: the change each arm makes, family by family. Duration crop moves the short crops (+9.5 points at 0.5 s), noise and room impulses move noise (+3.2), the codec moves telephony (+1.0), and the full stack keeps all three for 0.4 points of clean speech. Training logs (Weights & Biases); benchmark figures from the Anuvani-LID paper, Figure 6.
Each perturbation moves the axis it simulates. Duration cropping adds 9.5 points at half a second. Noise with room impulses adds 3.2 points in noise, and the codec adds 1.0 on telephony (Figure 21, bottom). Softening SpecAugment moves every family by 1.0 point or less, upward in all but one. The interactions matter as much. Alone, noise and reverberation cost 3.6 points at half a second; inside the stack, with cropping beside them, that cost is gone. The full stack gains 10.7 points at half a second, 7.5 at one second and 3.8 in noise for 0.4 points of clean speech, a price inside the noise floor.
The short-clip gains clear three points by a wide margin; the gains in noise, 3.2 and 3.8, sit at its edge. The three arms that crop were trained on a rebuilt copy of the replica after a storage move, so the comparison across that boundary is less clean than the one within it. The pattern is what we rely on: each arm’s largest gain falls on the family it was built for.
Training looks worse as the model gets better. The curves in Figure 21 run opposite to the benchmark. With the full stack the training loss ends about eight times higher than the baseline’s, training accuracy is 0.88 against 0.98, and clean validation accuracy is 0.935 against 0.949, though the two runs were validated on different copies of the replica. On the benchmark the same run is the best of the six ladder arms at every clip length. It is Stage I’s lesson again: a curve on the training distribution measures how hard the training data is, not how good the model is.
One arm was dropped on calibration. A consistency branch that pulls the predictions for two augmented views of a clip together added 2.0 points at half a second over the full stack, inside the noise, and doubled its calibration error, from 0.055 to 0.112. The stack had already raised it from the baseline’s 0.034, as cropping alone did.
What Stage III settled. Speed perturbation, MUSAN noise, room impulses, an 8 kHz codec, duration crops and babble, each applied to a share of the clips, and a softened SpecAugment on every clip.
Stage IVCurriculum: does the order of what the model hears matter?
4,000 h replica · 23 languages · 5 arms · 3 epochs each · one run per arm · scored on 87 conditions
Stages I to III fixed what the model sees. Stage IV asked whether the order in which it sees it adds anything (Bengio et al., 2009). We expected the largest return where the static recipe left the most error: on the confusable Indo-Aryan cluster, the weakest clean axis of Stage II at 0.909 macro-F1 on confusable pairs, and on input shorter than a second. A curriculum is a measure of difficulty and a schedule for moving along it. We kept one schedule, the competence schedule of Platanios et al., 2019, which carries an axis from its easy end to its hard end over the epochs, c(e) = min(1, √(e(1 − c02)/(N − 1) + c02)) with c0 = 0.2, and screened four measures of difficulty, each changing one axis of the Stage III recipe on the 4,000-hour replica for three epochs:
- Duration. Training crops shrink from 6.6 to 2.95 to 1.0 seconds, in place of the random crop. It inverts SortaGrad (Amodei et al., 2016): a short clip is easy for recognition but carries less evidence for identification.
- Resource. The sampling temperature rises from 1.2 to 2.0, so the large languages dominate early and the tail gains weight late; a reverse arm, from 1.8 to 1.0, controls for the direction.
- Confusability. The 15 Indo-Aryan languages enter at 0.36 of their sampled weight, rising to 0.78 and then 1.0, so the Dravidian, Tibeto-Burman and Austroasiatic languages and English are seen at full weight first and the cluster where most confusions arise is brought in gradually.
- Self-paced. Within each batch only the lowest-loss 68% of examples enter the loss, rising to all of them (Kumar, Packer & Koller, 2010).
Crops: mean macro-F1 over five corpora (Common Voice, FLEURS, Kathbath, MUCS and the all-23 test). All-23 test: IndicVoices, speakers held out. In-domain: the clean benchmark. No axis starts at zero, and each has its own range.
The numbers
| Arm | Schedule applied | Crops of 0.25 s | Crops of 0.5 s | Crops of 1 s | All-23 test | Clean benchmark |
|---|---|---|---|---|---|---|
| Duration, 6.6 to 1.0 s | yes | 0.257 | 0.517 | 0.768 | 0.896 | 0.941 |
| Self-paced, 68% to all | yes | 0.141 | 0.386 | 0.699 | 0.904 | 0.968 |
| Resource, T 1.2 to 2.0 | no | 0.176 | 0.430 | 0.727 | 0.928 | 0.974 |
| Reverse, T 1.8 to 1.0 | no | 0.170 | 0.422 | 0.726 | 0.927 | 0.970 |
| Confusability, 0.36 to 1 | no | 0.177 | 0.428 | 0.728 | 0.930 | 0.973 |
Ordering by duration is the only curriculum that changes the short clips: at half a second it scores 0.52 against 0.42 to 0.43, and at a quarter of a second 0.26 against 0.17 to 0.18. It pays on full-length speech, 0.896 on the all-23 test against 0.927 to 0.930. The self-paced gate adds nothing. In the last three arms the schedule never reached the sampler, so they are three runs of the unscheduled recipe, and the paper uses them as its baseline. Anuvani-LID paper, Stage IV; the arms’ scorecards.
Ordering by duration buys short clips, and pays for them. Against the unscheduled recipe trained for the same three epochs, it lifts mean macro-F1 over five corpora from 0.42–0.43 to 0.52 at half a second, and from 0.17–0.18 to 0.26 at a quarter of a second (Figure 22). No other curriculum comes close on short input. But by its last epoch every clip was cut to a second, and the model heard little full-length speech: the all-23 test falls from 0.927–0.930 to 0.896, and the clean benchmark from 0.970–0.974 to 0.941. The self-paced gate did not add to the unscheduled recipe, at 0.904 and 0.968.
Three arms could not answer their question. In the resource arm, its reverse and the confusability arm, the schedule never reached the sampler. The code that should have reweighted the sampler at each epoch had lost its handle to it, skipped the update and logged a warning, in every epoch of all three runs; static temperature sampling went on as before. They are three runs of the unscheduled recipe, and that is how the paper uses them: as the baseline the duration and self-paced arms are measured against. Nothing in this stage measured whether ramping the Indo-Aryan cluster helps.
Why the ramp was kept. The final recipe schedules the language mix, on the evidence of where the errors are rather than of a measured gain. Of the unscheduled recipe’s errors on the all-23 test, 65% to 66% are on Indo-Aryan languages. Of the four curricula, the confusability ramp is the one that acts on that cluster without moving a tuned setting. The bimodal crop of Stage III already gives the short-clip exposure of the duration curriculum while keeping long segments in every batch; the self-paced gate added nothing; and the resource curriculum would hold the temperature away from T = 2, where Stage II’s curve peaks, for most of training. The ramp changes which languages fill a batch as training proceeds, not how often each is drawn relative to its size; it returns to the tuned mix by the last sub-epoch and costs nothing at inference. Once the sampler was repaired, a pair of 65,000-step runs on the proxy, with the ramp and without it, ended at 0.952 and 0.953 development accuracy (Stage V): a tie. So the ramp stays as a low-regret choice. We do not count it as a measured gain.
Weight on the Indo-Aryan languages
| sub-epoch | Indo-Aryan weight, as applied |
|---|---|
| 1 | 1.000 |
| 3 | 0.520 |
| 6 | 0.667 |
| 8 | 0.743 |
| 10 | 0.809 |
| 12 | 0.869 |
| 15 | 0.951 |
| 17 | 1.000 |
Share of the samples, by family
| sub-epoch | Indo-Aryan, 15 languages | Dravidian, 4 | English, floor 16% | Tibeto-Burman, 2 | Austroasiatic, 1 |
|---|---|---|---|---|---|
| 1 | 0.573 | 0.212 | 0.160 | 0.039 | 0.016 |
| 3 | 0.451 | 0.299 | 0.172 | 0.055 | 0.023 |
| 6 | 0.502 | 0.269 | 0.160 | 0.049 | 0.020 |
| 8 | 0.521 | 0.253 | 0.160 | 0.047 | 0.019 |
| 10 | 0.537 | 0.241 | 0.160 | 0.044 | 0.018 |
| 12 | 0.549 | 0.231 | 0.160 | 0.042 | 0.017 |
| 15 | 0.565 | 0.219 | 0.160 | 0.040 | 0.016 |
| 17 | 0.573 | 0.212 | 0.160 | 0.039 | 0.016 |
One point per sub-epoch; the Indo-Aryan key switches both of its lines. The first sub-epoch drew the plain temperature mix, before the schedule took effect; the weight shown there is 1. Shares are of all samples drawn; Hindi, inside the Indo-Aryan share, is held at 11% throughout.
The numbers
| Sub-epoch | Indo-Aryan weight | Indo-Aryan | Dravidian | English | Tibeto-Burman | Austroasiatic |
|---|---|---|---|---|---|---|
| 1 | plain mix | 57.3% | 21.2% | 16.0% | 3.9% | 1.6% |
| 2 | 0.453 | 42.2% | 31.4% | 18.2% | 5.8% | 2.4% |
| 3 | 0.520 | 45.1% | 29.9% | 17.2% | 5.5% | 2.3% |
| 4 | 0.575 | 47.3% | 28.8% | 16.5% | 5.3% | 2.2% |
| 5 | 0.623 | 49.0% | 27.8% | 16.0% | 5.1% | 2.1% |
| 6 | 0.667 | 50.2% | 26.9% | 16.0% | 4.9% | 2.0% |
| 7 | 0.706 | 51.2% | 26.0% | 16.0% | 4.8% | 2.0% |
| 8 | 0.743 | 52.1% | 25.3% | 16.0% | 4.7% | 1.9% |
| 9 | 0.777 | 53.0% | 24.7% | 16.0% | 4.5% | 1.9% |
| 10 | 0.809 | 53.7% | 24.1% | 16.0% | 4.4% | 1.8% |
| 11 | 0.840 | 54.3% | 23.6% | 16.0% | 4.3% | 1.8% |
| 12 | 0.869 | 54.9% | 23.1% | 16.0% | 4.2% | 1.7% |
| 13 | 0.897 | 55.5% | 22.6% | 16.0% | 4.2% | 1.7% |
| 14 | 0.924 | 56.0% | 22.2% | 16.0% | 4.1% | 1.7% |
| 15 | 0.951 | 56.5% | 21.9% | 16.0% | 4.0% | 1.6% |
| 16 | 0.976 | 56.9% | 21.5% | 16.0% | 4.0% | 1.6% |
| 17 | 1.000 | 57.3% | 21.2% | 16.0% | 3.9% | 1.6% |
After a first sub-epoch on the plain temperature mix, the weight on the 15 Indo-Aryan languages rises from 0.45 to 1.0 along a square-root schedule. The Indo-Aryan languages go from 42% of the samples to 57%, the Dravidian four from 31% to 21% and English from 18% to 16%; by the last sub-epoch the mix is the plain one again. Anuvani-LID paper, Figure 7; shares from the run’s sampler on its training index, as the paper computes them.
At full scale the ramp spans the 17 sub-epochs of 25,000 steps that make up the 425,000-step run (Figure 23). The first sub-epoch drew the plain temperature mix, because the data workers start before the schedule is applied; from the second, the weight on the Indo-Aryan cluster rises from 0.45 to 1.0, on top of T = 1.75 and the floors of Stage V. In the first scheduled sub-epoch the Indo-Aryan languages take 42% of the samples, the Dravidian four 31% and English 18%; by the last, 57%, 21% and 16%, the plain mix again. Hindi is held at its 11% floor throughout. The run logged the schedule at every sub-epoch, and the shares drawn here reproduce every share it logged.
What Stage IV settled. The confusability ramp on the 15 Indo-Aryan languages, kept for where the errors are and for what it leaves alone. The short-clip gain of the duration curriculum is taken instead from Stage III’s bimodal crop, which keeps long segments in every batch.
Stage VOptimisation: a recipe for fourteen times the data
4,000 h proxy · 23 languages · 15 short probes, then seven 65,000-step runs · one run each
Everything so far was tuned on 4,000 hours or fewer. The full pool is 54,643 hours, about fourteen times the proxy. The proxy keeps every language’s share of the audio, so anything that depends on the mix carries over. What does not carry over is repetition: how many times training passes over the same clip. Stage V set the optimiser on the proxy and then asked which of its answers survive the change of scale. The proxy itself was drawn again from the final 54,643-hour pool, with the construction of Stage II, so that its language ratios are the pool’s.
Dev accuracy, by learning rate
| peak rate | After 1,200 steps |
|---|---|
| 3e-5 | 0.771 |
| 1e-4 | 0.839 |
| 3e-4 | 0.872 |
| 1e-3 | 0.876 |
Dev accuracy, by temperature
| T = | After 2,500 steps |
|---|---|
| 1.5 | 0.887 |
| 1.75 | 0.890 |
| 2 | 0.893 |
| 2.25 | 0.900 |
| 2.5 | 0.899 |
Dev accuracy, by warm-up
| warm-up | After 1,200 steps |
|---|---|
| 5% of the steps | 0.874 |
| 10% of the steps | 0.871 |
| 15% of the steps | 0.873 |
Each point is one short run. The learning-rate axis is logarithmic, with rates written as in the configuration: 3e-4 is 3 × 10⁻⁴. No vertical axis starts at zero, and the first spans three times the range of the other two.
The numbers
| Probe | Setting | Steps | Dev accuracy |
|---|---|---|---|
| Peak learning rate | 3 × 10⁻⁵ | 1200 | 0.7708 |
| Peak learning rate | 10⁻⁴ | 1200 | 0.8386 |
| Peak learning rate | 3 × 10⁻⁴ | 1200 | 0.8715 |
| Peak learning rate | 10⁻³ | 1200 | 0.8761 |
| Sampling temperature | 1.5 | 2500 | 0.8874 |
| Sampling temperature | 1.75 | 2500 | 0.8900 |
| Sampling temperature | 2.0 | 2500 | 0.8931 |
| Sampling temperature | 2.25 | 2500 | 0.8995 |
| Sampling temperature | 2.5 | 2500 | 0.8990 |
| Warm-up | 5% | 1200 | 0.8740 |
| Warm-up | 10% | 1200 | 0.8708 |
| Warm-up | 15% | 1200 | 0.8735 |
Only the learning rate has a slope worth following. From 3 × 10⁻⁵ to 10⁻³ development accuracy rises from 0.771 to 0.876, and the last step adds 0.5 points: the knee is at 3 × 10⁻⁴. Temperatures from 1.5 to 2.5 stay within 1.2 points and warm-ups from 5% to 15% within 0.3. Anuvani-LID paper, Stage V; the probe log.
Short probes find one knee. Twelve runs of 1,200 to 2,500 steps varied the learning rate, the temperature or the warm-up, one setting at a time, and three shorter ones checked the batch size. Peak learning rates from 3 × 10−5 to 10−3 gave development accuracies from 0.771 to 0.876 (Figure 24). We took the knee at 3 × 10−4: the last step up added only 0.5 points, and a rate past the knee puts the pre-trained encoder at risk for little return. Warm-ups of 5% to 15% of the steps were flat within 0.3 points and temperatures from 1.5 to 2.5 within 1.2, so those two were set on other grounds: the shortest warm-up, and a temperature chosen below.
Two learning rates, at length
| step | Rate 3e-4 | Rate 1e-4 |
|---|---|---|
| 5,000 | 0.891 | |
| 10,000 | 0.907 | |
| 15,000 | 0.922 | |
| 15,257 | 0.913 | |
| 25,257 | 0.941 | |
| 30,514 | 0.932 | |
| 45,771 | 0.943 | |
| 61,028 | 0.945 |
Three temperatures, no ramp
| step | T = 1.35 | T = 1.5 | T = 2 |
|---|---|---|---|
| 8,000 | 0.909 | 0.898 | 0.898 |
| 23,257 | 0.927 | 0.928 | 0.936 |
| 38,514 | 0.938 | 0.937 | 0.941 |
| 53,771 | 0.950 | 0.953 | 0.950 |
Four temperatures, with the ramp
| step | T = 1.5 | T = 1.75 | T = 2.33 | T = 3 |
|---|---|---|---|---|
| 8,000 | 0.892 | 0.912 | 0.898 | 0.904 |
| 23,257 | 0.926 | 0.924 | 0.939 | 0.938 |
| 38,514 | 0.943 | 0.942 | 0.942 | 0.941 |
| 53,771 | 0.952 | 0.952 | 0.945 | 0.946 |
Each point is one pass over the development set, as logged; a temperature run’s last is at step 53,771 of its 65,000. Rates are written as in the configuration: 3e-4 is 3 × 10⁻⁴. The ramp is Stage IV’s curriculum on the Indo-Aryan languages, applied in these runs. All vertical axes start at 0.88.
The numbers
| Run | Step 8,000 | Step 23,257 | Step 38,514 | Step 53,771 |
|---|---|---|---|---|
| T = 1.35, no ramp | 0.9091 | 0.9266 | 0.9377 | 0.9497 |
| T = 1.5, no ramp | 0.8982 | 0.9276 | 0.9365 | 0.9534 |
| T = 2, no ramp | 0.8981 | 0.9358 | 0.9409 | 0.9499 |
| T = 1.5, with the ramp | 0.8923 | 0.9260 | 0.9434 | 0.9518 |
| T = 1.75, with the ramp | 0.9118 | 0.9244 | 0.9417 | 0.9523 |
| T = 2.33, with the ramp | 0.8982 | 0.9389 | 0.9425 | 0.9452 |
| T = 3, with the ramp | 0.9037 | 0.9376 | 0.9410 | 0.9464 |
At three times the rate the model reaches 0.941 by step 25,000; at 10⁻⁴ it needs about 46,000 steps to reach 0.943, though the two runs also differ in schedule length and warm-up. The second and third panels follow seven temperatures over a full schedule. At the last evaluation, temperatures from 1.35 to 2 are within 0.4 points of each other; 2.33 and 3 are 0.5 to 0.7 below the runs at 1.5 and 1.75, and every run is still improving. The order at the end is not the order on the way: at step 23,000 the two highest temperatures lead every run from 1.35 to 1.75 by more than a point. Trainer logs (TensorBoard; Weights & Biases for the slower rate).
A short probe rewards whatever learns fastest. Two longer checks kept us honest (Figure 25). The first was consistent with the learning rate: a 30,000-step run at 3 × 10−4 reached 0.941 development accuracy by step 25,000, where an earlier 61,000-step run at 10−4, with a 10% warm-up, needed about 46,000 steps to reach 0.943. The two differ in schedule as well as rate, so this is a check, not a controlled comparison. The second re-opened the temperature. Seven runs of 65,000 steps, about 4.3 passes over the proxy, stood within 0.4 points of one another at their last evaluation for every temperature from 1.35 to 2, and 2.33 and 3 stood 0.5 to 0.7 points below the runs at 1.5 and 1.75. Midway the picture was the reverse: at step 23,000 the two highest temperatures led every run from 1.35 to 1.75 by more than a point, with T = 2 just behind them. A sweep stopped after a pass and a half would have chosen differently. We chose T = 1.75, inside the flat range. The runs do not single it out; it is the temperature at which the full augmentation stack, babble included, was validated, and because the proxy keeps the pool’s language ratios, the same temperature gives the same sampling mix at full scale. Only the number of repetitions grows.
Count the budget in passes, not epochs. Temperature sampling replays small languages. The number of times training passes over language ℓ is the number of samples drawn from it over the number of clips it has, steps × batch × pℓ / nℓ. On the proxy at T = 2, 46,000 steps is three epochs, and the slower run’s development accuracy had started to level off there, with its learning rate decaying towards zero. Counted per language it is 9.2 passes over Sindhi, the language with the fewest clips, and 1.5 over English. We read the plateau as the small languages being repeated rather than the model converging; it stays a reading, and the 65,000-step runs were all still improving at their last evaluation. On the full pool the same 46,000 steps would not finish one pass over Sindhi. A step count cannot be carried across scales. A count of passes can.
We set the full run at about two passes over the pool, 425,000 steps of 144 utterances, so that the large languages are seen more than once, and used the count of passes to check the small ones: under the sampler as run, the five lowest-resource languages are seen four to six times each and the high-resource languages 1.3 to 2.2 times (Figure 26). With the tail replayed that often, label smoothing of 0.1 (Szegedy et al., 2016) guards against memorising it.
Passes over a language, by its hours
| position | 14 Indo-Aryan languages, ramped | 7 other languages | English, floor 16% | Hindi, floor 11% |
|---|---|---|---|---|
| Kashmiri, 369 h | 4.3 passes | |||
| Santali, 394 h | 5.5 passes | |||
| Bodo, 590 h | 4.5 passes | |||
| Assamese, 987 h | 2.8 passes | |||
| Malayalam, 1,544 h | 3.0 passes | |||
| Telugu, 3,184 h | 2.1 passes | |||
| Tamil, 3,560 h | 2.1 passes | |||
| English, 13,039 h | 1.5 passes |
One point per language, at its hours of training audio on a logarithmic axis. A pass is one draw of every clip of that language, on average, summed over the 17 sub-epochs as the run drew them: the first from the plain mix, the rest with the ramp.
The numbers
| Language | Hours | Share as the data comes | Share, first sub-epoch (plain mix) | Share, last sub-epoch | Passes |
|---|---|---|---|---|---|
| Kashmiri | 369 | 0.6% | 1.6% | 1.6% | 4.3 |
| Konkani | 375 | 0.6% | 1.5% | 1.5% | 4.4 |
| Sindhi | 390 | 0.6% | 1.5% | 1.5% | 4.5 |
| Santali | 394 | 0.7% | 1.6% | 1.6% | 5.5 |
| Dogri | 478 | 0.7% | 1.6% | 1.6% | 4.2 |
| Manipuri | 539 | 0.9% | 1.9% | 1.9% | 5.0 |
| Bodo | 590 | 1.1% | 2.1% | 2.1% | 4.5 |
| Urdu | 691 | 1.2% | 2.3% | 2.3% | 3.3 |
| Sanskrit | 828 | 1.4% | 2.4% | 2.4% | 3.1 |
| Assamese | 987 | 1.8% | 2.8% | 2.8% | 2.8 |
| Nepali | 1,150 | 2.5% | 3.4% | 3.4% | 2.4 |
| Punjabi | 1,339 | 2.2% | 3.2% | 3.2% | 2.5 |
| Gujarati | 1,500 | 2.7% | 3.6% | 3.6% | 2.3 |
| Malayalam | 1,544 | 2.7% | 3.6% | 3.6% | 3.0 |
| Odia | 1,827 | 3.5% | 4.1% | 4.1% | 2.1 |
| Maithili | 2,143 | 4.0% | 4.5% | 4.5% | 2.0 |
| Telugu | 3,184 | 6.5% | 5.9% | 5.9% | 2.1 |
| Kannada | 3,287 | 5.8% | 5.5% | 5.5% | 2.2 |
| Bengali | 3,517 | 7.2% | 6.3% | 6.3% | 1.5 |
| Tamil | 3,560 | 6.6% | 6.0% | 6.0% | 2.1 |
| Marathi | 4,792 | 9.8% | 7.5% | 7.5% | 1.3 |
| Hindi | 8,121 | 16.1% | 11.0% | 11.0% | 1.3 |
| English | 13,039 | 20.9% | 16.0% | 16.0% | 1.5 |
The temperature gives the small languages more than their share and the floors keep English at 16% and Hindi at 11% of the samples; this is what that does to the budget. Sampled as the data comes, 425,000 steps would show every clip about twice. As run, the five smallest languages are seen 4.2 to 5.5 times and the eight largest 1.3 to 2.2 times. Computed from the released run’s saved configuration as the paper’s claim check computes it, with the first sub-epoch drawn from the plain mix.
Floors protect the two largest classes. Stage II showed that flattening the mix takes most from the largest languages. As the data comes, English and Hindi are 21% and 16% of the clips; temperature sampling alone would give them 12.3% and 10.6% of the draws. Under focal loss, which discounts easy examples, that leaves the head too little exposure, and the Hindi floor also guards the boundary between Hindi and Urdu. So the sampler never lets English fall below 16% of the samples or Hindi below 11%, whatever the temperature and Stage IV’s ramp do to the rest. No proxy run tested these values: they were set by reasoning from the sampler, here, and first trained in the released run.
Calibration is one number. A model trained with focal loss is slightly under-confident. A single temperature fitted on the 3,450-clip development set (Guo et al., 2017) repairs that: on the proxy model it cut held-out calibration error from 0.050 to 0.014, at a temperature of 0.71. The released model’s own is 0.674.
What Stage V settled. AdamW at a peak rate of 3 × 10−4 with a 5% warm-up and cosine decay; T = 1.75, with floors of 16% for English and 11% for Hindi; and a budget counted in passes, 425,000 steps of 144 utterances.
Stage VIFull scale: one run, then an average of its checkpoints
54,643 h pool · 30.59 million clips of up to 16 s · 23 languages · 425,000 steps of 144 · six RTX A6000 GPUs, about 70 hours · one run
Stage VI put the decisions of the first five stages into one configuration and trained it once on the pool, on the 30.59 million of its 31.24 million clips that are 16 seconds long or shorter: attentive statistics pooling over a learned mix of all 17 layers, focal loss with label smoothing, sampling at T = 1.75 with the floors of Stage V and the confusability ramp of Stage IV, the full augmentation stack with babble, AdamW at 3 × 10−4 with cosine decay, in bf16 mixed precision. Three things were new in training: the floors under English and Hindi, set in Stage V and trained here for the first time; an exponential moving average of the weights kept beside the live ones (decay 0.9999); and a checkpoint every 25,000 steps, 17 in all, so that the choice of what to release could be made afterwards and on evidence. An earlier full-scale run without the first two is the subject of the layer analysis below.
Training loss (log scale)
| step | Training loss |
|---|---|
| 1,649 | 2.713 |
| 60,474 | 0.519 |
| 122,599 | 0.453 |
| 181,449 | 0.400 |
| 243,549 | 0.373 |
| 302,399 | 0.350 |
| 364,524 | 0.338 |
| 423,374 | 0.324 |
Learning rate
| step | Learning rate ×10⁴ |
|---|---|
| 1,649 | 0.23 |
| 60,474 | 2.93 |
| 122,599 | 2.56 |
| 181,449 | 1.98 |
| 243,549 | 1.27 |
| 302,399 | 0.64 |
| 364,524 | 0.17 |
| 423,374 | 0.01 |
Development accuracy and recall
| step | Accuracy, all 23 languages | Recall, English | Recall, Hindi | Recall, Urdu |
|---|---|---|---|---|
| 25,000 | 0.895 | 0.521 | 0.626 | 0.966 |
| 75,000 | 0.915 | 0.793 | 0.920 | 0.670 |
| 150,000 | 0.933 | 0.666 | 0.867 | 0.897 |
| 200,000 | 0.940 | 0.867 | 0.874 | 0.885 |
| 250,000 | 0.933 | 0.707 | 0.933 | 0.861 |
| 300,000 | 0.929 | 0.547 | 0.947 | 0.897 |
| 375,000 | 0.941 | 0.839 | 0.887 | 0.893 |
| 425,000 | 0.951 | 0.860 | 0.933 | 0.911 |
Faint: one logged batch. Solid: its running mean. The learning rate is as logged. The legend’s keys belong to the third panel: accuracy on the 3,450-clip development set, and recall on its 150 clips of each of three languages. The loss axis is logarithmic; the third panel starts at 0.5.
The numbers
| Step | Development accuracy | Recall, English | Recall, Hindi | Recall, Urdu |
|---|---|---|---|---|
| 25,000 | 0.8948 | 0.521 | 0.626 | 0.966 |
| 50,000 | 0.9161 | 0.680 | 0.820 | 0.863 |
| 75,000 | 0.9152 | 0.793 | 0.920 | 0.670 |
| 100,000 | 0.9268 | 0.740 | 0.879 | 0.923 |
| 125,000 | 0.9273 | 0.740 | 0.834 | 0.835 |
| 150,000 | 0.9329 | 0.666 | 0.867 | 0.897 |
| 175,000 | 0.9356 | 0.774 | 0.873 | 0.871 |
| 200,000 | 0.9398 | 0.867 | 0.874 | 0.885 |
| 225,000 | 0.9415 | 0.840 | 0.840 | 0.928 |
| 250,000 | 0.9333 | 0.707 | 0.933 | 0.861 |
| 275,000 | 0.9455 | 0.913 | 0.893 | 0.926 |
| 300,000 | 0.9286 | 0.547 | 0.947 | 0.897 |
| 325,000 | 0.9260 | 0.793 | 0.980 | 0.816 |
| 350,000 | 0.9350 | 0.760 | 0.960 | 0.840 |
| 375,000 | 0.9414 | 0.839 | 0.887 | 0.893 |
| 400,000 | 0.9424 | 0.779 | 0.940 | 0.887 |
| 425,000 | 0.9510 | 0.860 | 0.933 | 0.911 |
A calm run with a restless inside. The loss falls from 2.7 to 0.32 without incident under a 5% warm-up and cosine decay, and development accuracy rises from 0.895 to 0.951, best at the last checkpoint. Underneath, single languages swing: English recall is 0.91 at one checkpoint and 0.55 at the next, on 150 clips from one English corpus. Training log (Weights & Biases).
A calm run. The loss falls from 2.7 to 0.32 with no spike and no restart (Figure 27). Training accuracy ends at 0.88, low by design: half the clips are cropped and most are perturbed. Accuracy on the development set rises from 0.895 at the first checkpoint to 0.951 at the last, and the best checkpoint is the final one, so on the development set nothing was over-trained.
A restless inside. Per language the same run is far less settled. English recall on the development set is 0.52 at the first checkpoint, 0.91 at the eleventh, 0.55 at the twelfth and 0.86 at the last. Each language has 150 development clips, and the English ones all come from one corpus, so the development set exaggerates the swing: on the clean benchmark’s English the same two neighbouring checkpoints both score 0.89. But the benchmark sees it too, in smaller steps, up to 11 points between neighbours across a range of 0.82 to 0.95. A model taken from any single step inherits what that step happened to favour.
SUITE-102 macro-F1
| step | Checkpoint | Its EMA weights |
|---|---|---|
| 25,000 | 0.7824 | |
| 75,000 | 0.8087 | |
| 150,000 | 0.8169 | |
| 200,000 | 0.8276 | |
| 250,000 | 0.8335 | |
| 300,000 | 0.8326 | |
| 375,000 | 0.8395 | 0.8431 |
| 425,000 | 0.8432 | 0.8441 |
Telephony, 7 conditions
| step | Checkpoint |
|---|---|
| 25,000 | 0.922 |
| 75,000 | 0.918 |
| 150,000 | 0.922 |
| 200,000 | 0.920 |
| 250,000 | 0.913 |
| 300,000 | 0.908 |
| 375,000 | 0.898 |
| 425,000 | 0.898 |
Crops of 1 s, 6 conditions
| step | Checkpoint |
|---|---|
| 25,000 | 0.687 |
| 75,000 | 0.701 |
| 150,000 | 0.732 |
| 200,000 | 0.752 |
| 250,000 | 0.763 |
| 300,000 | 0.775 |
| 375,000 | 0.790 |
| 425,000 | 0.798 |
Ringed points are the seven checkpoints averaged into the released model; the dashed line is that average’s own score. No axis starts at zero, and the strip’s axis spans 0.6 points.
The numbers
| Candidate | Checkpoints averaged (steps) | SUITE-102 | Telephony | Crops of 1 s |
|---|---|---|---|---|
| Released: seven across the run | 100k, 175k, 275k, 325k, 350k, 400k, 425k | 0.8453 | 0.923 | 0.791 |
| Five across the run | 100k, 175k, 325k, 350k, 425k | 0.8448 | 0.924 | 0.791 |
| One early, four late | 175k, 325k, 350k, 400k, 425k | 0.8447 | 0.910 | 0.795 |
| One early, four from the plateau | 175k, 275k, 325k, 350k, 425k | 0.8447 | 0.917 | 0.794 |
| Final EMA weights | 425k | 0.8441 | 0.900 | 0.798 |
| Final checkpoint | 425k | 0.8432 | 0.898 | 0.798 |
| Five best on the development set | 225k, 275k, 375k, 400k, 425k | 0.8431 | 0.906 | 0.793 |
| Last seven | 275k, 300k, 325k, 350k, 375k, 400k, 425k | 0.8420 | 0.903 | 0.796 |
| Last five, EMA weights | 325k, 350k, 375k, 400k, 425k | 0.8413 | 0.892 | 0.796 |
| Last five | 325k, 350k, 375k, 400k, 425k | 0.8408 | 0.891 | 0.796 |
One run, several models. Across the 17 checkpoints SUITE-102 macro-F1 climbs from 0.782 to 0.843, but the families do not climb together: telephony is best at 175,000 steps and worst at 325,000, while one-second crops improve to the end. An average that spans the run keeps both, 0.923 on telephony and 0.791 at one second, and ranks first of the 31 candidates at 0.8453. Averages of late checkpoints alone rank below the final checkpoint. Anuvani-LID paper, Figure 8, with two families added from the same scorecards.
The benchmark sees the same thing by family. We scored all 17 checkpoints on the 102 conditions. SUITE-102 macro-F1 climbs from 0.782 at 25,000 steps to 0.843 at the end, and to 0.844 for the final EMA weights (Figure 28). The families do not climb together. Telephony is at its best at 175,000 steps (0.932), falls to 0.877 by 325,000 and recovers to 0.898. One-second crops improve almost without pause, from 0.69 to 0.80. Early checkpoints hold the channel robustness; late ones hold the short clips.
Averaging keeps both. Averaging the weights of checkpoints from one run (Izmailov et al., 2018) gives one model, which costs nothing extra at inference, the property model soups exploit (Wortsman et al., 2022). From the 17 checkpoints we first built 11 more candidates, the EMA weights at six checkpoints and five averages, and scored all 28 on SUITE-102. Three more averages were then designed around the best of them, their members fixed from the per-family profiles before any of the three was scored, and the released model is one of those three. Which checkpoints go in matters more than how many. Averages of late checkpoints only, the obvious choice, score 0.841 to 0.843 and do not beat the final checkpoint. Averages that reach back to an early checkpoint do. The best of the 31 candidates is the average of seven checkpoints spread across the run, at 100, 175, 275, 325, 350, 400 and 425 thousand steps. It scores 0.8453, with nearly the telephony of the early checkpoints (0.923) and nearly the short-clip accuracy of the late ones (0.791). It is the released Anuvani-LID.
What the average did and did not buy. On the suite as a whole, very little: the top four candidates lie within 0.06 points of each other, and the released average is 0.1 points above the final EMA weights it could have been replaced by. What it bought is evenness. English recall on the clean benchmark is 0.87 for the final checkpoint and 0.92 for the average, and telephony rises from 0.898 to 0.923. We used SUITE-102 to design the last three averages as well as to choose among all 31, which a careful reader should hold against the suite score. The check we report is the candidate that involved no choice: the final EMA weights score 0.912 on the core conditions of the comparison panel and 0.889 on its all-23 panel, against 0.914 and 0.897 for the released average, and no ranking against another system changes. The released recipe was trained once; we did not repeat it with another seed.
All-23 test, 6,900 clips
| confidence | Confidence equals accuracy | As trained | With one temperature, 0.674 |
|---|---|---|---|
| 0.15 | 0.15 | ||
| 0.3039 | 0.256 | ||
| 0.4333 | 0.638 | ||
| 0.5663 | 0.523 | ||
| 0.6357 | 0.605 | ||
| 0.7696 | 0.735 | ||
| 0.9035 | 0.967 | ||
| 1 | 1.00 |
Clean benchmark, 6,000 clips
| confidence | Confidence equals accuracy | As trained | With one temperature, 0.674 |
|---|---|---|---|
| 0.15 | 0.15 | ||
| 0.3716 | 0.772 | ||
| 0.5025 | 0.639 | ||
| 0.6323 | 0.835 | ||
| 0.7018 | 0.846 | ||
| 0.8345 | 0.986 | ||
| 0.9036 | 0.986 | ||
| 1 | 1.00 |
Each point is one bin of clips: its mean confidence across, its accuracy up. A point above the dashed line is a model less confident than it is right. Bins holding under 0.5% of the clips are not drawn, and both axes start at 0.15.
The numbers
| Set | Clips | ECE as trained | ECE with one temperature |
|---|---|---|---|
| Development set (fitted here) | 3,450 | 0.0614 | 0.0060 |
| All-23 test, unseen speakers | 6,900 | 0.0538 | 0.0078 |
| Clean benchmark | 6,000 | 0.0892 | 0.0249 |
| Cross-corpus, IndicVoices | 2,975 | 0.0240 | 0.0267 |
| FLEURS crops of 1 s | 1,500 | 0.0410 | 0.1097 |
As trained, the model is right more often than it says: its points lie above the line. Dividing the logits by one temperature, 0.674, fitted on the development set, brings calibration error on the unseen-speaker all-23 test from 0.054 to 0.008 and on the clean benchmark from 0.089 to 0.025. It does not help everywhere: on the cross-corpus slice the error was already 0.024 and is 0.027 afterwards, and on clips of a second or less it makes things worse, from 0.041 to 0.110 on FLEURS crops of one second. Anuvani-LID paper, Figure 11; the short-clip row from its comparison panel.
The last step is one number. Focal loss leaves the model slightly under-confident, as Stage V found on the proxy. A single temperature, 0.674, fitted on the 3,450-clip development set, lowers expected calibration error on the held-out all-23 test from 0.054 to 0.008 and on the clean benchmark from 0.089 to 0.025 (Figure 29). On the cross-corpus slice, where the error was already 0.024, it does not help: the error is 0.027 afterwards. On short clips it hurts. Of the 42 conditions of the comparison panel it makes 9 worse, every one at a second or less among them: on FLEURS the error goes from 0.041 to 0.110 at one second and from 0.084 to 0.208 at half a second. On clips that short the model was not under-confident to begin with. Over the whole panel the mean error still falls, from 0.080 to 0.044. We report the temperature with the model.
What Stage VI settled. The released model is the uniform average of seven checkpoints of one 425,000-step run, with one calibration temperature. Everything else in it was decided earlier, on a fourteenth of the data.
Inside the model: where language identity is encoded
The six stages chose the model from the outside, by what it scored. This section opens it. We asked four questions. Where along the 17 blocks does language become readable? What does the head read when it is free to choose? Which blocks does the decision need? And does it lean on the recording channel, the shortcut behind earlier cross-corpus failures (Dey, Saha & Sahidullah, 2021)?
The subjects are three models built on one pre-trained encoder: the encoder itself, with no fine-tuning; the selected Stage I arm, fine-tuned on 1,000 hours with its head on the last block; and a model fine-tuned on all 54.6 thousand hours. That last one is the finished model of the first full-scale run, made with an earlier version of the final recipe: the same head, loss, temperature and learning rate, without the floors under English and Hindi, the moving average of the weights, or crops shorter than half a second. It is not the released average. Two more 1,000-hour models join for single questions: the Stage I arm that reads a learned mix of all 17 layers, with a margin loss, and the depth runs. Blocks are numbered from 1 at the bottom to 17 at the top.
Language probe, macro-F1
| block | Fine-tuned, 54.6k h | Fine-tuned, 1,000 h | Pre-trained only |
|---|---|---|---|
| 1 | 0.154 | 0.147 | 0.146 |
| 3 | 0.232 | 0.224 | 0.231 |
| 7 | 0.720 | 0.539 | 0.527 |
| 9 | 0.843 | 0.671 | 0.564 |
| 11 | 0.860 | 0.688 | 0.563 |
| 12 | 0.862 | 0.671 | 0.549 |
| 15 | 0.811 | 0.571 | 0.237 |
| 17 | 0.649 | 0.531 | 0.126 |
Probe gain from fine-tuning
| block | Fine-tuned, 54.6k h | Fine-tuned, 1,000 h |
|---|---|---|
| 1 | 0.008 | 0.001 |
| 3 | 0.001 | -0.008 |
| 7 | 0.193 | 0.012 |
| 9 | 0.279 | 0.107 |
| 11 | 0.296 | 0.125 |
| 12 | 0.314 | 0.122 |
| 15 | 0.575 | 0.334 |
| 17 | 0.524 | 0.405 |
Similarity to block 1 (CKA)
| block | Fine-tuned, 54.6k h | Fine-tuned, 1,000 h | Pre-trained only |
|---|---|---|---|
| 1 | 1.000 | 1.000 | 1.000 |
| 3 | 0.844 | 0.903 | 0.901 |
| 6 | 0.642 | 0.757 | 0.797 |
| 8 | 0.519 | 0.698 | 0.735 |
| 10 | 0.261 | 0.484 | 0.695 |
| 12 | 0.203 | 0.466 | 0.781 |
| 15 | 0.159 | 0.508 | 0.841 |
| 17 | 0.031 | 0.456 | 0.801 |
The probe is drawn at the ten blocks of the paper’s grid; similarity at all 17. The gain is each fine-tuned model’s probe score less the pre-trained encoder’s at the same block; for the full-scale model the two scores come from different test sets, 1,217 and 953 clips.
The numbers
| Block | Pre-trained | Fine-tuned, 1,000 h | Fine-tuned, 54.6k h | Similarity to block 1, 54.6k h |
|---|---|---|---|---|
| 1 | 0.146 | 0.147 | 0.154 | 1.000 |
| 3 | 0.231 | 0.224 | 0.232 | 0.844 |
| 5 | 0.459 | 0.399 | 0.424 | 0.703 |
| 7 | 0.527 | 0.539 | 0.720 | 0.588 |
| 9 | 0.564 | 0.671 | 0.843 | 0.381 |
| 11 | 0.563 | 0.688 | 0.860 | 0.253 |
| 12 | 0.549 | 0.671 | 0.862 | 0.203 |
| 13 | 0.500 | 0.666 | 0.845 | 0.188 |
| 15 | 0.237 | 0.571 | 0.811 | 0.159 |
| 17 | 0.126 | 0.531 | 0.649 | 0.031 |
Three checkpoints of one encoder. Before fine-tuning, language is most readable in blocks 9 to 11 (about 0.56) and almost unreadable at block 17 (0.13). Fine-tuning moves the peak to block 11 (0.69) on 1,000 h and block 12 (0.86) on 54.6k h. It changes nothing at the bottom and almost everything at the top: the gain is 0.00 at block 1 and +0.41 at block 17. After 54.6k h the top block shares almost nothing linearly with the first (0.03, against 0.80 before fine-tuning). Anuvani-LID paper, Figure 13, with the gain and the similarity added from the analysis files.
Language lives in the middle and upper stack. A linear probe (Belinkov, 2022) is the simplest instrument: freeze the model, pool each block’s frames into one vector per clip, and train a linear classifier on those vectors to name the language, testing on speakers it has not seen. In the pre-trained encoder the probe peaks at about 0.56 in blocks 9 to 11 and collapses to 0.13 at block 17, whose representations serve the pre-training objective and not the listener (Pasad et al., 2021). Fine-tuning moves the peak to block 11 (0.69) on 1,000 hours and to block 12 (0.86) on 54.6 thousand, higher in the stack than the lower-layer optimum reported for another self-supervised Conformer (Bartley et al., 2023).
Fine-tuning rewrites the top, not the bottom. All three models read 0.15 at block 1 and are within a point and a half of each other up to block 3. The gain over the pre-trained encoder then grows with depth: on 1,000 hours it is 0.00 at block 1, +0.11 at block 9 and +0.41 at block 17 (Figure 30, second panel). A measure of representational similarity, linear CKA (Kornblith et al., 2019), shows the same thing from another side. Before fine-tuning the top block still resembles the first (0.80). After 1,000 hours the figure is 0.46, and after 54.6 thousand it is 0.03: the top of the full-scale model shares almost nothing linearly with its bottom. By this measure fine-tuning leaves the lower blocks where pre-training put them, and turns the upper blocks into a language identifier.
Share of the head's layer mix
| block | Layer mix, 54.6k h | Layer mix, 1,000 h, margin loss |
|---|---|---|
| 1 | 0.006 | 0.052 |
| 3 | 0.012 | 0.053 |
| 6 | 0.040 | 0.057 |
| 8 | 0.031 | 0.059 |
| 10 | 0.063 | 0.061 |
| 12 | 0.065 | 0.062 |
| 15 | 0.048 | 0.064 |
| 17 | 0.299 | 0.066 |
Macro-F1 lost when a block is skipped
| block | Layer mix, 54.6k h | Layer mix, 1,000 h, margin loss | Last block only, 1,000 h, focal |
|---|---|---|---|
| 1 | 0.055 | 0.054 | 0.089 |
| 3 | 0.014 | 0.020 | 0.033 |
| 6 | 0.016 | 0.087 | 0.151 |
| 8 | 0.008 | 0.118 | 0.160 |
| 10 | -0.012 | 0.116 | 0.266 |
| 12 | 0.006 | 0.006 | 0.041 |
| 15 | 0.006 | 0.004 | 0.095 |
| 17 | 0.000 | 0.000 | 0.672 |
The weights of one model sum to 100%. For the two layer-mix models the knockout is partial: their heads still receive the skipped block’s own output, so their curves show only what the blocks above it lose, and their zero at block 17 is by construction. The second panel’s axis runs below zero because skipping a block sometimes helps by a hair.
The numbers
| Block | Weight, 1,000 h | Weight, 54.6k h | Lost: last block only, 1,000 h | Lost: layer mix, 1,000 h | Lost: layer mix, 54.6k h |
|---|---|---|---|---|---|
| 1 | 5.2% | 0.6% | 0.089 | 0.054 | 0.055 |
| 2 | 5.1% | 0.7% | 0.018 | 0.018 | 0.020 |
| 3 | 5.3% | 1.2% | 0.033 | 0.020 | 0.014 |
| 4 | 5.3% | 1.7% | 0.041 | 0.021 | 0.010 |
| 5 | 5.6% | 4.4% | 0.058 | 0.019 | 0.000 |
| 6 | 5.7% | 4.0% | 0.151 | 0.087 | 0.016 |
| 7 | 5.7% | 2.1% | 0.340 | 0.279 | 0.079 |
| 8 | 5.9% | 3.1% | 0.160 | 0.118 | 0.008 |
| 9 | 5.9% | 3.3% | 0.177 | 0.045 | -0.012 |
| 10 | 6.1% | 6.3% | 0.266 | 0.116 | -0.012 |
| 11 | 6.2% | 7.3% | 0.105 | 0.037 | -0.008 |
| 12 | 6.2% | 6.5% | 0.041 | 0.006 | 0.006 |
| 13 | 6.2% | 7.0% | 0.060 | 0.004 | 0.007 |
| 14 | 6.2% | 7.6% | 0.116 | 0.002 | 0.007 |
| 15 | 6.4% | 4.8% | 0.095 | 0.004 | 0.006 |
| 16 | 6.5% | 9.5% | 0.170 | 0.000 | 0.002 |
| 17 | 6.6% | 29.9% | 0.672 | 0.000 | 0.000 |
With more data and a longer run, the head learns where to look. On 1,000 h the learned mix stays nearly uniform, 5.1% to 6.6% a block; on 54.6k h it puts 30% on block 17 and most of the rest on blocks 10 to 16. A head that reads only the last block loses everything when that block is skipped, and half of its score without block 7. For the layer-mix models the test is partial: skipping a block removes only its effect on the blocks above, which costs the full-scale model at most 0.08. Anuvani-LID paper, Figure 13 (the 54.6k h weights) and its text; the 1,000 h weights from the analysis files.
With more data, the head learns where to look. The layer mix of Stage II gives the head one weight per block (Yang et al., 2021). On 1,000 hours those weights hardly move from uniform: between 5.1% and 6.6% a block, an effective 16.95 layers of 17. On 54.6 thousand hours they concentrate. Block 17 receives 30% of the weight and blocks 10 to 16 most of the rest, an effective 11.1 layers (Figure 31). The head’s choice and the probe’s do not coincide exactly: the probe is best at block 12, and the head leans hardest on block 17, where the probe has already fallen to 0.65. A linear probe on a frozen block and a head trained jointly with the stack are different readers, and we report the disagreement without smoothing it. The two models also differ in more than data: the 1,000-hour one has a margin loss and trained for 14,028 steps, the full-scale one focal loss for 425,000, at three times the learning rate.
Knockout reads a last-block head cleanly, and a mixing head only in part. Knockout asks what the decision needs: replace one block by the identity and measure the macro-F1 lost. For a head that reads only the last block the test is clean, since everything it sees has passed through every block. The selected Stage I arm, a focal head on block 17 trained on 1,000 hours, loses its whole score, 0.67, when block 17 is skipped, and has two bottlenecks lower down: skipping block 7 costs 0.34 and block 10 costs 0.27. For a head that reads a mix the test is partial. The model records each block’s output for the mix before the knockout replaces it, so the head still receives the skipped block’s real output, and the curve shows only what the blocks above it lose; the zero at block 17 is by construction. With that caveat, the 1,000-hour mixing arm, which also differs in its loss, loses 0.28 without block 7, and the full-scale model at most 0.08. Whether a mixing head can route around a missing block was not tested.
Cross-corpus macro-F1
| blocks kept: | Benchmark, 2 epochs |
|---|---|
| 3 | 0.631 |
| 6 | 0.800 |
| 9 | 0.842 |
| 12 | 0.848 |
| 15 | 0.842 |
| 17 | 0.840 |
Cross-corpus, nine blocks and up
| blocks kept: | Benchmark, 2 epochs | Benchmark, 4 epochs |
|---|---|---|
| 9 | 0.842 | |
| 12 | 0.848 | 0.844 |
| 15 | 0.842 | |
| 17 | 0.840 | 0.835 |
Validation accuracy in training
| blocks kept: | Validation, clean |
|---|---|
| 3 | 0.952 |
| 6 | 0.979 |
| 9 | 0.968 |
| 12 | 0.977 |
| 15 | 0.972 |
| 17 | 0.983 |
Ringed points carry the parameter count. A vertical bar is the half-spread of two seeds. The first panel starts at 0.6; the second enlarges its right-hand end, from 0.82 to 0.86; the third starts at 0.9. The 4-epoch point at 17 blocks is the Stage I reference arm, a single run, scored again.
The numbers
| Blocks kept | Parameters | Cross-corpus | Clean | Noisy and degraded | Crops of 1 s | Validation, clean |
|---|---|---|---|---|---|---|
| 3 | 27.1M | 0.631 | 0.793 | 0.446 | 0.425 | 0.952 |
| 6 | 46.1M | 0.800 | 0.887 | 0.638 | 0.647 | 0.979 |
| 9 | 65M | 0.842 | 0.899 | 0.683 | 0.660 | 0.968 |
| 12 | 84M | 0.848 ± 0.25 points | 0.906 | 0.689 | 0.684 | 0.977 |
| 15 | 103M | 0.842 ± 0.33 points | 0.904 | 0.686 | 0.680 | 0.972 |
| 17 | 115.6M | 0.840 ± 0.35 points | 0.892 | 0.670 | 0.634 | 0.983 |
Accuracy stops rising at twelve blocks. Cross-corpus macro-F1 is 0.848 with 12 blocks and 84 million parameters against 0.840 with all 17 and 116 million: both 12-block seeds beat both 17-block seeds, by a gap the size of the spread between seeds and far inside the three-point noise of training. At four epochs, 0.844 (two seeds) against 0.835 (the single Stage I reference run). Nine blocks match all 17 with 65 million. The validation set of the same runs cannot see any of this: three blocks reach 0.952 clean validation accuracy and 0.631 on the benchmark. Anuvani-LID paper, Figure 13; validation from the training logs (Weights & Biases).
Twelve blocks suffice. Probes and knockouts are readings of a fixed model. The direct test is to retrain. We kept the bottom k blocks of the pre-trained encoder, for k from 3 to 17, and fine-tuned each under the Stage I reference recipe on 1,000 hours, with a second seed at 12, 15 and 17 blocks. Cross-corpus macro-F1 rises from 0.631 at three blocks to 0.842 at nine and stops rising at twelve: 0.848 with 84 million parameters against 0.840 with all 17 blocks and 116 million (Figure 32). Both 12-block seeds beat both 17-block seeds, but by 0.8 points, about the spread between two seeds of one depth (0.5 and 0.7 points) and far inside the three-point noise of training. At four epochs the 12-block runs score 0.844 (two seeds) against 0.835 for the single Stage I reference run. Nine blocks match all 17 (0.842 against 0.840) with 44% fewer parameters, 0.6 points behind twelve. What the experiment shows is that the top five blocks add nothing this task can use at this scale, which is what the probe had said.
Two cautions. The truncated models used the Stage I reference head on 1,000 hours, not the released recipe on the full pool, so this is a result about depth and not yet a smaller release. And the runs’ own validation accuracy, 0.95 to 0.98 at every depth, would never have found it: a three-block encoder reaches 0.952 on clean validation and 0.631 on the benchmark.
Fine-tuned on 54.6k h
| block | Which corpus? (probe accuracy) | Which language? (probe macro-F1) |
|---|---|---|
| 1 | 0.842 | 0.154 |
| 3 | 0.928 | 0.232 |
| 6 | 0.925 | |
| 8 | 0.925 | |
| 10 | 0.953 | |
| 12 | 0.961 | 0.862 |
| 15 | 0.967 | 0.811 |
| 17 | 0.886 | 0.649 |
Fine-tuned on 1,000 h
| block | Which corpus? (probe accuracy) | Which language? (probe macro-F1) |
|---|---|---|
| 1 | 0.828 | 0.147 |
| 3 | 0.854 | 0.224 |
| 6 | 0.839 | |
| 8 | 0.848 | |
| 10 | 0.842 | |
| 12 | 0.804 | 0.671 |
| 15 | 0.868 | 0.571 |
| 17 | 0.889 | 0.531 |
The corpus probe tells four corpora apart, so guessing the largest scores about 0.25; the corpora do not share all their languages, so part of its score can come from language. Erasure finds the three directions along which the corpus means differ, on block 17, and projects them out of what the head reads; then the four cross-corpus conditions and the probe, on block 17, are run again. In the first two rows the two points coincide.
The numbers
| Measurement | Before | After erasure | Change, points |
|---|---|---|---|
| Language macro-F1, 54.6k h | 0.9374 | 0.9385 | +0.1 |
| Language macro-F1, 1,000 h | 0.8303 | 0.8306 | 0.0 |
| Corpus probe accuracy, 54.6k h | 0.8972 | 0.3833 | −51.4 |
| Corpus probe accuracy, 1,000 h | 0.8567 | 0.0760 | −78.1 |
Which corpus a clip came from can be read off every block, at 0.84 or better in the full-scale model. On the 1,000 h model, whose head reads block 17, projecting out the three directions along which the corpus means differ leaves language macro-F1 at 0.830 to 0.831 while the corpus probe falls from 0.86 to 0.08. At full scale the same kind of directions, found on block 17, were removed from the layer mix: macro-F1 moved from 0.937 to 0.939, but the check that the corpus was gone, 0.90 to 0.38, was made on block 17, not on the mix. Anuvani-LID paper, section 8; the analysis files.
The corpus is visible; on the cleanest test, it is not used. A language identifier can cheat. If Bengali mostly comes from one corpus and Odia from another, the microphone is as good a clue as the phonology, and the cheat fails on the first new corpus. The information is present: a probe for which of four corpora a clip belongs to scores between 0.84 and 0.97 at every block of the full-scale model, against 0.25 for guessing (Figure 33). Part of that can come from language, since the four corpora do not share all their languages: 148 of the 300 IndicVoices clips are in languages no other corpus in the probe has. So we removed it, with a simplified form of LEACE (Belrose et al., 2023): the three directions along which the corpus means differ, found on block 17, projected out of what the head reads. On the 1,000-hour model, whose head reads block 17, the test is clean: macro-F1 on the four cross-corpus conditions stays at 0.830 to 0.831, and the corpus probe on the erased vectors falls from 0.86 to 0.08. At full scale macro-F1 moved by +0.1 points, 0.937 to 0.939, but there the directions were removed from the mix, in which block 17 has 30% of the weight, and the check that the corpus was gone, 0.90 to 0.38, was made on block 17. That bounds the claim: on the model where the test is clean, the decision does not rest on the corpus cues we could find and remove.
What the inside says about the outside. Each finding meets a choice made earlier by score alone. Language is most readable between blocks 9 and 12, so a head that reads only block 17 reads past the peak; the layer mix of Stage II lets the head choose. Fine-tuning does its work in the upper half of the stack, which is consistent with a frozen encoder failing in Stage I (0.362), while every arm that let the top of the stack change came within 3.4 points of the best fine-tuned arm. The corpus is visible, and on the model where the test is clean it is unused, which is the behaviour the held-out benchmark was built to demand. And twelve blocks would do, which is where a smaller model begins.
Results
- Overall. Anuvani-LID reaches 0.914 mean macro-F1 on the core conditions: 5.2 points above Gemini 3.5 Flash (95% CI 4.8–5.5) and 6.8 above Sarvam Saaras v3. Restricted to the same ten candidates the APIs were given, it reaches 0.923. It is significantly better than Gemini on 21 of 37 conditions and better than every open model on at least 28.
- Short clips. At one second it reaches 0.764 macro-F1 on FLEURS and 0.854 on in-domain speech, against 0.520 and 0.611 for Gemini: 24 points in both cases. At half a second it reaches 0.545, against 0.439 for the best competitor and 0.231 for Gemini.
- Noise. The margin over Gemini grows as the audio gets worse: +7.0 points under babble, +6.0 in 0 dB noise, +4.3 under reverberation, against +1.9 on clean read speech.
- All 23 languages. Only five other systems can even output all 23 classes. Anuvani-LID averages 0.897 macro-F1 on the all-23 panel, against 0.713 for Voxlect Indic-Whisper, 0.710 for Gemini and 0.384 for GPT-audio. It scores at least 0.84 F1 on every language, including Bodo (0.95), Dogri (0.97), Kashmiri (0.95), Santali (0.93) and Sindhi (0.91), each trained on under 600 hours.
- Calibration and rejection. Temperature scaling brings expected calibration error on the all-23 test to 0.008; 100 · Cavg is 3.16 and EER 1.79%. Maximum-softmax rejection separates music and eight non-Indian languages from in-set speech with AUROC 0.89–0.91.
- Efficiency. Language identity peaks in blocks 11–12, and a 12-block version (84M parameters) matches the full model on cross-corpus macro-F1 (0.848 against 0.840). Erasing the recording-channel subspace with LEACE changes the decision by only 0.1 points, so the model is not leaning on channel shortcuts (Belrose et al., 2023).
How it answers each problem in this post
| Problem | Anuvani-LID's answer | Measured effect |
|---|---|---|
| A weak, shared LID objective | A dedicated focal-loss objective over 23 languages | Best macro-F1 and ECE 0.023 among 25 Stage-I arms |
| Language lives mid-stack | Learned aggregation over all 17 blocks | +2.8 telephony, +1.9 noise, +1.4 confusable |
| One-second clips | Duration cropping, 0.25–16 s bimodal crops | +24 points over Gemini at 1 s |
| Noisy, narrowband calls | MUSAN, room impulses, 8 kHz codec, babble | Babble conditions 0.804 → 0.920 |
| Confusable clusters | Curriculum over the Indo-Aryan cluster | 0.975 vs 0.955 (Gemini) on confusable pairs |
| 35-fold data skew | Temperature sampling near T = 2, with floors | Lowest-resource tier 0.742 → 0.930 F1 |
| Missing languages | All 22 scheduled languages plus English | ≥ 0.84 F1 on every class |
| A closed set | Open-set evaluation and calibrated scores | AUROC 0.89–0.91 |
| No usable confidence | Focal loss plus temperature scaling | ECE 0.054 → 0.008 |
| Cost and the edge | 115.6M parameters; 12-block variant | 84M with no loss |
Where we still lose
We report losses next to wins, because a benchmark that only shows wins is an advertisement.
- Long, read, high-register speech. Gemini 3.5 Flash is significantly ahead on the five full-length FLEURS conditions (by 1.5 to 5.7 points) and on MUCS read speech (1.2). FLEURS is read Wikipedia text, a register a general-purpose audio LLM can exploit. The ranking reverses once the same clips are cut to one second.
- Hindi varieties. On dialectal Hindi, Hinglish and rural telephony, Sarvam (0.918) and Gemini (0.912) lead us (0.779). On dialectal Hindi we label 19% of utterances Urdu; on Hinglish, 28% Urdu and 23% English. Urdu shares Hindi’s spoken grammar and English supplies the embedded words, so these are defensible confusions, and the probes reward any prior toward Hindi. But the deeper lesson is ours to learn: for code-mixed speech, one label per utterance is the wrong tool, and frame-level language diarization is the right one.
- Indian English. On the Svarah corpus of accented English, 40% of utterances are attributed to a scheduled language.
- The sub-second floor. At 0.25 seconds we reach only 0.24–0.35 macro-F1 in seven of eight conditions. No open model exceeds 0.18 there, but the information simply is not in the signal yet.
- The open set. Rejecting Chhattisgarhi, a close relative of Hindi, is harder (AUROC 0.84) than rejecting unrelated languages. And India’s other languages (Bhili, Gondi, Tulu, Bhojpuri and more) remain outside our label set.
Closing: listen for one thing
Unified speech models are one of the great achievements of the last five years, and nothing in this post argues against them. It argues for something smaller and older: that the first decision in a voice pipeline deserves weights trained for it alone, a confidence you can trust, a label space you choose, a time resolution that matches a conversation, and a life cycle of its own.
India makes that case more forcefully than anywhere else. Twenty-two scheduled languages drawn from four families that have borrowed each other’s sounds for centuries. Labels that are partly administrative. Data that follows wealth rather than speakers. Calls that arrive over 8 kHz lines, a second or two at a time, in two languages at once. A general model can be very good at the average of all that. A voice agent in Patna or Guwahati does not live at the average.
There is plenty left to do. Code-mixed speech needs frame-level language diarization, not one label per utterance. Close relatives of scheduled languages must be rejected, not forced into the nearest class. And India’s languages do not end with the Eighth Schedule. We intend to keep going.
We began with the raga, recognised from its first phrase before the melody unfolds. Before a single word is understood, something has to recognise that first phrase of speech. We think that something should be listening for nothing else.
Acknowledgement
Anuvani-LID was conceived and developed by Stephen Fernandes under the leadership and guidance of Dr. Narayan Kumar Choudhary. We thank Dr. Choudhary and the Central Institute of Indian Languages (CIIL) for their assistance, for the compute they provided and for their continued support.
References
Papers and books
- Ahn, H., Chae, J., Park, Y., Shim, K. (2026). Whisper-CD: Accurate long-form speech recognition using multi-negative contrastive decoding. arXiv:2603.06193
- Amodei, D., et al. (2016). Deep Speech 2: End-to-end speech recognition in English and Mandarin. ICML. arXiv:1512.02595
- Amooie, R., Hao, Y., de Vries, W., Dijkstra, J., Coler, M., Wieling, M. (2026). Improving low-resource ASR using bilingual fine-tuning with language identification: a cross-linguistic evaluation. arXiv:2606.17820
- Arandjelović, R., Gronat, P., Torii, A., Pajdla, T., Sivic, J. (2016). NetVLAD: CNN architecture for weakly supervised place recognition. CVPR. arXiv:1511.07247
- Arivazhagan, N., et al. (2019). Massively multilingual neural machine translation in the wild. arXiv:1907.05019
- Arsenault, P. (2017). Retroflexion in South Asia: Typological, genetic, and areal patterns. Journal of South Asian Languages and Linguistics 4(1).
- Attia, A. A., et al. (2024). Kid-Whisper. AIES. arXiv:2309.07927
- Babu, A., et al. (2022). XLS-R: Self-supervised cross-lingual speech representation learning at scale. Interspeech. arXiv:2111.09296
- Baevski, A., Zhou, Y., Mohamed, A., Auli, M. (2020). wav2vec 2.0. NeurIPS. arXiv:2006.11477
- Baghel, S., et al. (2023). The DISPLACE challenge 2023. Interspeech. arXiv:2303.00830
- Bali, K., Sharma, J., Choudhury, M., Vyas, Y. (2014). “I am borrowing ya mixing?” CodeSwitch Workshop. ACL
- Barras, C., Le, V.-B., Gauvain, J.-L. (2020). Vocapia-LIMSI system for the 2020 shared task on code-switched spoken language identification. WSTCSMC 2020.
- Barański, M., Jasiński, J., Bartolewska, J., Kacprzak, S., Witkowski, M., Kowalczyk, K. (2025). Investigation of Whisper ASR hallucinations induced by non-speech audio. ICASSP. arXiv:2501.11378
- Bartley, T., et al. (2023). Accidental learners: Spoken language identification in multilingual self-supervised models. ICASSP. arXiv:2211.05103
- Belinkov, Y. (2022). Probing classifiers: Promises, shortcomings, and advances. Computational Linguistics 48(1). doi
- Belrose, N., et al. (2023). LEACE: Perfect linear concept erasure in closed form. NeurIPS. arXiv:2306.03819
- Bengio, S., Vinyals, O., Jaitly, N., Shazeer, N. (2015). Scheduled sampling for sequence prediction. NeurIPS. arXiv:1506.03099
- Bengio, Y., Louradour, J., Collobert, R., Weston, J. (2009). Curriculum learning. ICML. doi
- Bhogale, K. S., et al. (2025). Towards bringing parity in pretraining datasets for low-resource Indian languages. ICASSP. MahaDhwani model card
- Brown, T., et al. (2020). Language models are few-shot learners. NeurIPS. arXiv:2005.14165
- Chen, W., et al. (2023). Improving massively multilingual ASR with auxiliary CTC objectives. ICASSP. arXiv:2302.12829
- Chu, Y., et al. (2023). Qwen-Audio. arXiv:2311.07919
- Chung, Y.-A., et al. (2021). w2v-BERT. ASRU. arXiv:2108.06209
- Conneau, A., et al. (2020). Unsupervised cross-lingual representation learning at scale. ACL. arXiv:1911.02116
- Conneau, A., Baevski, A., Collobert, R., Mohamed, A., Auli, M. (2021). Unsupervised cross-lingual representation learning for speech recognition. Interspeech. arXiv:2006.13979
- Conneau, A., et al. (2023). FLEURS. SLT. arXiv:2205.12446
- Coupé, C., Oh, Y. M., Dediu, D., Pellegrino, F. (2019). Different languages, similar encoding efficiency. Science Advances. doi
- Cui, Y., Jia, M., Lin, T.-Y., Song, Y., Belongie, S. (2019). Class-balanced loss based on effective number of samples. CVPR. arXiv:1901.05555
- Dehak, N., Torres-Carrasquillo, P. A., Reynolds, D., Dehak, R. (2011). Language recognition via i-vectors and dimensionality reduction. Interspeech. ISCA
- Del Rio, M., et al. (2022). Earnings-22. Interspeech. arXiv:2203.15591
- Deng, J., Guo, J., Xue, N., Zafeiriou, S. (2019). ArcFace. CVPR. arXiv:1801.07698
- Desplanques, B., Thienpondt, J., Demuynck, K. (2020). ECAPA-TDNN. Interspeech. arXiv:2005.07143
- Dey, S., Saha, G., Sahidullah, M. (2021). Cross-corpora language recognition: A preliminary investigation with Indian languages. EUSIPCO.
- Dey, S., Sahidullah, M., Saha, G. (2022). An overview of Indian spoken language recognition from a machine learning perspective. ACM TALLIP. arXiv:2212.03812
- Emeneau, M. B. (1956). India as a linguistic area. Language 32(1).
- Fernandes, S., Choudhary, N. (2026). Anuvani-LID: Robust and calibrated spoken language identification for Indian languages. Preprint.
- Frieske, R., Shi, B. E. (2024). Hallucinations in neural automatic speech recognition. arXiv:2401.01572
- Geirhos, R., et al. (2020). Shortcut learning in deep neural networks. Nature Machine Intelligence. arXiv:2004.07780
- Ginjala, S., Fosler-Lussier, E., Myers, C. W., Parthasarathy, S. (2026). Do LLM decoders listen fairly? Benchmarking how language model priors shape bias in speech recognition. arXiv:2604.21276
- Graves, A., Fernández, S., Gomez, F., Schmidhuber, J. (2006). Connectionist temporal classification. ICML. PDF
- Grierson, G. A. (1905, 1916). Linguistic Survey of India, Vols. VII and IX(1).
- Gulati, A., et al. (2020). Conformer. Interspeech. arXiv:2005.08100
- Guo, C., Pleiss, G., Sun, Y., Weinberger, K. Q. (2017). On calibration of modern neural networks. ICML. arXiv:1706.04599
- Hammarström, H., et al. (2026). Glottolog 5.3.
- Houlsby, N., et al. (2019). Parameter-efficient transfer learning for NLP. ICML. arXiv:1902.00751
- Howard, J., Ruder, S. (2018). Universal language model fine-tuning for text classification. ACL. doi
- Hu, E. J., et al. (2022). LoRA: Low-rank adaptation of large language models. ICLR. arXiv:2106.09685
- India, M., Safari, P., Hernando, J. (2019). Self multi-head attention for speaker recognition. Interspeech. arXiv:1906.09890
- Izmailov, P., Podoprikhin, D., Garipov, T., Vetrov, D., Wilson, A. G. (2018). Averaging weights leads to wider optima and better generalization. UAI. arXiv:1803.05407
- Javed, T., et al. (2022). Towards building ASR systems for the next billion users. AAAI. arXiv:2111.03945
- Javed, T., et al. (2023). IndicSUPERB. AAAI. arXiv:2208.11761
- Javed, T., et al. (2024). IndicVoices. Findings of ACL. arXiv:2403.01926
- Jia, F., Koluguri, N. R., Balam, J., Ginsburg, B. (2023). A compact end-to-end model with local and global context for spoken language identification. Interspeech. arXiv:2210.15781
- Kachru, B. B. (1983). The Indianization of English. Oxford University Press.
- Kachru, Y. (2008). Hindi–Urdu–Hindustani. In Language in South Asia. Cambridge University Press.
- Kahali, S., et al. (2026). Understanding multilingual medical ASR adaptation through layer-wise analysis. arXiv:2608.18825
- Kalluri, S. B., et al. (2024). The second DISPLACE challenge. Interspeech. arXiv:2406.09494
- Kannan, A., et al. (2019). Large-scale multilingual speech recognition with a streaming end-to-end model. Interspeech. arXiv:1909.05330
- Kendall, A., Gal, Y., Cipolla, R. (2018). Multi-task learning using uncertainty to weigh losses. CVPR. arXiv:1705.07115
- Kiela, D., et al. (2021). Dynabench. NAACL. arXiv:2104.14337
- Kim, H., Joshi, K., Zhou, L., Golik, P., Aleksic, P. (2026). Are you speaking my languages? On spoken language adherence in multimodal LLMs. arXiv:2606.17281
- King, C. R. (1994). One Language, Two Scripts: The Hindi Movement in Nineteenth Century North India. Oxford University Press.
- Ko, T., Peddinti, V., Povey, D., Khudanpur, S. (2015). Audio augmentation for speech recognition. Interspeech.
- Ko, T., et al. (2017). A study on data augmentation of reverberant speech for robust speech recognition. ICASSP. IEEE
- Koenecke, A., et al. (2024). Careless Whisper: Speech-to-text hallucination harms. FAccT. arXiv:2402.08021
- Kogan, A. I. (2016). Genealogical classification of New Indo-Aryan languages and lexicostatistics. Journal of Language Relationship 14(3–4).
- Koluguri, N. R., et al. (2025). Granary. arXiv:2505.13404
- Kornblith, S., Norouzi, M., Lee, H., Hinton, G. (2019). Similarity of neural network representations revisited. ICML. arXiv:1905.00414
- Kukk, K., Alumäe, T. (2022). Improving language identification of accented speech. Interspeech. arXiv:2203.16972
- Kumar, M. P., Packer, B., Koller, D. (2010). Self-paced learning for latent variable models. NIPS. papers.nips.cc
- Kumar, S., et al. (2025). ASR under the stethoscope. arXiv:2512.10967
- Kwok, C. Y., Yip, J. Q., Chng, E. S. (2024). Continual learning with embedding layer surgery and task-wise beam search using Whisper. SLT. arXiv:2501.07875
- Le-Duc, K., et al. (2025). MultiMed: Multilingual medical speech recognition. ACL Industry. arXiv:2409.14074
- Lee, Y., et al. (2023). The 2022 NIST language recognition evaluation. Interspeech. arXiv:2302.14624
- Li, H., Ma, B., Lee, K. A. (2013). Spoken language recognition: From fundamentals to practice. Proceedings of the IEEE 101(5). IEEE
- Li, J., et al. (2025). Efficient multilingual ASR finetuning via LoRA language experts. Interspeech. arXiv:2506.21555
- Li, X., et al. (2023). YODAS. ASRU. arXiv:2406.00899
- Liao, F.-T., et al. (2023). Zero-shot domain-sensitive speech recognition with prompt-conditioning fine-tuning. ASRU. arXiv:2307.10274
- Lin, T.-Y., Goyal, P., Girshick, R., He, K., Dollár, P. (2017). Focal loss for dense object detection. ICCV. arXiv:1708.02002
- Lopez-Moreno, I., et al. (2014). Automatic language identification using deep neural networks. ICASSP. Google Research
- Loshchilov, I., Hutter, F. (2019). Decoupled weight decay regularization. ICLR. arXiv:1711.05101
- Mahanta, S. (2012). Assamese. Journal of the International Phonetic Association 42(2).
- Masica, C. P. (1972). The Sound System of Indian English. CIEFL, Hyderabad.
- Masica, C. P. (1976). Defining a Linguistic Area: South Asia. University of Chicago Press.
- Mehler, J., et al. (1988). A precursor of language acquisition in young infants. Cognition 29(2). PubMed
- Menon, A. K., et al. (2021). Long-tail learning via logit adjustment. ICLR. arXiv:2007.07314
- Mukhoti, J., et al. (2020). Calibrating deep neural networks using focal loss. NeurIPS. arXiv:2002.09437
- Okabe, K., Koshinaka, T., Shinoda, K. (2018). Attentive statistics pooling for deep speaker embedding. Interspeech. arXiv:1803.10963
- Olivier, R., Raj, B. (2023). There is more than one kind of robustness: Fooling Whisper with adversarial examples. Interspeech. arXiv:2210.17316
- Omnilingual ASR team, Meta (2025). Omnilingual ASR: Open-source multilingual speech recognition for 1600+ languages. arXiv:2511.09690
- Papyan, V., Han, X. Y., Donoho, D. L. (2020). Prevalence of neural collapse during the terminal phase of deep learning training. PNAS. arXiv:2008.08186
- Park, D. S., et al. (2019). SpecAugment. Interspeech. arXiv:1904.08779
- Pasad, A., Chou, J.-C., Livescu, K. (2021). Layer-wise analysis of a self-supervised speech representation model. ASRU. arXiv:2107.04734
- Pasad, A., Shi, B., Livescu, K. (2023). Comparative layer-wise analysis of self-supervised speech models. ICASSP. arXiv:2211.03929
- Peng, P., Yan, B., Watanabe, S., Harwath, D. (2023). Prompting the hidden talent of web-scale speech models for zero-shot task generalization. Interspeech. arXiv:2305.11095
- Peng, Y., et al. (2023). Reproducing Whisper-style training using an open-source toolkit and publicly available data. ASRU. arXiv:2309.13876
- Peng, Y., et al. (2025). OWSM v4: Improving open Whisper-style speech models via data scaling and cleaning. Interspeech. arXiv:2506.00338
- Peters, M. E., et al. (2018). Deep contextualized word representations. NAACL. arXiv:1802.05365
- Platanios, E. A., et al. (2019). Competence-based curriculum learning for neural machine translation. NAACL. arXiv:1903.09848
- Pratap, V., et al. (2024). Scaling speech technology to 1,000+ languages. JMLR 25(97). arXiv:2305.13516
- Qian, M., Tang, S., Ma, R., Knill, K. M., Gales, M. J. F. (2024). Learn and don’t forget: Adding a new language to ASR foundation models. Interspeech. arXiv:2407.06800
- Qwen Team (2025). Qwen3-Omni technical report. arXiv:2509.17765
- Qwen Team (2026). Qwen3-ASR technical report. arXiv:2601.21337
- Qwen Team (2026). Qwen3.5-Omni technical report. arXiv:2604.15804
- Radford, A., et al. (2019). Language models are unsupervised multitask learners. OpenAI
- Radford, A., et al. (2023). Robust speech recognition via large-scale weak supervision. ICML. arXiv:2212.04356
- Raffel, C., et al. (2020). Exploring the limits of transfer learning with a unified text-to-text transformer. JMLR. arXiv:1910.10683
- Raina, V., et al. (2024). Muting Whisper: A universal acoustic adversarial attack on speech foundation models. EMNLP. ACL
- Rahman, H. (2026). Benchmarking multilingual speech models on Pashto: Zero-shot ASR, script failure, and cross-domain evaluation. arXiv:2604.04598
- Ramus, F., Nespor, M., Mehler, J. (1999). Correlates of linguistic rhythm in the speech signal. Cognition 73(3). PubMed
- Ranzato, M., Chopra, S., Auli, M., Zaremba, W. (2016). Sequence level training with recurrent neural networks. ICLR. arXiv:1511.06732
- Sadjadi, S. O., et al. (2018). The 2017 NIST language recognition evaluation. Odyssey. ISCA
- Sener, O., Koltun, V. (2018). Multi-task learning as multi-objective optimization. NeurIPS. arXiv:1810.04650
- Shon, S., et al. (2020). ADI17: A fine-grained Arabic dialect identification dataset. ICASSP. IEEE
- Shivakumar, P. G., Gu, Y., Gandhe, A., Bulyko, I. (2025). Group relative policy optimization for speech recognition. ASRU. arXiv:2509.01939
- Snyder, D., Chen, G., Povey, D. (2015). MUSAN: A music, speech, and noise corpus. arXiv:1510.08484
- Snyder, D., et al. (2018). Spoken language recognition using x-vectors. Odyssey. PDF
- Song, Z., et al. (2024). LoRA-Whisper: Parameter-efficient and extensible multilingual ASR. Interspeech. arXiv:2406.06619
- Szegedy, C., Vanhoucke, V., Ioffe, S., Shlens, J., Wojna, Z. (2016). Rethinking the Inception architecture for computer vision. CVPR. arXiv:1512.00567
- Thomason, S. G. (2000). Linguistic areas and language history. In Languages in Contact. Brill.
- Toshniwal, S., et al. (2018). Multilingual speech recognition with a single end-to-end model. ICASSP. arXiv:1711.01694
- Valk, J., Alumäe, T. (2021). VoxLingua107. SLT. arXiv:2011.12998
- van Doorn, J., et al. (2024). Whisper-ATC: Open models for air traffic control ASR with accuracy. ICRAT. TU Delft
- Voxtral team, Mistral AI (2025). Voxtral. arXiv:2507.13264
- Wang, F., Cheng, J., Liu, W., Liu, H. (2018). Additive margin softmax for face verification. IEEE Signal Processing Letters. arXiv:1801.05599
- Wang, Z., Lipton, Z. C., Tsvetkov, Y. (2020). On negative interference in multilingual models. EMNLP. arXiv:2010.03017
- Watanabe, S., Hori, T., Hershey, J. R. (2017). Language independent end-to-end architecture for joint language identification and speech recognition. ASRU.
- Wiltshire, C. R., Harnsberger, J. D. (2006). The influence of Gujarati and Tamil L1s on Indian English. World Englishes 25(1).
- Wortsman, M., et al. (2022). Model soups. ICML. arXiv:2203.05482
- Yan, B., Pratap, V., Watanabe, S., Auli, M. (2024). Improving multilingual ASR in the wild using simple N-best re-ranking. arXiv:2409.18428
- Yang, C.-K., Huang, K.-P., Lee, H.-y. (2024). Do prompts really prompt? Exploring the prompt understanding capability of Whisper. SLT. arXiv:2406.05806
- Yang, S.-w., et al. (2021). SUPERB. Interspeech. arXiv:2105.01051
- Yu, T., et al. (2020). Gradient surgery for multi-task learning. NeurIPS. arXiv:2001.06782
- Zissman, M. A. (1996). Comparison of four approaches to automatic language identification of telephone speech. IEEE Transactions on Speech and Audio Processing 4(1). IEEE
Government, standards and industry sources
- Census of India 2011: Table C-17, bilingualism and trilingualism; Paper 1 of 2018, Language (Table C-16).
- Department of Agriculture & Farmers Welfare. Kisan Call Centres.
- ITU-T (1988). G.711: Pulse code modulation of voice frequencies.
- Ministry of Home Affairs (2017). Constitutional provisions relating to the Eighth Schedule.
- Parliament of India (1963). The Official Languages Act.
- Press Information Bureau (2026). Bhashini; Tele-MANAS.
- Telecom Regulatory Authority of India (2026). Telecom subscription data, July 2026.
- Vendor documentation: AssemblyAI, AWS Transcribe, Azure AI Speech, Google Chirp 3, Mistral Voxtral, NVIDIA NIM, Sarvam, Speechmatics; fetched 29 Sep 2026.
- Engineering write-ups: Adalat AI on Whisper’s token limit; Hugging Face Whisper fine-tuning guide; WebRTC.ventures, The voice AI latency budget.
- Datasets and code: IISc Vaani; Omnilingual ASR repository; openai/whisper tokenizer.py, decoding.py, transcribe.py; WhisperX asr.py.
- Issue threads: openai/whisper #1160, #1662, #2285, #2419; whisper.cpp #1104; Hugging Face transformers #27937 and PR #29688; livekit/agents #1335; pipecat #5691; openai-realtime-agents #46.