<?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: Taukeer Khan</title>
    <description>The latest articles on DEV Community by Taukeer Khan (@taukeer_khan_ba1ea0dcf645).</description>
    <link>https://dev.to/taukeer_khan_ba1ea0dcf645</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%2F4078507%2Fa2aafc93-b923-4dc0-9f8c-d0bec7e5a12a.jpg</url>
      <title>DEV Community: Taukeer Khan</title>
      <link>https://dev.to/taukeer_khan_ba1ea0dcf645</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/taukeer_khan_ba1ea0dcf645"/>
    <language>en</language>
    <item>
      <title>An AI Voice Assistant for Indian Local Commerce</title>
      <dc:creator>Taukeer Khan</dc:creator>
      <pubDate>Sat, 15 Aug 2026 05:34:09 +0000</pubDate>
      <link>https://dev.to/taukeer_khan_ba1ea0dcf645/an-ai-voice-assistant-for-indian-local-commerce-1lem</link>
      <guid>https://dev.to/taukeer_khan_ba1ea0dcf645/an-ai-voice-assistant-for-indian-local-commerce-1lem</guid>
      <description>&lt;h1&gt;
  
  
  How I Built ShopMitra —
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjsvkh7iv8cja4hyd5w0w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjsvkh7iv8cja4hyd5w0w.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I spent 10 days building a voice agent that helps small grocery store customers check prices, place orders, and get support — entirely by talking. Here's what I learned, what broke, and how you can build your own.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem and the Users
&lt;/h2&gt;

&lt;p&gt;India has over &lt;strong&gt;12 million kirana (neighbourhood grocery) stores&lt;/strong&gt;. Most of them still take orders over phone calls. The store owner answers, checks stock mentally, quotes a price, and scribbles the order on paper. During peak hours, calls go unanswered. Customers give up.&lt;/p&gt;

&lt;p&gt;I wanted to test a simple idea: &lt;strong&gt;what if a voice AI agent could answer those calls — in Hindi, English, or Hinglish — check real prices, remember returning customers, and escalate to a human when it's out of its depth?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's ShopMitra — a voice assistant for &lt;strong&gt;ABC Local Store&lt;/strong&gt;, a fictional kirana store I used as my test bed during the &lt;strong&gt;10 Days of Voice Agents — VoiceForBharat Edition&lt;/strong&gt; challenge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who is it for?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Customers&lt;/strong&gt; who call to ask "Do you have Basmati Rice? How much?" or "I want to return these biscuits."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store owners&lt;/strong&gt; who miss calls during rush hours and want an agent that can handle the basics while they focus on in-person shoppers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why voice?&lt;/strong&gt; Because many Indian shoppers — especially in Tier 2/3 cities — are more comfortable calling than typing into an app. Voice removes the literacy and app-download barrier entirely.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What the Voice Agent Does
&lt;/h2&gt;

