<?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: Bharat Lashotra</title>
    <description>The latest articles on DEV Community by Bharat Lashotra (@bharat03).</description>
    <link>https://dev.to/bharat03</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%2F4078693%2F51dc2bc8-1be3-47ba-906a-0be37ff80cae.jpg</url>
      <title>DEV Community: Bharat Lashotra</title>
      <link>https://dev.to/bharat03</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bharat03"/>
    <language>en</language>
    <item>
      <title>Building Bhasha Academy: A Multi-Agent Hinglish Voice Tutor with Murf Falcon &amp; LiveKit</title>
      <dc:creator>Bharat Lashotra</dc:creator>
      <pubDate>Sat, 15 Aug 2026 08:51:09 +0000</pubDate>
      <link>https://dev.to/bharat03/building-bhasha-academy-a-multi-agent-hinglish-voice-tutor-with-murf-falcon-livekit-njp</link>
      <guid>https://dev.to/bharat03/building-bhasha-academy-a-multi-agent-hinglish-voice-tutor-with-murf-falcon-livekit-njp</guid>
      <description>&lt;h1&gt;
  
  
  Building Bhasha Academy: An AI Voice Tutor for English and Math
&lt;/h1&gt;

&lt;p&gt;Language is meant to be spoken, not just read.&lt;/p&gt;

&lt;p&gt;For millions of students and job seekers in India, being confident in English and basic math can open the door to better career opportunities. But many learners don't have access to a personal tutor. Even when they do, the fear of making mistakes in front of someone can make practicing uncomfortable.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Bhasha Academy&lt;/strong&gt;, an AI-powered voice tutor designed to give learners a private, judgment-free space to practice.&lt;/p&gt;

&lt;p&gt;It can have conversations in &lt;strong&gt;Hinglish&lt;/strong&gt;, help users practice English, solve basic math problems, remember learning progress, and even connect the learner with a human teacher when needed.&lt;/p&gt;

&lt;p&gt;The interesting part is that the entire experience is voice-first.&lt;/p&gt;

&lt;p&gt;Here's how I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;I wanted Bhasha Academy to feel less like talking to a chatbot and more like talking to a patient tutor.&lt;/p&gt;

&lt;p&gt;The learner should be able to simply say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Mujhe English practice karni hai."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the agent should understand the Hinglish, respond naturally, and continue the conversation.&lt;/p&gt;

&lt;p&gt;For math, the learner can say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Samar, 25 percent of 200 kitna hai?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The system can then switch to a math specialist and continue from the same conversation.&lt;/p&gt;

&lt;p&gt;The main goals were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Natural voice conversations&lt;/li&gt;
&lt;li&gt;Hinglish support&lt;/li&gt;
&lt;li&gt;Indian-accented voices&lt;/li&gt;
&lt;li&gt;Personalized learning&lt;/li&gt;
&lt;li&gt;Persistent memory&lt;/li&gt;
&lt;li&gt;Specialist agents&lt;/li&gt;
&lt;li&gt;Human escalation when required&lt;/li&gt;
&lt;li&gt;Web and phone/SIP support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the architecture works
&lt;/h2&gt;

&lt;p&gt;The system is built using several services, with LiveKit sitting at the center of the real-time voice experience.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
  ↓
Browser / SIP
  ↓
LiveKit
  ↓
Speech-to-Text
  ↓
Deepgram Nova-3
  ↓
Gemini
  ↓
Agent / Tools
  ↓
Murf Falcon TTS
  ↓
LiveKit
  ↓
User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are also a few supporting components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQLite
  ├── Student profiles
  ├── Learning progress
  ├── Call analytics
  └── Escalation tickets

Discord Webhook
  └── Human teacher notifications

Next.js
  └── Admin dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;I use &lt;strong&gt;Deepgram Nova-3&lt;/strong&gt; for speech recognition.&lt;/p&gt;

&lt;p&gt;The important part here is multilingual support.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;"Yesterday I went market, but mujhe wahan kuch samajh nahi aaya."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The system needs to understand both languages without forcing the user to speak only English or only Hindi.&lt;/p&gt;

&lt;h3&gt;
  
  
  LLM
&lt;/h3&gt;

