<?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: jaysid97</title>
    <description>The latest articles on DEV Community by jaysid97 (@jaysid97).</description>
    <link>https://dev.to/jaysid97</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%2F3645845%2Fd9725601-8733-4d5b-9092-a49e068f18c8.jpeg</url>
      <title>DEV Community: jaysid97</title>
      <link>https://dev.to/jaysid97</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jaysid97"/>
    <language>en</language>
    <item>
      <title>How I Built a Real-Time Multilingual AI Voice Tutor for Bharat (And Solved the 55ms Latency Problem)</title>
      <dc:creator>jaysid97</dc:creator>
      <pubDate>Sat, 15 Aug 2026 11:38:52 +0000</pubDate>
      <link>https://dev.to/jaysid97/how-i-built-a-real-time-multilingual-ai-voice-tutor-for-bharat-and-solved-the-55ms-latency-problem-1epc</link>
      <guid>https://dev.to/jaysid97/how-i-built-a-real-time-multilingual-ai-voice-tutor-for-bharat-and-solved-the-55ms-latency-problem-1epc</guid>
      <description>&lt;h1&gt;
  
  
  How I Built a Real-Time Multilingual AI Voice Tutor for Bharat (And Solved the 55ms Latency Problem)
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;10 Days of Voice AI Challenge — VoiceForBharat Edition&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Author: Jay | Track: Learning &amp;amp; Literacy (EdTech)&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Open-Source Repository: &lt;a href="https://github.com/jaysid97/Ten-day-of-voice-challenges-bharat-edition" rel="noopener noreferrer"&gt;github.com/jaysid97/Ten-day-of-voice-challenges-bharat-edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;When you build a traditional text chatbot, a 1.5-second API delay feels completely normal. But in &lt;strong&gt;conversational voice AI&lt;/strong&gt;, a 1.5-second delay feels like an uncomfortable eternity. &lt;/p&gt;

&lt;p&gt;Now imagine building a voice tutor for students across India — where learners naturally flip mid-sentence between English, Hindi, and regional terms (&lt;em&gt;"Bhaiya, is quadratic equation ko solve karne ka simple trick kya hai?"&lt;/em&gt;). Suddenly, latency isn't just a performance metric. &lt;strong&gt;Latency is the entire user experience.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Over the last 10 days, as part of the &lt;strong&gt;#VoiceForBharat AI Challenge&lt;/strong&gt;, I built &lt;strong&gt;Shiksha AI (शिक्षा AI)&lt;/strong&gt; — an empathetic, multilingual voice tutor powered by &lt;strong&gt;Murf Falcon TTS&lt;/strong&gt;, &lt;strong&gt;LiveKit Agents&lt;/strong&gt;, &lt;strong&gt;Deepgram Nova-3&lt;/strong&gt;, and &lt;strong&gt;Google Gemini&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, I want to break down how I built it, the architecture decisions behind sub-100ms voice responses, the hardest bugs I ran into, and how you can run the entire open-source setup yourself in under two minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 The Core Problem: Why Voice AI for Bharat?
&lt;/h2&gt;

&lt;p&gt;Quality 1-on-1 tutoring in India is expensive, geographically unequal, and often intimidating. Students in Tier 2, Tier 3, and rural towns face four massive hurdles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Cost Barrier&lt;/strong&gt;: Private home tutors cost thousands of rupees per month, making personalized guidance inaccessible for low-income households.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Language &amp;amp; Code-Mixing Barrier&lt;/strong&gt;: Most educational apps force students into formal English, whereas Indian kids think and speak in &lt;strong&gt;Hinglish&lt;/strong&gt; (a blend of Hindi and English).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "Fear of Shaming"&lt;/strong&gt;: Students frequently hesitate to ask "stupid questions" in crowded classrooms for fear of being ridiculed by peers or teachers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard Friction&lt;/strong&gt;: Try typing &lt;code&gt;2x² + 5x + 3 = 0&lt;/code&gt; or asking about photosynthesis on a small smartphone screen — it's awkward and slow.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Voice changes everything. By giving students a patient, non-judgmental voice tutor that speaks their language, understands their accent, and responds instantly, we can democratize personalized learning.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ System Architecture: How Audio Moves in Real Time
&lt;/h2&gt;

