<?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: KUSAL SARKAR</title>
    <description>The latest articles on DEV Community by KUSAL SARKAR (@kusal_099098).</description>
    <link>https://dev.to/kusal_099098</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%2F4078743%2F6e57c1e1-4808-492e-8eeb-690c75781729.png</url>
      <title>DEV Community: KUSAL SARKAR</title>
      <link>https://dev.to/kusal_099098</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kusal_099098"/>
    <language>en</language>
    <item>
      <title>Building a Multilingual Voice Agent for Local Commerce with Murf Falcon</title>
      <dc:creator>KUSAL SARKAR</dc:creator>
      <pubDate>Sat, 15 Aug 2026 10:59:30 +0000</pubDate>
      <link>https://dev.to/kusal_099098/building-a-multilingual-voice-agent-for-local-commerce-with-murf-falcon-2o06</link>
      <guid>https://dev.to/kusal_099098/building-a-multilingual-voice-agent-for-local-commerce-with-murf-falcon-2o06</guid>
      <description>&lt;p&gt;What if you could call a local business, speak naturally in Hindi, Bengali, English, or a mix of them, ask about a product or order, and get help without navigating complicated menus?&lt;/p&gt;

&lt;p&gt;That was the idea behind my project for &lt;strong&gt;10 Days of Voice Agents — VoiceForBharat Edition&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Over the course of the challenge, I evolved a basic real-time voice agent into a &lt;strong&gt;multilingual Local Commerce Voice Assistant&lt;/strong&gt; with live product lookup, consent-based memory, outbound calling, human escalation, specialist-agent handoffs, and a call analytics dashboard.&lt;/p&gt;

&lt;p&gt;The project is built using &lt;strong&gt;Murf Falcon, LiveKit, Deepgram, an LLM, Python and Next.js&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/kusalar/agentvoice" rel="noopener noreferrer"&gt;https://github.com/kusalar/agentvoice&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 The Problem
&lt;/h2&gt;

&lt;p&gt;Local businesses often need to answer repetitive customer questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this product available?&lt;/li&gt;
&lt;li&gt;What is the price?&lt;/li&gt;
&lt;li&gt;Where is my order?&lt;/li&gt;
&lt;li&gt;When will my order arrive?&lt;/li&gt;
&lt;li&gt;Can I return this product?&lt;/li&gt;
&lt;li&gt;I have a problem with my order. Can someone help me?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Traditional chat interfaces aren't always convenient, especially for users who are more comfortable speaking than typing.&lt;/p&gt;

&lt;p&gt;This is where voice can make the interaction more natural.&lt;/p&gt;

&lt;p&gt;My goal was to build an assistant that could provide a more conversational experience while still being useful, reliable and safe.&lt;/p&gt;

&lt;p&gt;I chose the &lt;strong&gt;local commerce/customer support&lt;/strong&gt; direction because it allowed me to combine voice AI with real business tools and workflows.&lt;/p&gt;




&lt;h1&gt;
  
  
  🗣️ Why Voice?
&lt;/h1&gt;

&lt;p&gt;Voice is particularly interesting for the Indian context because conversations don't always happen in a single language.&lt;/p&gt;

&lt;p&gt;A customer might say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Bhai, mera order kab tak deliver hoga?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Product available hai kya? Price bhi bata do."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or they may switch between Hindi and English during the same conversation.&lt;/p&gt;

&lt;p&gt;Instead of forcing users to type formal queries, a voice interface allows them to interact naturally.&lt;/p&gt;

&lt;p&gt;My agent is designed to handle &lt;strong&gt;English, Hindi, Bengali and code-mixed conversations&lt;/strong&gt;, while trying to mirror the user's language and conversational style.&lt;/p&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%2Fysn1gn6av5r859ouawgt.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%2Fysn1gn6av5r859ouawgt.png" alt="The final Local Commerce Assistant interface" width="800" height="799"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  "The final Local Commerce Assistant interface: a voice-first shopping experience for discovering local products and interacting with the agent."
&lt;/h2&gt;

&lt;h1&gt;
  
  
  🏗️ How the Voice Agent Works
&lt;/h1&gt;

