<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tapnanshu Malhotra</title>
    <description>The latest articles on DEV Community by Tapnanshu Malhotra (@tapnanshu_malhotra_055099).</description>
    <link>https://dev.to/tapnanshu_malhotra_055099</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4079006%2Faea7538c-d799-45d2-a2ec-2a60866bed7e.jpg</url>
      <title>DEV Community: Tapnanshu Malhotra</title>
      <link>https://dev.to/tapnanshu_malhotra_055099</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tapnanshu_malhotra_055099"/>
    <language>en</language>
    <item>
      <title>Building a Voice Agent for Government Scheme Access — 10 Days of Voice Agents, VoiceForBharat Edition</title>
      <dc:creator>Tapnanshu Malhotra</dc:creator>
      <pubDate>Sat, 15 Aug 2026 13:23:42 +0000</pubDate>
      <link>https://dev.to/tapnanshu_malhotra_055099/building-a-voice-agent-for-government-scheme-access-10-days-of-voice-agents-voiceforbharat-9am</link>
      <guid>https://dev.to/tapnanshu_malhotra_055099/building-a-voice-agent-for-government-scheme-access-10-days-of-voice-agents-voiceforbharat-9am</guid>
      <description>&lt;p&gt;The problem and the users&lt;/p&gt;

&lt;p&gt;Millions of people in India are eligible for government welfare schemes — pensions, subsidies, insurance — but never find out, because the process to check eligibility assumes a smartphone, a data plan, and comfort reading government portals in English. A phone call, in the caller's own language, is a much lower bar.&lt;/p&gt;

&lt;p&gt;I built a Financial Services voice agent that a caller can dial into, speak naturally (English, Hindi, or code-mixed Hinglish), and either:&lt;/p&gt;

&lt;p&gt;get an eligibility check done for a specific government scheme, or&lt;br&gt;
reach a human when the agent hits its limits — a fraud report, or a decision it isn't authorized to make.&lt;/p&gt;

&lt;p&gt;What the voice agent does&lt;/p&gt;

&lt;p&gt;A caller connects (via LiveKit, browser or SIP), talks to the main assistant, and:&lt;/p&gt;

&lt;p&gt;Is recognized if they've called before, or the agent asks for consent to remember them for next time.&lt;br&gt;
Gets help with everyday questions directly from the main agent.&lt;br&gt;
Is hooked up with the Government Scheme Specialist — a separate, narrowly-scoped agent — the moment the conversation turns to scheme eligibility or required documents.&lt;br&gt;
Can be escalated to a human teammate if the issue is fraud, or a decision the agent isn't authorized to make — with the caller's explicit consent on what gets shared.&lt;/p&gt;

&lt;p&gt;Every call's outcome (success or failure against a clear definition, not "did an error happen") is logged and shown on a live dashboard.&lt;/p&gt;

&lt;p&gt;How the system works&lt;/p&gt;

&lt;p&gt;Standard voice-agent pipeline, built on the Murf LiveKit Starter:&lt;/p&gt;

&lt;p&gt;STT — Deepgram (nova-3, multilingual)&lt;br&gt;
LLM — Google Gemini&lt;br&gt;
TTS — Murf Falcon, switching voice/locale live between en-IN-anisha and hi-IN-anisha based on whether the caller's speech is detected as Hindi/Hinglish (Devanagari script or common Hindi keywords) or English&lt;br&gt;
Transport — LiveKit real-time rooms, with telephony-specific noise cancellation for SIP callers vs. browser callers&lt;br&gt;
Turn detection — LiveKit's multilingual turn-detection model&lt;/p&gt;

&lt;p&gt;The most important features&lt;/p&gt;

&lt;p&gt;An Indian voice powered by Murf Falcon, switching language live mid-call so the caller never has to pick a language up front.&lt;/p&gt;

&lt;p&gt;Memory for returning callers — with explicit consent asked before anything is saved, and hard rules against ever storing OTPs, PINs, account numbers, or passwords, even if the caller offers them.&lt;/p&gt;

&lt;p&gt;Human escalation — the agent tries to help first, states plainly what it will and won't send to a human before escalating, and gives the caller a spoken reference ID. Escalation is reserved for fraud reports and decisions the agent isn't authorized to make — not a catch-all.&lt;/p&gt;

&lt;p&gt;Handoff to a specialist agent — the main agent recognizes when a question is really about government scheme eligibility, tells the caller it's connecting them ("I'll connect you to our government scheme specialist"), and hands off the same conversation — the specialist doesn't ask the caller to repeat themselves. If the conversation drifts back to something outside its scope, it hands back just as cleanly.&lt;/p&gt;

&lt;p&gt;A call analytics dashboard — every call is logged as in_progress → success | failed against one clear definition (an eligibility check completed, a document list delivered, or an escalation created — not just "the call happened without crashing"). The dashboard shows total/successful/failed calls, served on the same port as the backend, with no transcripts, PII, or call content — only aggregate counts.&lt;/p&gt;

&lt;p&gt;Challenges and how I overcame them&lt;/p&gt;

&lt;p&gt;How readers can build their own&lt;br&gt;
Start from the base pipeline. You need four pieces: speech-to-text (I used Deepgram), an LLM (Google Gemini), text-to-speech (Murf Falcon), and a real-time transport layer to move audio between the caller and the model (LiveKit).&lt;br&gt;
Clone the starter and set up locally:&lt;br&gt;
bash&lt;br&gt;
   git clone &lt;a href="https://github.com/Tapnanshu045/murf-livekit-starter" rel="noopener noreferrer"&gt;https://github.com/Tapnanshu045/murf-livekit-starter&lt;/a&gt;&lt;br&gt;
   cd murf-livekit-starter/backend&lt;br&gt;
   uv sync&lt;br&gt;
Add your API keys in a .env.local file in backend/ — never commit this file. At minimum you'll need keys for Murf, Deepgram, and your LLM provider, plus your LiveKit project credentials.&lt;br&gt;
Run it and connect:&lt;br&gt;
bash&lt;br&gt;
   uv run python src/agent.py dev&lt;/p&gt;

&lt;p&gt;Then connect through the LiveKit frontend playground or your own frontend, and have a conversation to test it end-to-end.&lt;/p&gt;

&lt;p&gt;Layer in one capability at a time — memory, escalation, a dashboard, a specialist handoff — the same way this challenge built them up over ten days, rather than all at once.&lt;/p&gt;

&lt;p&gt;Full source: &lt;a href="https://github.com/Tapnanshu045/murf-livekit-starter" rel="noopener noreferrer"&gt;https://github.com/Tapnanshu045/murf-livekit-starter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I'd improve next&lt;/p&gt;

&lt;p&gt;Links and demos&lt;br&gt;
Repo: &lt;a href="https://github.com/Tapnanshu045/murf-livekit-starter" rel="noopener noreferrer"&gt;https://github.com/Tapnanshu045/murf-livekit-starter&lt;/a&gt;&lt;br&gt;
Challenge: &lt;a href="https://github.com/murf-ai/voice-for-bharat-challenge-2026" rel="noopener noreferrer"&gt;https://github.com/murf-ai/voice-for-bharat-challenge-2026&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