&lt;p&gt;A real-time voice agent is a continuous, bi-directional pipeline. Audio flows from the student's microphone, gets transcribed into text, passes through an LLM for reasoning and tool execution, and is streamed back as high-quality speech.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    User[🎙️ Learner / Voice Caller / Outbound SIP] --&amp;gt;|Audio Stream via WebRTC or SIP| STT[Deepgram STT Nova-3 Multi]
    STT --&amp;gt;|Text Transcript| LLM[Google Gemini LLM]

    subgraph Agent &amp;amp; Multi-Agent Domain Layer
        LLM &amp;lt;--&amp;gt;|Active Session Agent| MainAgent[Shiksha AI Main Tutor]
        LLM &amp;lt;--&amp;gt;|Handoff via session.update_agent| Specialist[MathsPracticeSpecialist Agent]
    end

    subgraph Memory, Tools &amp;amp; Safety Layer
        MainAgent &amp;lt;--&amp;gt;|Learner Facts &amp;amp; Consent| SQLiteMemory[(SQLite: agent_memory.db)]
        MainAgent &amp;lt;--&amp;gt;|Live Syllabus / Concepts| WikiAPI[Wikipedia Educational REST API]
        MainAgent &amp;lt;--&amp;gt;|Dictionary &amp;amp; Phonetics| DictAPI[Free Dictionary REST API]
        MainAgent &amp;lt;--&amp;gt;|PII Scrub &amp;amp; Webhook| Escalation[Human Support Engine / Discord]
        Specialist &amp;lt;--&amp;gt;|Step-by-Step Math Solver| MathTool[solve_math_step_by_step Tool]
    end

    subgraph Telephony &amp;amp; Analytics Layer
        MainAgent &amp;lt;--&amp;gt;|2-Sentence Opening &amp;amp; Retry Rules| Outbound[src/outbound_call.py]
        MainAgent --&amp;gt;|Teardown Metrics| Analytics[SQLite call_analytics Table]
    end

    LLM --&amp;gt;|Spoken Response Text| TTS[Murf Falcon Streaming TTS]
    TTS --&amp;gt;|High-Quality Audio (55ms)| Transport[LiveKit Agent Transport]
    Transport --&amp;gt;|Audio Output| Speaker[🔊 Learner Hears Shiksha AI]

    style User fill:#1E293B,stroke:#38BDF8,color:#fff
    style STT fill:#064E3B,stroke:#10B981,color:#fff
    style LLM fill:#1E1B4B,stroke:#818CF8,color:#fff
    style MainAgent fill:#431407,stroke:#F97316,color:#fff
    style Specialist fill:#365314,stroke:#84CC16,color:#fff
    style SQLiteMemory fill:#78350F,stroke:#F59E0B,color:#fff
    style Outbound fill:#831843,stroke:#F43F5E,color:#fff
    style WikiAPI fill:#0284C7,stroke:#38BDF8,color:#fff
    style DictAPI fill:#4C1D95,stroke:#C084FC,color:#fff
    style Escalation fill:#701A75,stroke:#F43F5E,color:#fff
    style Analytics fill:#1E3A8A,stroke:#60A5FA,color:#fff
    style TTS fill:#065F46,stroke:#34D399,color:#fff
    style Transport fill:#1E293B,stroke:#F59E0B,color:#fff
    style Speaker fill:#1E293B,stroke:#10B981,color:#fff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TTS (Text-to-Speech)&lt;/strong&gt;: &lt;strong&gt;Murf Falcon TTS&lt;/strong&gt; — Delivering ultra-low &lt;strong&gt;55ms streaming latency&lt;/strong&gt; with authentic Indian voice synthesis and flawless pronunciation of Hindi and English terms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;STT (Speech-to-Text)&lt;/strong&gt;: &lt;strong&gt;Deepgram Nova-3 Multi-Language&lt;/strong&gt; — Handling real-time speech recognition across English, Hindi (Devanagari script), and Hinglish.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM Engine&lt;/strong&gt;: &lt;strong&gt;Google Gemini 1.5 Flash&lt;/strong&gt; — Providing empathetic reasoning, guardrail compliance, and zero-shot function execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Transport&lt;/strong&gt;: &lt;strong&gt;LiveKit Agents&lt;/strong&gt; — Orchestrating WebRTC audio streaming, VAD (Voice Activity Detection), and SIP telephony.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: &lt;strong&gt;SQLite (&lt;code&gt;agent_memory.db&lt;/code&gt;)&lt;/strong&gt; — Storing learner memory, call logs, human escalation tickets, and analytics.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 The 4 Engineering Breakthroughs in Shiksha AI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Achieving 55ms Latency with Murf Falcon TTS