&lt;p&gt;The core architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 ┌─────────────────────┐
                 │      Customer       │
                 │    Browser / Phone  │
                 └──────────┬──────────┘
                            │
                    Voice / SIP / Chat
                            │
                            ▼
                 ┌─────────────────────┐
                 │      LiveKit        │
                 │   Real-time RTC     │
                 └──────────┬──────────┘
                            │
                            ▼
                 ┌─────────────────────┐
                 │    Deepgram STT     │
                 │    Speech → Text    │
                 └──────────┬──────────┘
                            │
                            ▼
                 ┌─────────────────────┐
                 │   LiveKit Agent     │
                 │   LLM + Reasoning   │
                 │      + Tools        │
                 └──────────┬──────────┘
                            │
              ┌─────────────┼─────────────┐
              │             │             │
              ▼             ▼             ▼
        Product Tool    Memory DB    Escalation Tool
              │             │             │
              ▼             ▼             ▼
       Local Catalogue  Caller Memory  SQLite Tickets
                                          │
                                          ▼
                                   Human Escalation
                                          │
                                          ▼
                                Returns Specialist
                                          │
                                          ▼
                                 ┌─────────────────────┐
                                 │    Murf Falcon      │
                                 │    Text → Speech    │
                                 └──────────┬──────────┘
                                            │
                                            ▼
                                       🔊 Customer

And specialist path: 

Main Agent
    │
    │ refund / returns issue
    ▼
Returns &amp;amp; Refunds Specialist
    │
    ▼
Resolution / Escalation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The four fundamental components are:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Speech-to-Text
&lt;/h3&gt;

&lt;p&gt;I use &lt;strong&gt;Deepgram&lt;/strong&gt; to convert the user's speech into text.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. LLM
&lt;/h3&gt;

&lt;p&gt;The LLM understands the request, decides how to respond and determines when it needs to use one of the available tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Text-to-Speech
&lt;/h3&gt;

&lt;p&gt;I use &lt;strong&gt;Murf Falcon&lt;/strong&gt; to convert the agent's responses back into natural speech.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Real-time Transport
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;LiveKit&lt;/strong&gt; handles the real-time communication between the user and the voice agent.&lt;/p&gt;




&lt;h1&gt;
  
  
  🇮🇳 Indian Voice with Murf Falcon
&lt;/h1&gt;

&lt;p&gt;One of the key parts of the project is the voice itself.&lt;/p&gt;

&lt;p&gt;I used &lt;strong&gt;Murf Falcon&lt;/strong&gt; for the TTS layer and experimented with Indian voices including voices such as &lt;strong&gt;Pooja, Anisha and Samar&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal wasn't simply to make the agent speak.&lt;/p&gt;

&lt;p&gt;I wanted the interaction to feel natural enough for an Indian customer-support scenario.&lt;/p&gt;

&lt;p&gt;Fast TTS matters in voice applications because long delays between the user finishing their sentence and the agent responding can make the conversation feel unnatural.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 Agent Personality and Safety
&lt;/h1&gt;

&lt;p&gt;A voice agent needs more than an LLM.&lt;/p&gt;

&lt;p&gt;I defined a specific personality and behavioral rules for the assistant.&lt;/p&gt;

&lt;p&gt;The agent is designed to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Friendly&lt;/li&gt;
&lt;li&gt;Helpful&lt;/li&gt;
&lt;li&gt;Concise&lt;/li&gt;
&lt;li&gt;Professional&lt;/li&gt;
&lt;li&gt;Conversational&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it also has important guardrails.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It should not invent product prices or availability.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If information needs to be verified, the agent should use the appropriate tool.&lt;/p&gt;

&lt;p&gt;Similarly, sensitive actions such as storing customer information or creating an escalation should require user consent.&lt;/p&gt;

&lt;p&gt;This helped me move from simply building a chatbot to thinking about how a voice agent should behave in a real customer-facing environment.&lt;/p&gt;




&lt;h1&gt;
  
  
  🛒 Live Product Lookup
&lt;/h1&gt;

&lt;p&gt;One of the most useful features I built was a product lookup tool.&lt;/p&gt;

&lt;p&gt;Instead of allowing the LLM to guess product information, the agent can query actual catalogue data.&lt;/p&gt;

&lt;p&gt;The project uses &lt;strong&gt;Open Food Facts&lt;/strong&gt; as a live source and also maintains a local catalogue as a fallback.&lt;/p&gt;

&lt;p&gt;For example, a customer can ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Do you have organic honey?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent can use the tool to check the product rather than generating a random answer.&lt;/p&gt;

&lt;p&gt;If the external service isn't available, the system can fall back to the local catalogue.&lt;/p&gt;