&lt;p&gt;For the conversational layer, I use &lt;strong&gt;Google Gemini 3.5 Flash Lite&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The model is responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding the conversation&lt;/li&gt;
&lt;li&gt;Generating responses&lt;/li&gt;
&lt;li&gt;Following the tutor personality&lt;/li&gt;
&lt;li&gt;Calling tools&lt;/li&gt;
&lt;li&gt;Managing agent handoffs&lt;/li&gt;
&lt;li&gt;Working with the learner's profile&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;For voice generation, I use &lt;strong&gt;Murf Falcon TTS&lt;/strong&gt; through LiveKit.&lt;/p&gt;

&lt;p&gt;Bhasha Academy currently uses two voices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anisha&lt;/strong&gt; — general English and language practice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Samar&lt;/strong&gt; — math practice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are designed to sound natural for Indian users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-time voice
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;LiveKit Agents SDK&lt;/strong&gt; handles the real-time communication layer.&lt;/p&gt;

&lt;p&gt;It takes care of things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebRTC audio&lt;/li&gt;
&lt;li&gt;Voice activity detection&lt;/li&gt;
&lt;li&gt;Turn detection&lt;/li&gt;
&lt;li&gt;Streaming audio&lt;/li&gt;
&lt;li&gt;SIP integration&lt;/li&gt;
&lt;li&gt;Agent sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes it possible to have a real conversation instead of the traditional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Record → Upload → Wait → Get Response → Play
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, audio can be streamed continuously.&lt;/p&gt;

&lt;h2&gt;
  
  
  One of the biggest problems: Hinglish pronunciation
&lt;/h2&gt;

&lt;p&gt;One of the first problems I noticed was surprisingly simple.&lt;/p&gt;

&lt;p&gt;The AI understood Hinglish perfectly, but the voice didn't always pronounce it naturally.&lt;/p&gt;

&lt;p&gt;For example, if the model generated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bahut achha, let's try again!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the TTS system could interpret "Bahut achha" using English pronunciation.&lt;/p&gt;

&lt;p&gt;The result sounded robotic.&lt;/p&gt;

&lt;h3&gt;
  
  
  The solution
&lt;/h3&gt;

&lt;p&gt;I changed the system prompt so that Hindi words should be written in &lt;strong&gt;Devanagari&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bahut achha, let's try again!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the model generates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;बहुत अच्छा, let's try again!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This made a huge difference.&lt;/p&gt;

&lt;p&gt;Murf Falcon can handle mixed scripts, so it can naturally switch between Hindi and English.&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;बहुत बढ़िया! Let's try another word.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a small prompt change, but it had a big impact on the voice experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Giving the AI memory
&lt;/h2&gt;

&lt;p&gt;A tutor should remember its students.&lt;/p&gt;

&lt;p&gt;Bhasha Academy uses SQLite to store learner profiles.&lt;/p&gt;

&lt;p&gt;When someone calls for the first time, the agent doesn't automatically save their information.&lt;/p&gt;

&lt;p&gt;Instead, it asks for permission.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;"Would you like me to remember your name and learning progress for your next session?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the learner agrees, the system can store information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Current English level&lt;/li&gt;
&lt;li&gt;Topics practiced&lt;/li&gt;
&lt;li&gt;Common mistakes&lt;/li&gt;
&lt;li&gt;City&lt;/li&gt;
&lt;li&gt;Learning progress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is also a &lt;code&gt;forget_caller&lt;/code&gt; tool.&lt;/p&gt;

&lt;p&gt;A learner can ask the system to forget them, and their stored profile can be removed.&lt;/p&gt;

&lt;p&gt;This was important to me because personalization shouldn't come at the cost of user control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-agent conversations
&lt;/h2&gt;

&lt;p&gt;Another interesting part of the project is the specialist handoff system.&lt;/p&gt;

&lt;p&gt;Instead of making one huge agent handle everything, I created separate agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anisha
&lt;/h3&gt;

&lt;p&gt;Anisha is the general language tutor.&lt;/p&gt;

&lt;p&gt;She handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;English conversations&lt;/li&gt;
&lt;li&gt;Vocabulary&lt;/li&gt;
&lt;li&gt;Grammar&lt;/li&gt;
&lt;li&gt;Pronunciation&lt;/li&gt;
&lt;li&gt;General learning&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Samar
&lt;/h3&gt;