&lt;/h3&gt;

&lt;p&gt;Traditional TTS engines wait for the LLM to generate an entire paragraph before synthesizing audio. This introduces a 1.5 to 2.5 second delay — killing the natural flow of conversation.&lt;/p&gt;

&lt;p&gt;Using &lt;strong&gt;Murf Falcon's streaming API&lt;/strong&gt;, as soon as Gemini outputs the first few tokens, Murf Falcon immediately synthesizes and streams raw PCM audio frames over WebRTC. The total time from the student stopping their speech to hearing the first spoken word dropped to under &lt;strong&gt;100ms&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Persistent Learner Memory with "Hard Consent"
&lt;/h3&gt;

&lt;p&gt;Shiksha AI remembers returning students (&lt;em&gt;"Welcome back Ramesh! Last time we revised Class 10 Biology Photosynthesis..."&lt;/em&gt;). But storing voice conversation data without explicit consent is a major privacy violation.&lt;/p&gt;

&lt;p&gt;I built a &lt;strong&gt;Hard Consent Rule&lt;/strong&gt;: The LLM is strictly instructed to ask aloud (&lt;em&gt;"Should I remember your grade level and weak topics for next time?"&lt;/em&gt;) before invoking &lt;code&gt;save_caller_facts&lt;/code&gt;. If the student says "No", zero records are saved to SQLite.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Outbound SIP Telephony &amp;amp; Mandatory Opening Script
&lt;/h3&gt;

&lt;p&gt;Not every student in India has a high-speed laptop or desktop. To reach students on feature phones, I integrated LiveKit SIP and Twilio (&lt;code&gt;src/outbound_call.py&lt;/code&gt;) to trigger automated outbound revision calls.&lt;/p&gt;

&lt;p&gt;Every outbound call strictly enforces a 2-sentence compliance opening:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Who &amp;amp; Why&lt;/strong&gt;: &lt;em&gt;"Namaste Ramesh ji! I am Shiksha AI calling for your daily 5-minute NCERT Science practice call."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opt-Out Notice&lt;/strong&gt;: &lt;em&gt;"If you want to stop receiving these calls, just say 'stop' or 'opt out'."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry Logic&lt;/strong&gt;: Automatically categorizes call outcomes (&lt;code&gt;ANSWERED&lt;/code&gt;, &lt;code&gt;BUSY&lt;/code&gt;, &lt;code&gt;NO_ANSWER&lt;/code&gt;, &lt;code&gt;VOICEMAIL&lt;/code&gt;, &lt;code&gt;OPT_OUT&lt;/code&gt;) and reschedules missed calls.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  4. Multi-Agent Handoff to &lt;code&gt;MathsPracticeSpecialist&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Prompting a single LLM agent to handle general subjects, languages, quizzes, guardrails, &lt;em&gt;and&lt;/em&gt; step-by-step calculus causes prompt pollution and degrades reasoning quality.&lt;/p&gt;