&lt;p&gt;This taught me an important lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;An AI agent should use tools for facts instead of relying on the LLM to remember business data.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&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%2F0bmkcqxzazn2wgru4kzh.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%2F0bmkcqxzazn2wgru4kzh.png" alt="Live product lookup" width="798" height="785"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Live product lookup: the agent retrieves catalogue information such as product name, seller, pack size and price instead of guessing product details."&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 Memory with User Consent
&lt;/h1&gt;

&lt;p&gt;I also implemented memory for returning users.&lt;/p&gt;

&lt;p&gt;The agent can remember useful information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer name&lt;/li&gt;
&lt;li&gt;Language preference&lt;/li&gt;
&lt;li&gt;Relevant customer information&lt;/li&gt;
&lt;li&gt;Previous interaction information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I didn't want the system to automatically store everything a user says.&lt;/p&gt;

&lt;p&gt;The agent asks for permission before saving information.&lt;/p&gt;

&lt;p&gt;The basic workflow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer shares information
          ↓
Agent asks for permission
          ↓
       ┌──┴──┐
       │     │
      YES    NO
       │     │
       ▼     ▼
     Save   Don't save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This made memory more privacy-conscious and also made me think about consent as part of the agent's design rather than an afterthought.&lt;/p&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%2Ffykumwhv2ljggxb1n7ik.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%2Ffykumwhv2ljggxb1n7ik.png" alt="Persistent memory in action" width="731" height="781"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Persistent memory in action: after consent, the assistant remembers the customer's name and previous interaction to provide a more personalized conversation."&lt;/p&gt;




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

&lt;p&gt;A voice application also needs visibility into what is happening during conversations.&lt;/p&gt;

&lt;p&gt;During the challenge, I built a &lt;strong&gt;call analytics dashboard&lt;/strong&gt; to monitor and analyze voice interactions.&lt;/p&gt;

&lt;p&gt;Instead of only seeing whether the agent works, the dashboard provides a way to understand call activity and conversation performance.&lt;/p&gt;

&lt;p&gt;This is important for a real deployment because businesses need to answer questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many calls are happening?&lt;/li&gt;
&lt;li&gt;How are conversations performing?&lt;/li&gt;
&lt;li&gt;What is happening during calls?&lt;/li&gt;
&lt;li&gt;Where are users encountering problems?&lt;/li&gt;
&lt;li&gt;How is the voice agent being used?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building this dashboard helped me understand that production voice AI isn't only about the conversation itself.&lt;/p&gt;

&lt;p&gt;It also needs &lt;strong&gt;observability and analytics&lt;/strong&gt;.&lt;/p&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%2Fa3846zabgqz5kth0qfhc.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%2Fa3846zabgqz5kth0qfhc.png" alt="Call analytics dashboard" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Call analytics dashboard: tracking call outcomes, success rates, failure categories, channels and recent conversation activity."&lt;/p&gt;




&lt;h1&gt;
  
  
  📞 Outbound Calling
&lt;/h1&gt;

&lt;p&gt;The project also goes beyond incoming browser-based conversations.&lt;/p&gt;

&lt;p&gt;I implemented outbound calling using &lt;strong&gt;LiveKit SIP&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This can be useful for scenarios such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer follow-ups&lt;/li&gt;
&lt;li&gt;Order notifications&lt;/li&gt;
&lt;li&gt;Restock notifications&lt;/li&gt;
&lt;li&gt;Callback requests&lt;/li&gt;
&lt;li&gt;Proactive customer communication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was an interesting part of the project because it introduced telephony into the voice-agent architecture.&lt;/p&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%2Fareky2eioc1qyofhxanv.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%2Fareky2eioc1qyofhxanv.png" alt="Outbound Calls" width="408" height="876"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Outbound Calling: Call from team to customer for support."&lt;/p&gt;




&lt;h1&gt;
  
  
  👨‍💼 Human Escalation
&lt;/h1&gt;

&lt;p&gt;AI shouldn't try to solve every problem.&lt;/p&gt;

&lt;p&gt;For difficult cases such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refund disputes&lt;/li&gt;
&lt;li&gt;Return problems&lt;/li&gt;
&lt;li&gt;Damaged products&lt;/li&gt;
&lt;li&gt;Missing orders&lt;/li&gt;
&lt;li&gt;Serious delivery issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;the assistant can escalate the issue to human support.&lt;/p&gt;

&lt;p&gt;Before creating an escalation, the agent asks the customer for consent.&lt;/p&gt;

&lt;p&gt;The escalation can contain relevant information such as the issue description and what has already been checked.&lt;/p&gt;

&lt;p&gt;The customer can then receive a reference ID for the support request.&lt;/p&gt;