&lt;p&gt;ShopMitra can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Greet callers naturally&lt;/strong&gt; — new and returning customers get different greetings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search a product catalogue&lt;/strong&gt; — "Do you have dal?" triggers a tool that looks up live prices and stock.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compute order totals&lt;/strong&gt; — "2 kg rice, 3 litres milk, and 1 kg sugar" → "Your total is ₹462."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remember customers across calls&lt;/strong&gt; — with consent. Next time Ramesh calls, ShopMitra says: "Welcome back! Last time you ordered rice — shall I check stock?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make outbound restock calls&lt;/strong&gt; — "Hi Ramesh, time to restock your Basmati Rice 5 kg?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalate to humans&lt;/strong&gt; — payment disputes and order issues get a ticket with a reference ID, plus a Discord notification to the support team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track call analytics&lt;/strong&gt; — success rates, failure taxonomy, and a live dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hand off to a specialist&lt;/strong&gt; — return/refund requests go to RefundMitra, a specialist agent with a different voice.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  How the System Works
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/.%2Fshopmitra_architecture.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/.%2Fshopmitra_architecture.jpg" alt="ShopMitra Architecture — Real-Time Audio Flow and Ecosystem" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pipeline has four core components:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speech-to-Text&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deepgram Nova-3 (multilingual)&lt;/td&gt;
&lt;td&gt;Converts the caller's voice to text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Google Gemini&lt;/td&gt;
&lt;td&gt;Understands intent, decides which tool to call, generates a response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Text-to-Speech&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Murf Falcon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Converts the response back to natural-sounding Indian English speech (55ms latency!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real-Time Transport&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LiveKit&lt;/td&gt;
&lt;td&gt;Streams audio bidirectionally between the user and the agent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Audio Flow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User speaks → Deepgram STT → Google Gemini LLM → Murf Falcon TTS → LiveKit → User hears
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The LLM doesn't just generate text — it calls &lt;strong&gt;function tools&lt;/strong&gt; (catalogue lookup, order total, escalation, handoff) based on what the caller says. The tools fetch real data and return structured results that the LLM speaks naturally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supporting Infrastructure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQLite database&lt;/strong&gt; — stores user profiles (with consent), escalation tickets, outbound call records, and call analytics. Zero PII in the analytics table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;aiohttp API server&lt;/strong&gt; — serves escalation and analytics data to the frontend dashboards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord webhook&lt;/strong&gt; — pushes real-time notifications when a human-help ticket is created.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twilio/Linphone SIP&lt;/strong&gt; — enables actual phone calls (inbound and outbound) via LiveKit's telephony bridge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js frontend&lt;/strong&gt; — browser-based voice UI plus admin dashboards for escalations and call analytics.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Most Important Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎙️ Indian Voice Powered by Murf Falcon
&lt;/h3&gt;

&lt;p&gt;The agent uses &lt;strong&gt;Murf Falcon&lt;/strong&gt; with the voice &lt;code&gt;Anisha&lt;/code&gt; — an Indian English female voice. The specialist (RefundMitra) uses &lt;code&gt;Priya&lt;/code&gt; so the customer &lt;em&gt;hears&lt;/em&gt; the handoff. With 55ms model latency and ₹0.01 per 1,000 characters, Falcon was the obvious choice for a real-time voice agent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;murf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TTS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;voice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Anisha&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Conversation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tokenize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;basic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SentenceTokenizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min_sentence_len&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;text_pacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧠 Memory for Returning Users
&lt;/h3&gt;

&lt;p&gt;ShopMitra remembers callers across sessions — but only with consent. The system prompt enforces:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"BEFORE saving ANYTHING, explicitly ask the caller for permission."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If Ramesh calls back a week later, the agent greets him by name and offers to reorder what he bought last time. If he says "forget me," the &lt;code&gt;forget_caller&lt;/code&gt; tool wipes his record immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛒 Catalogue and Pricing Tools
&lt;/h3&gt;

&lt;p&gt;Two function-call tools prevent the agent from ever hallucinating a price:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;check_catalogue&lt;/code&gt;&lt;/strong&gt; — fuzzy-searches a 30-item product catalogue. Supports Hindi keywords like "दूध" (milk) and transliterations like "doodh."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;compute_order_total&lt;/code&gt;&lt;/strong&gt; — calculates a line-item breakdown: "2 kg Basmati Rice at ₹240 + 3 litres Milk at ₹180 = ₹420."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the catalogue file is missing or corrupt, the agent says &lt;em&gt;"I'm having trouble checking our system right now"&lt;/em&gt; — it never goes silent and never invents a number.&lt;/p&gt;

&lt;h3&gt;
  
  
  📞 Outbound Restock Calls
&lt;/h3&gt;

&lt;p&gt;The agent can proactively call customers to nudge them to restock. Every outbound call opens with a mandatory 3-part structure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;WHO&lt;/strong&gt; — "This is ShopMitra calling from ABC Local Store."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WHY&lt;/strong&gt; — "I'm calling to check if you'd like to restock Basmati Rice 5 kg."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OPT-OUT&lt;/strong&gt; — "Say 'opt out' to stop these reminders."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Outcomes (connected, busy, voicemail, no answer) are tracked with retry rules. Opt-outs are permanent.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚨 Human Escalation with Consent
&lt;/h3&gt;

&lt;p&gt;Payment disputes and order issues trigger a human escalation flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent acknowledges empathetically.&lt;/li&gt;
&lt;li&gt;Tells the caller &lt;em&gt;exactly&lt;/em&gt; what will be shared (no payment credentials, no OTPs).&lt;/li&gt;
&lt;li&gt;Asks for explicit permission.&lt;/li&gt;
&lt;li&gt;Creates a ticket with a speakable reference ID (e.g., &lt;code&gt;ESC-20260812-0001&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Fires a Discord notification to the support team.&lt;/li&gt;
&lt;li&gt;Deduplicates — if the caller already has an open ticket, it reads back the existing ref ID.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  📊 Call Analytics Dashboard
&lt;/h3&gt;

&lt;p&gt;Every call session is tracked — start time, duration, channel (browser vs SIP), outcome (success/failed), and failure taxonomy (&lt;code&gt;user_hangup&lt;/code&gt;, &lt;code&gt;incomplete_task&lt;/code&gt;, &lt;code&gt;tool_error&lt;/code&gt;, &lt;code&gt;no_response&lt;/code&gt;). The dashboard at &lt;code&gt;/dashboard&lt;/code&gt; shows KPI cards, success rate, failure breakdown, and a live call log. &lt;strong&gt;Zero PII is stored&lt;/strong&gt; — no names, no phone numbers, no transcripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔄 Specialist Agent Handoff
&lt;/h3&gt;

&lt;p&gt;When a customer asks to return a product, the main agent hands off to &lt;strong&gt;RefundMitra&lt;/strong&gt; — a specialist with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its own focused system prompt (return policy, eligibility rules, refund timelines)&lt;/li&gt;
&lt;li&gt;A different Murf voice (&lt;code&gt;Priya&lt;/code&gt; vs &lt;code&gt;Anisha&lt;/code&gt;) so the user hears the switch&lt;/li&gt;
&lt;li&gt;Full conversation context carried over — the customer doesn't repeat themselves
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@function_tool&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;transfer_to_refund_specialist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RunContext&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;refund_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RefundAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;chat_ctx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat_ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exclude_instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;refund_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Let me connect you to our Returns and Refunds Specialist.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Challenges and How I Overcame Them
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Challenge 1: Getting Outbound Calls to Actually Ring
&lt;/h3&gt;

&lt;p&gt;Setting up SIP trunking was the hardest part of the entire challenge. I initially tried Twilio, but my free trial had exhausted its credits. After hours of debugging trunk configurations, I discovered I could use &lt;strong&gt;Linphone&lt;/strong&gt; — a free SIP softphone — as an alternative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; I created a Linphone account, registered an outbound trunk in the LiveKit Cloud dashboard pointing to &lt;code&gt;sip.linphone.org&lt;/code&gt; with TLS transport, and turned off "Media encryption mandatory" in the Linphone app settings. The call rang on my phone within seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Always have a fallback for third-party services. Free tiers expire at the worst possible time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 2: The Agent Hallucinating Prices
&lt;/h3&gt;

&lt;p&gt;Early on, when a customer asked "How much is rice?", the LLM would confidently say "₹80 per kg" — a completely invented number. This is dangerous for a commerce agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; I added hard guardrails in the system prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Never invent product prices — always use &lt;code&gt;check_catalogue&lt;/code&gt;. If the tool returns an error, say you're having trouble."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Combined with the &lt;code&gt;check_catalogue&lt;/code&gt; tool's structured error handling, the agent now either gives a real price with a date stamp or admits it can't check. It never guesses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 3: Hinglish Detection and Response
&lt;/h3&gt;

&lt;p&gt;Many Indian users naturally mix Hindi and English: "Bhaiya, rice ka price kya hai?" The agent initially responded in pure English to these mixed queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; I configured Deepgram STT with &lt;code&gt;language="multi"&lt;/code&gt; for multilingual detection, and added explicit rules in the system prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"If the user mixes Hindi and English (Hinglish) → match their Hinglish style naturally. Hindi → Devanagari (नमस्ते), never romanized."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The multilingual turn detector from LiveKit helped the agent know when the user had finished speaking, even when switching languages mid-sentence.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Build and Run It Yourself
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.astral.sh/uv/" rel="noopener noreferrer"&gt;uv&lt;/a&gt; (fast Python package manager)&lt;/li&gt;
&lt;li&gt;Node.js 18+&lt;/li&gt;
&lt;li&gt;pnpm (&lt;code&gt;npm install -g pnpm&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;API keys for: &lt;a href="https://cloud.livekit.io/" rel="noopener noreferrer"&gt;LiveKit&lt;/a&gt;, &lt;a href="https://murf.ai/api/dashboard" rel="noopener noreferrer"&gt;Murf AI&lt;/a&gt;, &lt;a href="https://deepgram.com/" rel="noopener noreferrer"&gt;Deepgram&lt;/a&gt;, &lt;a href="https://aistudio.google.com/" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Clone the repo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Taukeer1256/murf-livekit-starter.git
&lt;span class="nb"&gt;cd &lt;/span&gt;murf-livekit-starter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Set up API keys
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.env.local&lt;/code&gt; in both &lt;code&gt;backend/&lt;/code&gt; and &lt;code&gt;frontend/&lt;/code&gt; by copying from &lt;code&gt;.env.example&lt;/code&gt;. You need:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Where to get it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LIVEKIT_URL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LiveKit Cloud dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LIVEKIT_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LiveKit Cloud dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LIVEKIT_API_SECRET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LiveKit Cloud dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MURF_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://murf.ai/api/dashboard" rel="noopener noreferrer"&gt;murf.ai/api/dashboard&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DEEPGRAM_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://deepgram.com" rel="noopener noreferrer"&gt;deepgram.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GOOGLE_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aistudio.google.com/" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Never commit &lt;code&gt;.env.local&lt;/code&gt; to Git.&lt;/strong&gt; It's already in &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 3: Install and run
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Terminal 1 — Backend&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;backend
uv &lt;span class="nb"&gt;sync
&lt;/span&gt;uv run python src/agent.py download-files   &lt;span class="c"&gt;# first time only&lt;/span&gt;
uv run python src/agent.py dev

&lt;span class="c"&gt;# Terminal 2 — Frontend&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
pnpm &lt;span class="nb"&gt;install
&lt;/span&gt;pnpm dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;strong&gt;&lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;/strong&gt;, click &lt;strong&gt;Start talking&lt;/strong&gt;, allow microphone access, and speak.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Test a conversation
&lt;/h3&gt;

&lt;p&gt;Try these prompts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;"Do you have Basmati Rice?"&lt;/em&gt; → triggers catalogue lookup&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"I want 2 kg rice and 3 litres milk — how much?"&lt;/em&gt; → triggers order total&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"I was charged twice for my order"&lt;/em&gt; → triggers human escalation&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"I want to return these biscuits"&lt;/em&gt; → triggers handoff to RefundMitra&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I Would Improve Next
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Live inventory integration&lt;/strong&gt; — Replace the static JSON catalogue with a real API (e.g., a government commodity price feed or an actual POS system).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp channel&lt;/strong&gt; — Many Indian users prefer WhatsApp over phone calls. LiveKit supports WebRTC-based integrations that could bridge this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-store support&lt;/strong&gt; — Let different kirana stores configure their own catalogue, branding, and voice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consent audit log&lt;/strong&gt; — Currently consent is enforced at the LLM level. I'd add a server-side gate that rejects writes without a &lt;code&gt;consent_given&lt;/code&gt; flag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End-to-end latency measurement&lt;/strong&gt; — Add p50/p95 latency tracking to the analytics dashboard using the &lt;a href="https://github.com/sahilsgupta/tts-latency-benchmarker" rel="noopener noreferrer"&gt;TTS Latency Benchmarker&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔗 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/Taukeer1256/murf-livekit-starter" rel="noopener noreferrer"&gt;github.com/Taukeer1256/murf-livekit-starter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎙️ &lt;strong&gt;Murf Falcon TTS:&lt;/strong&gt; &lt;a href="https://murf.ai/falcon" rel="noopener noreferrer"&gt;murf.ai/falcon&lt;/a&gt; — 55ms latency, 150+ voices, 35+ languages&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Falcon 2 Documentation:&lt;/strong&gt; &lt;a href="https://murf.ai/api/docs/text-to-speech-models/falcon-2" rel="noopener noreferrer"&gt;murf.ai/api/docs/text-to-speech-models/falcon-2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🧪 &lt;strong&gt;LiveKit Voice AI Quickstart:&lt;/strong&gt; &lt;a href="https://docs.livekit.io/agents/start/voice-ai/" rel="noopener noreferrer"&gt;docs.livekit.io/agents/start/voice-ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎤 &lt;strong&gt;Murf LiveKit Starter (original template):&lt;/strong&gt; &lt;a href="https://github.com/murf-ai/murf-livekit-starter" rel="noopener noreferrer"&gt;github.com/murf-ai/murf-livekit-starter&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built during the **10 Days of Voice Agents — VoiceForBharat Edition&lt;/em&gt;&lt;em&gt;, powered by Murf Falcon TTS and LiveKit.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;#VoiceForBharat&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
