<?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: sizico</title>
    <description>The latest articles on DEV Community by sizico (@sizico).</description>
    <link>https://dev.to/sizico</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%2F4079179%2Fd49c207e-b9fb-48d1-b31a-ec83c211f189.png</url>
      <title>DEV Community: sizico</title>
      <link>https://dev.to/sizico</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sizico"/>
    <language>en</language>
    <item>
      <title>ArthMitra</title>
      <dc:creator>sizico</dc:creator>
      <pubDate>Sat, 15 Aug 2026 17:12:15 +0000</pubDate>
      <link>https://dev.to/sizico/arthmitra-4l6a</link>
      <guid>https://dev.to/sizico/arthmitra-4l6a</guid>
      <description>&lt;p&gt;Building ArthMitra: A Financial Literacy Voice Agent for India&lt;br&gt;
When it comes to financial literacy, many people face a massive barrier: the jargon, the complex documents, and the sheer volume of information. Whether it's understanding eligibility for government schemes like PM-KISAN, checking the latest savings interest rates, or identifying a fraudulent SMS, navigating financial services can be daunting.&lt;/p&gt;

&lt;p&gt;Typing out these questions or reading dense articles isn't always accessible. That's why I built ArthMitra — a voice-first financial literacy assistant designed for Indian users. With a voice interface, users can simply talk to Anisha in their native language or code-mixed Hinglish, making financial guidance as accessible as calling a friend.&lt;/p&gt;

&lt;p&gt;Here is the story of how I built it during the 10 Days of Voice Agents — VoiceForBharat Edition, and a guide on how you can build your own.&lt;/p&gt;

&lt;p&gt;Important Features&lt;br&gt;
To make Anisha truly useful, I focused on a few core features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;An Indian Voice Powered by Murf Falcon&lt;br&gt;
Anisha's voice is powered by Murf Falcon, using the "Anisha" (Indian English) voice profile. It’s incredibly fast (sub-130ms time-to-first-audio) and sounds natural, which is crucial for building trust in financial conversations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tools for Real-Time Data and Datasets&lt;br&gt;
LLMs are great, but they shouldn't guess financial data. I gave Anisha tools to access real information:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;check_exchange_rate&lt;/code&gt;: Fetches live currency exchange rates (e.g., USD to INR) using the open Frankfurter API. Perfect for users receiving remittances.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;check_scheme_eligibility&lt;/code&gt;: Checks eligibility for government schemes (like PMJDY or Mudra) using a robust local dataset, preventing hallucination.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;check_bank_interest_rate&lt;/code&gt;: Retrieves the latest FD and savings rates for major Indian banks.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Agent Handoffs and Human Escalation&lt;br&gt;
Not every query can be handled by a generalist. If a user asks about complex government schemes, Anisha hands off the conversation to a Government Scheme Specialist Agent (using a different voice profile, "Samar"). If a user is facing a complex fraud issue, Anisha has a create_escalation tool to seamlessly escalate the request to a human support team.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Memory for Returning Users&lt;br&gt;
Using lookup_caller and save_caller_info tools, Anisha remembers past interactions. If a returning user calls, she greets them by name and recalls their previous questions, making the experience highly personalized.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support for Indian Languages and Code-Mixing&lt;br&gt;
Anisha seamlessly handles code-mixed conversations, allowing users to speak in a natural blend of Hindi and English.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Difficult Parts: Lessons Learned&lt;br&gt;
Building a voice agent isn't always smooth sailing. Here are two challenges I faced and how I solved them:&lt;/p&gt;

&lt;p&gt;Challenge 1: Code-Mixed Pronunciation Issues&lt;br&gt;
Initially, when users spoke in Hindi, the LLM (Llama 3.3) would sometimes respond in romanized Hindi (e.g., "namaste, aap kaise ho"). When fed to the Murf TTS, this romanized text sounded robotic and unnatural because the TTS engine tried to read it with English pronunciation rules.&lt;/p&gt;

&lt;p&gt;The Fix: I added a strict guardrail to the system prompt: "Always write every language in its own native script. Hindi → Devanagari (नमस्ते), never romanized." This simple prompt engineering fix ensured the TTS received Devanagari text, which it pronounced flawlessly.&lt;/p&gt;