&lt;p&gt;Sensitive information such as passwords, OTPs and payment credentials should never be collected or exposed.&lt;/p&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%2F4qj3uznkwf0sx8id2r65.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%2F4qj3uznkwf0sx8id2r65.png" alt="Human Escalation section" width="780" height="777"&gt;&lt;/a&gt;&lt;/p&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%2Fcmt6wuw0hygtjqkivs6u.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%2Fcmt6wuw0hygtjqkivs6u.png" alt="Escalation Dashboard" width="800" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  "Human-in-the-loop escalation dashboard: support tickets created by the voice agent are tracked through open, in-progress and resolved states."
&lt;/h2&gt;

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

&lt;p&gt;I also implemented a specialist &lt;strong&gt;Returns Agent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of forcing one agent to handle every possible scenario, certain conversations can be handed to a specialist.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Main Agent
                     │
             Return / Refund?
                     │
                     ▼
             Returns Specialist
                     │
                     ▼
              Specialist Agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This introduced me to a more scalable approach to voice agents:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;multiple specialized agents working together instead of one enormous agent trying to do everything.&lt;/strong&gt;&lt;/p&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%2F3wyf0bb2smun8ie66alw.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%2F3wyf0bb2smun8ie66alw.png" alt="Specialist-agent handoff" width="729" height="778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  "Specialist-agent handoff: the main commerce assistant recognizes a returns/refund issue and transfers the conversation to a dedicated Returns &amp;amp; Refunds Specialist."
&lt;/h2&gt;

&lt;h1&gt;
  
  
  😅 The Difficult Parts
&lt;/h1&gt;

&lt;p&gt;The hardest part wasn't simply getting the agent to speak.&lt;/p&gt;

&lt;p&gt;The difficult part was making the system behave reliably.&lt;/p&gt;

&lt;p&gt;One of the biggest problems was preventing the LLM from confidently producing information that wasn't actually verified.&lt;/p&gt;

&lt;p&gt;For example, if someone asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Is this product available?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;the LLM could theoretically generate a plausible answer even if it had no actual catalogue information.&lt;/p&gt;

&lt;p&gt;I solved this by introducing dedicated tools for business data.&lt;/p&gt;

&lt;p&gt;The agent uses the product lookup tool when it needs product information instead of relying on its own knowledge.&lt;/p&gt;

&lt;p&gt;I also added fallback behavior when external product data isn't available.&lt;/p&gt;

&lt;p&gt;Another challenge was coordinating multiple components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend
   ↓
LiveKit
   ↓
STT
   ↓
LLM
   ↓
Tools
   ↓
TTS
   ↓
Frontend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A problem in any one of these layers can affect the entire conversation.&lt;/p&gt;

&lt;p&gt;Working through these issues taught me that a voice agent is really a &lt;strong&gt;system of connected components&lt;/strong&gt;, not just an LLM with a voice.&lt;/p&gt;




&lt;h1&gt;
  
  
  🛠️ How to Run the Project
&lt;/h1&gt;

&lt;p&gt;If you want to experiment with the project yourself, the complete source code is available on GitHub:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://github.com/kusalar/agentvoice" rel="noopener noreferrer"&gt;https://github.com/kusalar/agentvoice&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;p&gt;You'll need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;Node.js 18+&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pnpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;LiveKit&lt;/li&gt;
&lt;li&gt;Murf API credentials&lt;/li&gt;
&lt;li&gt;Deepgram API credentials&lt;/li&gt;
&lt;li&gt;LLM API credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clone the repository:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Install the backend dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backend
uv &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the required model/files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run python src/agent.py download-files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install the frontend dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ../frontend
pnpm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🔐 Environment Variables
&lt;/h1&gt;

&lt;p&gt;Never put API keys directly into the source code.&lt;/p&gt;

&lt;p&gt;Create the appropriate environment file and add your credentials there.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LIVEKIT_URL=your_livekit_url
LIVEKIT_API_KEY=your_livekit_api_key
LIVEKIT_API_SECRET=your_livekit_api_secret

MURF_API_KEY=your_murf_api_key
DEEPGRAM_API_KEY=your_deepgram_api_key
GOOGLE_API_KEY=your_llm_api_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use your actual credentials locally, but &lt;strong&gt;never commit them to GitHub or publish them in screenshots&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  ▶️ Running the Agent
&lt;/h1&gt;

&lt;p&gt;Start the LiveKit development server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;livekit-server &lt;span class="nt"&gt;--dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the backend agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backend
uv run python src/agent.py dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start the frontend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
pnpm dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Allow microphone access and start a conversation with the agent.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧪 Testing the Agent
&lt;/h1&gt;