&lt;p&gt;Instead, I built a &lt;strong&gt;Multi-Agent Handoff Architecture&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Main Tutor (&lt;code&gt;Shiksha AI&lt;/code&gt;)&lt;/strong&gt;: Handles general queries, history, biology, and language lessons.&lt;/li&gt;
&lt;li&gt;When a student asks for complex math help (&lt;em&gt;"Help me solve 2x² + 5x + 3 = 0"&lt;/em&gt;), &lt;code&gt;Shiksha AI&lt;/code&gt; calls the &lt;code&gt;hand_off_to_math_specialist&lt;/code&gt; tool.&lt;/li&gt;
&lt;li&gt;The session updates dynamically via &lt;code&gt;session.update_agent(math_specialist)&lt;/code&gt; while retaining the full &lt;code&gt;session.history&lt;/code&gt; array.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Maths Practice Specialist AI&lt;/strong&gt; takes over seamlessly, greets the student, and uses the &lt;code&gt;solve_math_step_by_step&lt;/code&gt; tool without asking the student to re-explain the problem!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ The Hardest Bugs I Had to Solve
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bug #1: The Hinglish Code-Switching Latency Trap
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem&lt;/strong&gt;: Standard STTs frequently misheard English technical terms mixed into Hindi sentences (e.g. transcribing "quadratic equation" as random Devanagari noise). If the STT output garbage, the LLM took extra time trying to make sense of it, spiking latency past 1.5 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Fix&lt;/strong&gt;: Paired Deepgram Nova-3's &lt;code&gt;multi&lt;/code&gt; language model with Murf Falcon TTS. Deepgram correctly captures mixed Devanagari and Latin script text, and Murf Falcon streams the output audio within 55ms, keeping the conversation instantaneous.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bug #2: Context Wipeout During Agent Handoffs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem&lt;/strong&gt;: On the first iteration of &lt;code&gt;session.update_agent()&lt;/code&gt;, the newly active &lt;code&gt;MathsPracticeSpecialist&lt;/code&gt; agent wiped out the conversation buffer, responding with a generic &lt;em&gt;"Hello, how can I help you?"&lt;/em&gt; right after the main agent had already promised to solve the quadratic equation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Fix&lt;/strong&gt;: Passed the active &lt;code&gt;session.history&lt;/code&gt; array into the specialist agent's initialization parameters. The specialist immediately scans the existing transcript context and jumps straight into the step-by-step solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bug #3: Voice PII Scrubbing on Human Escalations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem&lt;/strong&gt;: When a student gets repeatedly stuck on a concept or has an exam dispute, &lt;code&gt;Shiksha AI&lt;/code&gt; escalates the issue to a human teacher via a &lt;strong&gt;Discord Webhook&lt;/strong&gt; and SQLite ticket. However, students occasionally blurt out phone numbers, OTPs, or Aadhaar numbers during voice calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Fix&lt;/strong&gt;: Implemented a backend regex sanitizer (&lt;code&gt;sanitize_summary&lt;/code&gt; in &lt;code&gt;src/db.py&lt;/code&gt;) that scrubs passwords, 6-digit OTPs, and 12-digit Aadhaar patterns from the transcript summary &lt;em&gt;before&lt;/em&gt; creating the database record or sending the Discord alert card.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💻 Code Breakdown: Core Implementation Snippets
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Initializing Murf Falcon TTS in LiveKit (&lt;code&gt;src/agent.py&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;livekit.plugins&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;murf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deepgram&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;livekit.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AgentSession&lt;/span&gt;

&lt;span class="c1"&gt;# Setup Murf Falcon Streaming TTS (55ms latency with authentic Indian accent)
&lt;/span&gt;&lt;span class="n"&gt;tts_engine&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;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MURF_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&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;en-IN-falcon-female&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;conversational&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="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;stt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;deepgram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;STT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nova-3-multi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-1.5-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;tts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tts_engine&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;
  
  
  2. Human Escalation with PII Scrubbing (&lt;code&gt;src/tools.py&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@llm.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;create_escalation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;caller_name&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;phone_number&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;issue_category&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;summary&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;user_consent_given&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Escalates complex issues to human teachers after explicit consent.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;user_consent_given&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;ERROR: Consent was not provided by caller. Ticket creation aborted.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Redact sensitive PII before storing
&lt;/span&gt;    &lt;span class="n"&gt;clean_summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sanitize_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;ticket_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;save_human_escalation_ticket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;caller_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;caller_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;phone_number&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;phone_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;issue_category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;clean_summary&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Trigger Discord Webhook Notification asynchronously
&lt;/span&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;send_discord_escalation_alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;caller_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clean_summary&lt;/span&gt;&lt;span class="p"&gt;)&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;SUCCESS: Escalation logged (Ref ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ticket_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;). Teacher will call back in 2-4 hours.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Specialist Agent Handoff Tool (&lt;code&gt;src/agent.py&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@llm.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;hand_off_to_math_specialist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AgentSession&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Transfers the live voice session to the Maths Practice Specialist AI.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Spoken announcement to the learner
&lt;/span&gt;    &lt;span class="k"&gt;await&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;say&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I am transferring you to our Maths Practice Specialist AI now!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Update session agent while preserving session.history context
&lt;/span&gt;    &lt;span class="n"&gt;math_specialist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MathsPracticeSpecialist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;await&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;update_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;math_specialist&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;SUCCESS: Handed off conversation to MathsPracticeSpecialist.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Testing &amp;amp; Verification
&lt;/h2&gt;

&lt;p&gt;To verify that all 10 days of features remain stable, I wrote automated Pytest suites covering guardrail compliance, tool invocations, outbound telephony status handling, human escalation ticket creation, analytics logging, and handoff transitions:&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
python &lt;span class="nt"&gt;-m&lt;/span&gt; pytest tests/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;============================= 32 passed in 55.35s =============================
tests/test_agent.py            ... (3/3 passed)
tests/test_day2_guardrails.py   .... (4/4 passed)
tests/test_day5_tools.py        ...... (6/6 passed)
tests/test_day6_outbound.py     ..... (5/5 passed)
tests/test_day7_escalation.py   ...... (6/6 passed)
tests/test_day8_analytics.py    .... (4/4 passed)
tests/test_day9_handoff.py      .... (4/4 passed)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Quickstart: Run Shiksha AI in 2 Minutes
&lt;/h2&gt;

&lt;p&gt;Want to test or inspect the codebase yourself? Follow these simple steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 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/jaysid97/Ten-day-of-voice-challenges-bharat-edition.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Ten-day-of-voice-challenges-bharat-edition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Configure Environment Keys
&lt;/h3&gt;

&lt;p&gt;Copy &lt;code&gt;.env.example&lt;/code&gt; to &lt;code&gt;murf-livekit-starter/backend/.env.local&lt;/code&gt;:&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=wss://your-livekit-project.livekit.cloud
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_google_gemini_api_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Launch the Application
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows (PowerShell)&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\start_app.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS / Linux (Bash)&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;chmod&lt;/span&gt; +x start_app.sh
  ./start_app.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:3000&lt;/code&gt; in your browser, click &lt;strong&gt;"Start Conversation"&lt;/strong&gt;, grant mic permissions, and start talking to Shiksha AI!&lt;/p&gt;




&lt;h2&gt;
  
  
  🔮 What's Next for Shiksha AI?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Offline Voice Caching&lt;/strong&gt;: Caching common NCERT definitions directly on mobile devices to support learners in rural areas with poor 3G/4G connectivity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;South Indian Language Expansion&lt;/strong&gt;: Extending native voice models to Tamil, Telugu, Kannada, and Malayalam.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Modal Interactive Whiteboard&lt;/strong&gt;: Rendering real-time math diagrams and geometric shapes alongside Murf Falcon voice explanations.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🔗 Project Links &amp;amp; Credits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;💻 &lt;strong&gt;Open-Source Codebase&lt;/strong&gt;: &lt;a href="https://github.com/jaysid97/Ten-day-of-voice-challenges-bharat-edition" rel="noopener noreferrer"&gt;github.com/jaysid97/Ten-day-of-voice-challenges-bharat-edition&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎙️ &lt;strong&gt;TTS Provider&lt;/strong&gt;: &lt;a href="https://murf.ai/" rel="noopener noreferrer"&gt;Murf Falcon TTS (55ms Latency)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Transport Engine&lt;/strong&gt;: &lt;a href="https://livekit.io/" rel="noopener noreferrer"&gt;LiveKit Agents&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💼 LinkedIn Share Template (#VoiceForBharat)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🎉 Day 10 of 10 Days of Voice Agents: Sharing My Voice AI Journey! 🎙️🇮🇳 #VoiceForBharat

Over the past 10 days, I built Shiksha AI (शिक्षा AI) — a Human-Type AI Voice Tutor designed for learners across Bharat (EdTech Track)!

What started as a simple real-time voice pipeline evolved into an enterprise-grade voice agent featuring:
✨ Ultra-fast 55ms Indian Voice synthesis powered by Murf Falcon TTS
🧠 Persistent Learner Memory &amp;amp; Hard Consent Rules (SQLite DB)
🛠️ Live Domain Tools (NCERT Wikipedia REST API &amp;amp; Dictionary Integration)
📞 Outbound Telephony &amp;amp; Mandatory 2-Sentence Opening Scripts (LiveKit SIP &amp;amp; Twilio)
🚨 Human Escalation Engine with PII Scrubbing &amp;amp; Discord Webhooks
📊 Real-Time Call Analytics Dashboard (/analytics)
🧮 Multi-Agent Specialist Handoffs (MathsPracticeSpecialist AI)

The highlight of this journey was building with Murf Falcon TTS — hands down the fastest, most natural-sounding Text-to-Speech API for Indian accents and multilingual speech!

📖 Read my complete step-by-step guide &amp;amp; architecture breakdown:
[INSERT YOUR PUBLISHED BLOG URL HERE]

💻 Inspect the open-source code on GitHub:
https://github.com/jaysid97/Ten-day-of-voice-challenges-bharat-edition

A huge thank you to @Murf AI for organizing the 10 Days of Voice Agents — VoiceForBharat Edition! 🚀

#VoiceForBharat #MurfAI #VoiceAI #EdTech #ArtificialIntelligence #LiveKit #Python #NextJS #WebRTC #BuildInPublic #BharatAI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Thanks for reading! If you're building real-time voice applications or experimenting with LiveKit and Murf AI, drop a comment or reach out — I'd love to swap notes!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>voiceai</category>
      <category>ai</category>
      <category>webdev</category>
      <category>python</category>
    </item>
    <item>
      <title>EcoTwin: An AI Climate Coach for Real-World Emissions Cuts</title>
      <dc:creator>jaysid97</dc:creator>
      <pubDate>Mon, 20 Apr 2026 13:21:08 +0000</pubDate>
      <link>https://dev.to/jaysid97/ecotwin-an-ai-climate-coach-for-real-world-emissions-cuts-4dk7</link>
      <guid>https://dev.to/jaysid97/ecotwin-an-ai-climate-coach-for-real-world-emissions-cuts-4dk7</guid>
      <description>&lt;p&gt;What I Built&lt;br&gt;
Most climate tools diagnose. EcoTwin prescribes.&lt;/p&gt;

&lt;p&gt;EcoTwin is a personalized climate action coach that turns a few everyday inputs, like commute habits, food choices, home energy use, and travel frequency, into a practical action plan with estimated annual CO2e savings.&lt;/p&gt;

&lt;p&gt;Instead of stopping at a “guilt score,” EcoTwin estimates a baseline footprint, shows a before/after projection, and recommends the highest-impact changes first.&lt;/p&gt;

&lt;p&gt;Users get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A baseline annual footprint estimate&lt;/li&gt;
&lt;li&gt;A personalized set of top climate actions&lt;/li&gt;
&lt;li&gt;Projected annual CO2e savings&lt;/li&gt;
&lt;li&gt;A concise AI coaching summary powered by Gemini (with fallback if a key is unavailable)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Demo&lt;br&gt;
Live demo:&lt;a href="https://ecotwin-qsgv.onrender.com/" rel="noopener noreferrer"&gt;https://ecotwin-qsgv.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quick walkthrough:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the app&lt;/li&gt;
&lt;li&gt;Enter a city and lifestyle inputs&lt;/li&gt;
&lt;li&gt;Click Generate My Climate Plan&lt;/li&gt;
&lt;li&gt;Review before/after footprint and recommended actions&lt;/li&gt;
&lt;li&gt;Read the AI coach summary&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Code&lt;br&gt;
Source code is in the project folder and includes:&lt;br&gt;
-Backend:Flask API for scoring, recommendations, and AI summary&lt;br&gt;
-Frontend:HTML/CSS/JS dashboard with interactive results&lt;br&gt;
-Data:Curated action library with estimated CO2e savings&lt;/p&gt;

&lt;p&gt;Core implementation highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transparent footprint estimation model&lt;/li&gt;
&lt;li&gt;Rule-based personalization by user profile&lt;/li&gt;
&lt;li&gt;Gemini API integration for natural-language coaching&lt;/li&gt;
&lt;li&gt;Stable local fallback summary for reliability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How I Built It&lt;br&gt;
I built EcoTwin as a focused full-stack Flask app to keep it easy to run, easy to demo, and easy to judge.&lt;/p&gt;

&lt;p&gt;Architecture flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Frontend collects a lightweight user profile&lt;/li&gt;
&lt;li&gt;Backend computes annual baseline emissions&lt;/li&gt;
&lt;li&gt;Action library is filtered by relevance and sorted by impact&lt;/li&gt;
&lt;li&gt;App calculates projected reductions and renders before/after metrics&lt;/li&gt;
&lt;li&gt;Gemini generates a short personalized coaching summary&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Design decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kept input friction low so users can get value in seconds&lt;/li&gt;
&lt;li&gt;Prioritized practical behavior-change suggestions over abstract climate theory&lt;/li&gt;
&lt;li&gt;Added clear before/after visuals to make impact tangible during a live demo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prize Categories&lt;br&gt;
This submission is for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Google Gemini&lt;/li&gt;
&lt;li&gt;Best Use of GitHub Copilot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Team&lt;br&gt;
Solo submission.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>ai</category>
      <category>earthday</category>
    </item>
  </channel>
</rss>