&lt;p&gt;Challenge 2: Hallucinating Scheme Eligibility&lt;br&gt;
Government schemes have very specific age, income, and occupation rules. The LLM would confidently (and incorrectly) invent eligibility criteria.&lt;/p&gt;

&lt;p&gt;The Fix: I instructed the agent to never explain schemes from memory. Instead, I built a local JSON dataset of scheme rules and created the check_scheme_eligibility tool. Now, the agent fetches deterministic answers based on the user's profile.&lt;/p&gt;

&lt;p&gt;Build Your Own Voice Agent&lt;br&gt;
Want to build your own voice agent? It's easier than you think. You need four main components:&lt;/p&gt;

&lt;p&gt;Speech-to-Text (STT): Deepgram (turns user speech into text)&lt;/p&gt;

&lt;p&gt;LLM: Groq / Llama 3.3 (the brain that decides what to say)&lt;/p&gt;

&lt;p&gt;Text-to-Speech (TTS): Murf Falcon (turns text back into voice instantly)&lt;/p&gt;

&lt;p&gt;Real-time Transport: LiveKit (handles the low-latency audio streaming)&lt;/p&gt;

&lt;p&gt;Setup Instructions&lt;br&gt;
You can inspect the full code in my public repository: murf-livekit-starter.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the project and install dependencies
You will need Python (with uv) for the backend and Node.js (with pnpm) for the frontend.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bash&lt;br&gt;
&lt;code&gt;git clone https://github.com/SITXU/murf-livekit-starter.git&lt;br&gt;
cd murf-livekit-starter&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Install backend
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;cd backend&lt;br&gt;
uv sync&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Install frontend
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;cd ../frontend&lt;br&gt;
pnpm install&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure API Keys securely
Create a .env.local file in both the backend/ and frontend/ folders. Never commit this file to GitHub. You will need keys from LiveKit, Murf AI, Deepgram, and Groq.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Code snippet&lt;br&gt;
LIVEKIT_URL=your_url&lt;br&gt;
LIVEKIT_API_KEY=your_key&lt;br&gt;
LIVEKIT_API_SECRET=your_secret&lt;br&gt;
MURF_API_KEY=your_murf_key&lt;br&gt;
DEEPGRAM_API_KEY=your_deepgram_key&lt;br&gt;
GROQ_API_KEY=your_groq_key&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the agent
Start the LiveKit server, the Python backend agent, and the Next.js frontend:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bash&lt;/p&gt;
&lt;h1&gt;
  
  
  Terminal 1:
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;livekit-server --dev&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Terminal 2:
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;cd backend &amp;amp;&amp;amp; uv run python src/agent.py dev&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Terminal 3:
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;cd frontend &amp;amp;&amp;amp; pnpm dev&lt;/code&gt;&lt;br&gt;
Open &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; in your browser, click "Talk to Anisha", and test the conversation!&lt;/p&gt;
&lt;h2&gt;
  
  
  Evidence: Under the Hood
&lt;/h2&gt;

&lt;p&gt;Here is a quick look at how the check_exchange_rate tool is implemented in Python using the LiveKit Agents SDK. The @function_tool decorator automatically exposes this function to the LLM.&lt;/p&gt;

&lt;p&gt;Python&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;python&lt;/span&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;check_exchange_rate&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;base_currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;USD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;target_currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Check the latest real-time currency exchange rate.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;

    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.frankfurter.app/latest?from=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base_currency&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;to=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_currency&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ClientSession&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                    &lt;span class="n"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rates&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_currency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                    &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;today&lt;/span&gt;&lt;span class="sh"&gt;"&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;call_successful&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Data source: Frankfurter API as of &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. The exchange rate is 1 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base_currency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_currency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m sorry, I couldn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t retrieve the exchange rate right now.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Our financial API is experiencing issues.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By connecting real-time APIs and local datasets to a voice interface powered by Murf Falcon, we can build tools that truly expand financial literacy. Happy building!&lt;/p&gt;

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