&lt;p&gt;A simple test conversation could be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User:&lt;/strong&gt;&lt;br&gt;
"Do you have organic honey?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent:&lt;/strong&gt;&lt;br&gt;
Checks the product tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User:&lt;/strong&gt;&lt;br&gt;
"How much is it?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent:&lt;/strong&gt;&lt;br&gt;
Returns the verified catalogue information.&lt;/p&gt;

&lt;p&gt;You can also test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Switching between Hindi and English&lt;/li&gt;
&lt;li&gt;Bengali conversations&lt;/li&gt;
&lt;li&gt;Code-mixed sentences&lt;/li&gt;
&lt;li&gt;Product availability&lt;/li&gt;
&lt;li&gt;Memory consent&lt;/li&gt;
&lt;li&gt;Return/refund escalation&lt;/li&gt;
&lt;li&gt;Specialist-agent handoff&lt;/li&gt;
&lt;li&gt;Outbound calling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For testing screenshots and demos, use dummy customer information rather than real personal data.&lt;/p&gt;




&lt;h1&gt;
  
  
  📸 Evidence From My Build
&lt;/h1&gt;

&lt;p&gt;The project evolved throughout the 10-day challenge, and I documented different capabilities as I built them.&lt;/p&gt;

&lt;p&gt;The most useful evidence includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The final voice-agent interface&lt;/li&gt;
&lt;li&gt;A real conversation with the agent&lt;/li&gt;
&lt;li&gt;Product lookup in action&lt;/li&gt;
&lt;li&gt;The call analytics dashboard&lt;/li&gt;
&lt;li&gt;Memory/consent flow&lt;/li&gt;
&lt;li&gt;Human escalation&lt;/li&gt;
&lt;li&gt;Specialist-agent handoff&lt;/li&gt;
&lt;li&gt;Outbound calling&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I don't need to include every screenshot from every day.&lt;/p&gt;

&lt;p&gt;Instead, I want the screenshots to show the progression from a simple voice agent into a more complete voice system.&lt;/p&gt;




&lt;h1&gt;
  
  
  🚀 What I Learned
&lt;/h1&gt;

&lt;p&gt;The biggest lesson from this challenge is that building a voice agent isn't just about making AI talk.&lt;/p&gt;

&lt;p&gt;A useful voice agent needs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voice + Reasoning + Tools + Memory + Safety + Real-time communication + Observability + Human handoff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The voice is what the user experiences.&lt;/p&gt;

&lt;p&gt;But the tools, data validation, consent, fallback behavior, analytics and escalation logic are what make the system useful.&lt;/p&gt;

&lt;p&gt;Over these 10 days, I learned how these different pieces can come together to create something much closer to a real-world voice application.&lt;/p&gt;




&lt;h1&gt;
  
  
  🔮 What's Next?
&lt;/h1&gt;

&lt;p&gt;There is still a lot I would like to improve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More Indian languages&lt;/li&gt;
&lt;li&gt;Better production telephony&lt;/li&gt;
&lt;li&gt;More business integrations&lt;/li&gt;
&lt;li&gt;More advanced call analytics&lt;/li&gt;
&lt;li&gt;Better observability&lt;/li&gt;
&lt;li&gt;More specialist agents&lt;/li&gt;
&lt;li&gt;Production deployment&lt;/li&gt;
&lt;li&gt;Automated voice-agent evaluation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But this challenge gave me a strong foundation for exploring all of these areas.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;What started as a basic voice agent became a multilingual local-commerce assistant capable of using tools, remembering users with consent, making calls, escalating problems, handing conversations to specialists and analyzing calls.&lt;/p&gt;

&lt;p&gt;The most important thing I learned is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A good voice agent shouldn't just sound intelligent. It should be useful, accurate, safe and measurable.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm grateful to &lt;strong&gt;Murf AI&lt;/strong&gt; for organizing &lt;strong&gt;10 Days of Voice Agents — VoiceForBharat Edition&lt;/strong&gt; and giving me the opportunity to build and experiment with voice AI over 10 days.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Project:&lt;/strong&gt; &lt;a href="https://github.com/kusalar/agentvoice" rel="noopener noreferrer"&gt;https://github.com/kusalar/agentvoice&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Murf Falcon + LiveKit + Deepgram + LLM + Python + Next.js&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  VoiceForBharat #MurfAI #VoiceAI #GenerativeAI #AI #BuildInPublic
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>agents</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
