Voice ·
Why voice agents fail on Hindi-English code-switching
A voice pipeline usually picks a language once, at the start of the call. Indian callers switch inside a single clause, and every component downstream of that decision inherits the error.
Voice agents fail on Hindi-English speech because the pipeline makes one language decision per call while the caller makes several per sentence. Everything downstream of that decision inherits the error: the transcript is wrong, so the intent match is wrong, so the retrieval is wrong, so the answer is wrong, and the only visible symptom is a customer repeating themselves. The published figures agree that this is a measurement problem before it is a model problem — the HiACC corpus paper (Data in Brief, volume 62, article 111886, July 2025) reports that ASR systems see a 30 to 50 per cent increase in word error rate on code-switched speech compared with monolingual speech.
What Indian code-switching actually looks like to a recogniser
The switching is intra-sentential. English nouns and verbs sit inside Hindi syntax within a single clause, which means there is no point in the audio where a language boundary can be cleanly detected and acted on.
A caller asking to reverse a failed payment will produce something structurally like: Hindi pronoun, English noun phrase, Hindi verb, English number, Hindi auxiliary. There is no pause at the switch. The switch happens mid-phrase, sometimes mid-compound, and the English words carry Indian phonology rather than the pronunciation the acoustic model was trained on.
This matters because most production stacks expose a single language hint per session. Set it to Hindi and English terms are transcribed phonetically into Devanagari, so a product name becomes a nonsense word your intent classifier has never seen. Set it to English and the Hindi is rendered as approximate English syllables, which is worse, because the resulting string looks like valid text and passes silently into the next stage.
The HiACC authors report baselines on their own test set that give a sense of the spread between systems: Whisper medium at 16 per cent word error rate for adults and 18 per cent for children, MMS-1b-all at 31 and 36 per cent, and wav2vec2-XLS-R-300M at 38 and 40 per cent. Two things follow. Model choice does matter here, more than it does in retrieval. And the same corpus is 5.24 hours in total, which tells you how thin publicly available code-switched Indian audio still is.
Script inconsistency breaks everything downstream of the transcript
The same sentence can arrive as Devanagari, as romanised Hindi, or as a mixture, depending on the recogniser and the utterance. Any component that compares strings will treat these as unrelated inputs unless you normalise first.
An intent classifier trained on romanised transcripts sees Devanagari as entirely out of vocabulary. A retrieval index built from Devanagari documents will not match a romanised query. A rule that looks for a keyword will fire on one spelling and not the other, and there are many spellings — romanised Hindi has no standard orthography, so the same word appears with several vowel patterns across a single day's traffic.
Normalise into one canonical form before anything reads the transcript. Transliteration in both directions, a mapping table for the words your domain actually uses, and fuzzy matching tuned for the substitutions that transliteration produces. Then index your knowledge base in the canonical form as well, so query and document meet in the same space.
The cheap diagnostic is worth running before any of this. Take a hundred calls the agent handled badly, read the transcripts against the audio, and mark each failure as a recognition error, a normalisation error, a retrieval miss or a generation error. In deployments we have worked on, the balance is nothing like what the team expected, and the fix is almost never the one that was about to be funded.
- One canonical script for transcripts, queries and indexed documents
- A transliteration mapping for domain vocabulary, maintained as data rather than code
- Fuzzy matching tuned for transliteration substitutions, not for typing typos
Numbers are where Indian voice agents break most often
Digit strings carry the highest cost of any token in a support call and the highest error rate. Account numbers, amounts and dates are spoken in mixed language, with Indian shorthand that generic normalisers do not implement.
A caller reading a reference number will say double and triple for repeated digits. An amount may arrive as an English numeral, as Hindi words, as a mixture, or in lakh and crore units that a normaliser trained on Western conventions will convert wrongly or not at all. Dates alternate between formats within the same sentence. None of this is exotic; it is the ordinary content of a support call.
Build a numeric normaliser as an explicit component with its own test set, not as a regular expression at the end of a prompt. It needs Indian units, repetition shorthand, mixed-language digit sequences and currency handling. Then verify the result rather than trusting it: read the number back to the caller and require confirmation before any action that depends on it. Read-back is unfashionable because it costs a turn. It is also the single highest-value reliability feature in an Indian voice deployment, and human agents do it for the same reason.
Named entities have the same shape of problem. Indian personal names, place names and branch names are mangled by recognisers trained predominantly on other data. The fix is contextual biasing: pass the caller's own name, city, recent transaction merchants and relevant product names as bias phrases when the session opens, so the recogniser is weighted towards the small set of strings that are actually plausible for this call. Most commercial ASR services support some form of this, and it is routinely left unused.
- A tested numeric normaliser: lakh and crore, repetition shorthand, mixed-language digits
- Read-back and explicit confirmation before any action keyed on a number
- Contextual biasing from the caller's own record at session start
- A pronunciation lexicon for your domain terms, applied to both recognition and speech output
Endpointing tuned on English speech cuts bilingual callers off
Code-switchers pause mid-sentence while retrieving a word in the other language. Voice activity detection thresholds tuned on monolingual English speech read that pause as the end of the turn and interrupt the caller.
This is the failure customers describe as the bot not letting them finish, and it is not a language model problem at all. The pause distribution is genuinely different: a bilingual speaker searching for a term produces a hesitation in the middle of a clause that is longer than a typical English inter-word gap and shorter than a completed turn. Fixed silence thresholds cannot separate the two.
What helps is treating endpointing as tunable per deployment and measuring it directly. Instrument two counters: how often the agent starts speaking while the caller is still mid-sentence, and how long the caller waits after finishing before the agent responds. Those trade against each other and the right point is a product decision, not a default. Barge-in handling matters just as much — callers who have been interrupted once start talking over the agent, and a system that cannot be interrupted turns a recoverable call into an abandoned one.
Latency is the constraint that shapes everything else. A cascaded pipeline spends time on recognition, then normalisation, then retrieval, then generation, then speech synthesis, and every millisecond added between the caller finishing and the agent starting is heard as hesitation. That budget decides how much retrieval you can afford mid-call and what has to be precomputed before the call connects. Speech-to-speech models remove several hops and much of the latency, at the cost of the intermediate transcript — which for a regulated deployment is often the artefact you most need to keep, for the reasons set out in RBI data residency and calling an external LLM.
Word error rate is the wrong target
A system with a higher overall word error rate that never mangles an account number is more useful than a system with a lower one that occasionally does. Score the entities that carry the task, not the average token.
Overall word error rate averages over filler words, greetings and the parts of the utterance no downstream component reads. It is a reasonable research metric and a poor operational one. What we track instead is entity-level accuracy on the fields that drive actions — numbers, names, product identifiers, dates — and task success end to end, which is the only measure the business recognises.
Build the test set from your own recordings, with consent and a lawful basis, transcribed by people who speak the way your callers speak. Public code-switched corpora are useful for sanity checks and too small to tune against; HiACC, one of the better documented, holds 5.24 hours from 44 speakers. Your own call centre generates more than that in an afternoon, in your domain and your accents.
Stratify deliberately: pure Hindi, pure English, heavy switching, background noise, poor line quality, elderly and young speakers, regional accents. Report per stratum. An average conceals that the system works for the calls you demonstrated and fails for the ones you receive at four in the afternoon from a market. Same discipline as how to evaluate a RAG system, applied to audio.
- Entity error rate on numbers, names and identifiers as the primary metric
- Task success and escalation rate as the business-facing pair
- Stratified reporting by language mix, line quality and speaker group
- Your own consented recordings as the test set, because public corpora are small
What we will not promise
We will not quote you a word error rate or a containment percentage before hearing your audio. Any number offered at that stage is drawn from someone else's data, and the gap between a benchmark corpus and a live queue is the whole problem this article describes.
What we will do is run a measurement phase first: take a sample of your real calls, build a stratified test set, measure recognition and entity accuracy on the pipeline as it stands, and produce a written baseline. Then the argument about which components to change becomes an argument about numbers rather than preferences, and you can decide whether the improvement is worth the money before committing to it.
The order of work that has held up across deployments is roughly this. Fix normalisation and contextual biasing first, because they are cheap and they move entity accuracy immediately. Tune endpointing next, because interruption drives abandonment. Then look at the recogniser itself, and only then at the language model. A better model applied to a transcript that lost the account number is money spent on the wrong layer.
One further constraint worth stating early: a voice agent should have an escalation path from the first day it takes a call, and the cost of that path belongs in the business case. An agent that handles most of the routine calls leaves human agents with only the difficult ones, which take longer each. Modelling the saving as a flat percentage of call volume overstates it — a point covered in more detail in the gap between an AI demo and something that runs unattended.
Sources
Every regulatory or measured claim above is attributed here. Where we could not find a source we trust, the sentence says so instead of guessing.
- HiACC: Hinglish adult and children code-switched corpus — Data in Brief, volume 62, article 111886 (July 2025) · 30 to 50 per cent WER increase on code-switched speech; corpus size and model baselines
Questions people ask about this
Why does the agent work in testing and fail on real calls?
Testing is usually done by the team that built it, speaking clearly, on good lines, in one language at a time, with vocabulary the system already knows. Real calls have background noise, poor connections, intra-sentential switching, regional accents and names the recogniser has never seen. Build the test set from recorded production calls and the gap closes, because you are then measuring the thing you deployed.
Should we use a multilingual model or a Hindi model with English support?
Measure both on your own audio; the answer varies by domain and by line quality more than the marketing suggests. The published HiACC baselines show a wide spread between systems on the same test set, from 16 per cent word error rate up to 38 for adult speech, which is a large enough gap that model selection is worth doing empirically rather than by reputation.
How much code-switched training data do we need?
For fine-tuning a recogniser, more than any public Indian corpus currently offers. For evaluating one, a few hundred well-chosen and carefully transcribed calls will already tell you where you stand. Start with evaluation, because it is cheaper and it tells you whether fine-tuning is the constraint at all.
Does a speech-to-speech model solve code-switching?
It removes some pipeline joins and a great deal of latency, which helps with the interruption problems. It does not remove the need for entity accuracy, and it takes away the intermediate transcript that audit, evaluation and dispute handling all depend on. For regulated deployments that trade-off usually decides the architecture.
Related
Where this connects
AI Voice Agent Development
Voice agents that handle calls in Hindi, Marathi, Tamil and English.
WhatsApp Business API & CRM Automation
The implementation layer above WhatsApp Business API, where the SaaS tools stop.
AI Appointment & Reminder Systems
Booking, reminders and no-show recovery, running on WhatsApp and voice.
Read next: The gap between an AI demo and something that runs unattended · How to evaluate a RAG system before you trust it in production
More notes on the blog index, and the practical questions about cost, IP and data residency are on the FAQ.
Send us thirty of your worst calls
A measurement phase costs less than a rebuild and usually shows that the expensive fix was not the one needed. Scoping calls are free, and we will tell you if your current vendor is already close enough.