&lt;p&gt;Samar is the math specialist.&lt;/p&gt;

&lt;p&gt;He handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic arithmetic&lt;/li&gt;
&lt;li&gt;Percentages&lt;/li&gt;
&lt;li&gt;Word problems&lt;/li&gt;
&lt;li&gt;Math practice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the learner says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can we do some maths?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Anisha can transfer the conversation to Samar.&lt;/p&gt;

&lt;p&gt;The important part is that Samar shouldn't start from zero.&lt;/p&gt;

&lt;p&gt;He should already know who the learner is and what was discussed.&lt;/p&gt;

&lt;p&gt;The handoff looks roughly like this:&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="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_math_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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;

    &lt;span class="n"&gt;math_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MathPracticeAgent&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="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;math_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;Transferring you to Samar, our maths practice specialist.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key idea is passing a copy of the existing &lt;code&gt;ChatContext&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This preserves the conversation while allowing the new agent to have its own instructions and personality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phone calls and voicemail detection
&lt;/h2&gt;

&lt;p&gt;Bhasha Academy isn't limited to the browser.&lt;/p&gt;

&lt;p&gt;Using LiveKit SIP integrations, the system can also make outbound calls.&lt;/p&gt;

&lt;p&gt;This opens up the possibility of scheduled lessons.&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;Scheduled lesson
      ↓
System calls student
      ↓
Student answers
      ↓
AI tutor starts lesson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But there is another problem with outbound calling: voicemail.&lt;/p&gt;

&lt;p&gt;There is no reason to keep expensive AI services running when the call is answered by an answering machine.&lt;/p&gt;

&lt;p&gt;So I added voicemail detection.&lt;/p&gt;

&lt;p&gt;If the system detects a typical voicemail greeting, it can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Leave a short message.&lt;/li&gt;
&lt;li&gt;Call the &lt;code&gt;hang_up&lt;/code&gt; tool.&lt;/li&gt;
&lt;li&gt;End the session.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Human teachers are still important
&lt;/h2&gt;

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

&lt;p&gt;If a learner repeatedly struggles or becomes frustrated, Bhasha Academy can ask whether they want to speak with a human teacher.&lt;/p&gt;

&lt;p&gt;If the learner agrees, the system creates an escalation ticket.&lt;/p&gt;

&lt;p&gt;The ticket contains information such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reference ID
Student Name
Urgency
Reason
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A Discord webhook then sends the notification to the teacher/admin channel.&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 python"&gt;&lt;code&gt;&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&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;embeds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;🚨 Human Help Request Raised (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;urgency&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="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;color&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15158332&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;urgency&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;emergency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;3447003&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fields&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;name&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;Reference ID&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;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ref_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inline&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&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;Student Name&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;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inline&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&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;Urgency&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;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;urgency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inline&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&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;Reason&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;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inline&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&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;p&gt;The idea is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI handles the routine conversations. Humans step in when the learner needs more help.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Analytics dashboard
&lt;/h2&gt;

&lt;p&gt;Every call is also logged.&lt;/p&gt;

&lt;p&gt;The system tracks things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Call status&lt;/li&gt;
&lt;li&gt;Call duration&lt;/li&gt;
&lt;li&gt;Web vs SIP&lt;/li&gt;
&lt;li&gt;Latency&lt;/li&gt;
&lt;li&gt;Completion rate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The data is stored in SQLite and exposed through a Next.js dashboard.&lt;/p&gt;

&lt;p&gt;This makes it easier to understand how the system is performing instead of relying only on individual conversations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The biggest lessons I learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Voice AI is more than just an LLM
&lt;/h3&gt;

&lt;p&gt;Getting a good text response is only one part of the problem.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Good speech recognition&lt;/li&gt;
&lt;li&gt;Fast turn detection&lt;/li&gt;
&lt;li&gt;Natural TTS&lt;/li&gt;
&lt;li&gt;Low latency&lt;/li&gt;
&lt;li&gt;Interruption handling&lt;/li&gt;
&lt;li&gt;Context management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small improvements in any of these areas can make the experience feel much more natural.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Language and script matter
&lt;/h3&gt;

