Most case studies ask you to trust the numbers. This one doesn't: the system it describes is live on this site. A customer-support voice agent for financial services that speaks Hindi, Tamil, and English — and switches when the caller does, mid-sentence. Talk to it first, then read how it works.
// FULL DISCLOSURE — this is our own reference implementation, not client work. We built it to prove the pattern before selling it. Every number below comes from our test bench, and you can generate your own by calling the agent.
A support call in Indian financial services rarely stays in one language. Callers open in Hindi, quote an SMS in English, and switch to Tamil when the topic gets stressful. Traditional voice systems force a language choice at menu level — press 1 for English — and lose the caller the moment they drift.
Everything is designed backwards from one number: the caller should hear a voice within a second of finishing their sentence. The stack we deploy for clients runs on LiveKit Agents over WebRTC, with our own fine-tuned open-source STT and TTS models per language and use case — so the models, the weights, and the latency are ours to control. Each stage gets a slice of the budget and is streamed, never batched.
The transcript panel in the demo labels every message with the language it arrived in. The detection is deliberately boring: Unicode ranges first, model-based detection only when script is ambiguous. Boring is fast, and fast is what a live transcript needs.
// Script detection — from the shipped demo
const DEVANAGARI = /[\u0900-\u097F]/; // हिन्दी
const TAMIL = /[\u0B80-\u0BFF]/; // தமிழ்
function detectLang(text: string) {
if (DEVANAGARI.test(text)) return 'hi';
if (TAMIL.test(text)) return 'ta';
return 'en';
}On a phone call, dead air means something broke. The demo treats audio cues as part of the product: a ringback loop while connecting, a soft click on actions, a proper hangup tone at the end. People trust calls that sound like calls.
Ringback while connecting
WebRTC session setup takes a moment. A familiar ring fills it, so nobody wonders whether the button worked.
State-driven, race-safe
Sounds are driven by the call state machine, with an explicit fix for the connect/hangup race — the ring can never keep looping over a live conversation.
Survives development reality
The Howler registry is cached on globalThis so hot reloads and strict mode don't double-register audio — small engineering that keeps the demo dependable.
A real ending
Calls end with a hangup tone, not an abrupt cut. Endings are where support interactions are judged.
These are measurements from our own test bench and browser sessions — labeled as such on purpose. Client production numbers belong to clients; yours would come from .
The demo runs in your browser — no sign-up, no phone number. If it holds up to your interruptions, imagine it trained on your products, your policies, and your customers' languages.
30 minutes with the engineer who built this demo. A founder replies within 2 days — no cold calls, no newsletter, no handoff to sales.