&lt;p&gt;Hinglish isn't simply English with Hindi words.&lt;/p&gt;

&lt;p&gt;The way those words are written can directly affect how the TTS system pronounces them.&lt;/p&gt;

&lt;p&gt;Switching Hindi words to Devanagari was one of the simplest and most effective improvements I made.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Context makes multi-agent systems usable
&lt;/h3&gt;

&lt;p&gt;Agent handoffs sound simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent A → Agent B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But without preserving context, it becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent A → Agent B → "What's your name?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Passing the conversation context makes the handoff feel like one continuous conversation.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. AI should know when to ask for help
&lt;/h3&gt;

&lt;p&gt;A good tutor isn't necessarily one that answers everything.&lt;/p&gt;

&lt;p&gt;Sometimes the best action is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Would you like me to connect you with a teacher?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That human fallback makes the system more useful and trustworthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to run it yourself
&lt;/h2&gt;

&lt;p&gt;The project is based on the open-source &lt;strong&gt;Murf LiveKit Starter&lt;/strong&gt; repository.&lt;/p&gt;

&lt;p&gt;Repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/bharatbushan03/murf-livekit-starter" rel="noopener noreferrer"&gt;https://github.com/bharatbushan03/murf-livekit-starter&lt;/a&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;&lt;code&gt;uv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pnpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;LiveKit account&lt;/li&gt;
&lt;li&gt;Murf API key&lt;/li&gt;
&lt;li&gt;Deepgram API key&lt;/li&gt;
&lt;li&gt;Google API key&lt;/li&gt;
&lt;li&gt;Optional Discord webhook&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Clone the repository
&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/bharatbushan03/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;p&gt;Install the backend:&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;uv run python src/agent.py download-files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install 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 &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Environment variables
&lt;/h3&gt;

&lt;p&gt;Configure your environment variables with the required API credentials:&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
LIVEKIT_API_KEY
LIVEKIT_API_SECRET

MURF_API_KEY
DEEPGRAM_API_KEY
GOOGLE_API_KEY

DISCORD_WEBHOOK_URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Discord webhook is optional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start the backend
&lt;/h3&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;Then start the frontend in another terminal:&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;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;Click &lt;strong&gt;Start Learning with Anisha&lt;/strong&gt; and start talking.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;There are still several things I want to improve.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better VAD for noisy environments
&lt;/h3&gt;

&lt;p&gt;Real users aren't always sitting in a quiet room.&lt;/p&gt;

&lt;p&gt;A student might be practicing from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A classroom&lt;/li&gt;
&lt;li&gt;A bus&lt;/li&gt;
&lt;li&gt;A busy home&lt;/li&gt;
&lt;li&gt;A shared workspace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I want to tune the voice activity detection system to work better in noisy environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interactive math scorecards
&lt;/h3&gt;

&lt;p&gt;Another feature I'm planning is real-time math progress.&lt;/p&gt;

&lt;p&gt;While Samar is teaching, the frontend could show something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Math Practice

Questions: 8
Correct: 6
Needs Practice: 2

Topic:
Percentages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This would make the voice interaction feel more connected to the visual interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Building Bhasha Academy taught me that voice AI can be much more than a voice chatbot.&lt;/p&gt;

&lt;p&gt;When you combine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time voice&lt;/li&gt;
&lt;li&gt;Hinglish support&lt;/li&gt;
&lt;li&gt;Indian-accented TTS&lt;/li&gt;
&lt;li&gt;Persistent memory&lt;/li&gt;
&lt;li&gt;Multi-agent routing&lt;/li&gt;
&lt;li&gt;SIP calling&lt;/li&gt;
&lt;li&gt;Human escalation&lt;/li&gt;
&lt;li&gt;Analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;you can start building something that feels closer to a real tutor.&lt;/p&gt;

&lt;p&gt;There are still many things to improve, but the core idea is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give learners a patient tutor they can talk to whenever they want, without being afraid of making mistakes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's what I'm trying to build with Bhasha Academy.&lt;/p&gt;

&lt;p&gt;If you're building something similar with LiveKit, Murf, Deepgram, or Gemini, I'd love to hear what you're working on.&lt;/p&gt;

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