<?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: Nakkina Sai Venkata Teja</title>
    <description>The latest articles on DEV Community by Nakkina Sai Venkata Teja (@nakkina_saivenkatateja_).</description>
    <link>https://dev.to/nakkina_saivenkatateja_</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%2F4078540%2Fbfd7a55f-51d7-46b6-870c-c7456b8e09ad.png</url>
      <title>DEV Community: Nakkina Sai Venkata Teja</title>
      <link>https://dev.to/nakkina_saivenkatateja_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nakkina_saivenkatateja_"/>
    <language>en</language>
    <item>
      <title>From a Voice That Talks to a Voice Agent That Knows What to Do</title>
      <dc:creator>Nakkina Sai Venkata Teja</dc:creator>
      <pubDate>Sat, 15 Aug 2026 07:58:49 +0000</pubDate>
      <link>https://dev.to/nakkina_saivenkatateja_/from-a-voice-that-talks-to-a-voice-agent-that-knows-what-to-do-406j</link>
      <guid>https://dev.to/nakkina_saivenkatateja_/from-a-voice-that-talks-to-a-voice-agent-that-knows-what-to-do-406j</guid>
      <description>&lt;p&gt;&lt;strong&gt;What if an AI could teach a child the way a patient parent does?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That was the question I started with.&lt;/p&gt;

&lt;p&gt;Not Can I build an AI that talks?&lt;/p&gt;

&lt;p&gt;That part is becoming easier.&lt;/p&gt;

&lt;p&gt;The harder question was:&lt;/p&gt;

&lt;p&gt;Can I build a voice agent that actually understands its role, remembers the right things, knows when to use a tool, knows when to ask a human for help, and knows when another agent is better suited to handle the conversation?&lt;/p&gt;

&lt;p&gt;Over the last ten days, I built BoloBuddy around that question.&lt;/p&gt;

&lt;p&gt;At the center of BoloBuddy is Chinnu 🐥 a voice-first language learning companion designed to help young children learn Telugu, Hindi, and English naturally through conversation.&lt;/p&gt;

&lt;p&gt;The journey started with a simple voice pipeline.&lt;/p&gt;

&lt;p&gt;It ended with a system that could remember individual children, use external tools, make outbound phone calls, escalate to a human, measure whether a learning session succeeded, and hand conversations to a pronunciation specialist.&lt;/p&gt;

&lt;p&gt;And somewhere along the way, I realized something important:&lt;/p&gt;

&lt;p&gt;Building a voice agent isn't really about giving an AI a voice. It's about teaching it when and how to act.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I wanted to solve
&lt;/h2&gt;

&lt;p&gt;Think about how a young child learns their first words.&lt;/p&gt;

&lt;p&gt;A parent points at a ball.&lt;/p&gt;

&lt;p&gt;“Ball.”&lt;/p&gt;

&lt;p&gt;Then again.&lt;/p&gt;

&lt;p&gt;“Ball.”&lt;/p&gt;

&lt;p&gt;The child tries.&lt;/p&gt;

&lt;p&gt;Maybe they get it right.&lt;/p&gt;

&lt;p&gt;Maybe they don't.&lt;/p&gt;

&lt;p&gt;The parent doesn't immediately turn the interaction into a test. They repeat the word, encourage the attempt, and try again.&lt;/p&gt;

&lt;p&gt;That kind of patient, repetitive interaction is difficult to reproduce consistently.&lt;/p&gt;

&lt;p&gt;Parents are busy. Families may not always have someone available to practice with a child. And in multilingual environments, children naturally move between languages rather than staying inside the boundaries of a textbook.&lt;/p&gt;

&lt;p&gt;So I wanted to build a voice-first companion that could make language practice feel like a conversation rather than a lesson.&lt;/p&gt;

&lt;p&gt;That became &lt;strong&gt;BoloBuddy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea was simple:&lt;/p&gt;

&lt;p&gt;A child talks to Chinnu. Chinnu listens, introduces simple words, encourages attempts, remembers progress, and adapts future conversations around what the child has already learned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voice was important because&lt;/strong&gt; children shouldn't have to read menus, type answers, or navigate a complicated interface to interact with their learning companion.&lt;/p&gt;

&lt;p&gt;They should be able to simply talk.&lt;/p&gt;

&lt;p&gt;It started with four pieces&lt;/p&gt;

&lt;p&gt;The first version of the system was much simpler.&lt;/p&gt;

&lt;p&gt;At its core was a real-time voice pipeline:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Child → Speech-to-Text → LLM → Text-to-Speech → Child&lt;/code&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%2Fs62xkqq6i2fcyri8fyoj.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%2Fs62xkqq6i2fcyri8fyoj.png" alt="Voice Agent Image" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The components were:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deepgram Nova-3&lt;/strong&gt; for multilingual speech-to-text&lt;br&gt;
&lt;strong&gt;Google Gemini&lt;/strong&gt; as the LLM&lt;br&gt;
&lt;strong&gt;Murf Falcon&lt;/strong&gt; for text-to-speech&lt;br&gt;
&lt;strong&gt;LiveKit Agents&lt;/strong&gt; for the real-time voice pipeline and transport&lt;br&gt;
&lt;strong&gt;Next.js + Tailwind CSS&lt;/strong&gt; for the frontend&lt;/p&gt;

&lt;p&gt;Murf Falcon became the voice of Chinnu, providing an Indian voice that helped make the experience feel more natural for the target users.&lt;/p&gt;

&lt;p&gt;But getting the pipeline to work was only the beginning.&lt;/p&gt;

&lt;p&gt;A voice that can respond isn't necessarily a useful voice agent.&lt;/p&gt;

&lt;p&gt;So I started asking what Chinnu would actually need.&lt;/p&gt;

&lt;p&gt;First, Chinnu needed an identity&lt;/p&gt;

&lt;p&gt;The first major realization was that the personality of a voice agent matters.&lt;/p&gt;

&lt;p&gt;I didn't want Chinnu to behave like a generic chatbot that answers every question.&lt;/p&gt;

&lt;p&gt;Chinnu needed a specific role.&lt;/p&gt;

&lt;p&gt;It should behave like a caring language-learning companion:&lt;/p&gt;

&lt;p&gt;Introduce one word at a time&lt;br&gt;
Encourage every attempt&lt;br&gt;
Correct gently&lt;br&gt;
Keep conversations natural&lt;br&gt;
Support Telugu, Hindi, and English&lt;br&gt;
Refuse requests outside its role&lt;/p&gt;

&lt;p&gt;More importantly, I had to define what Chinnu should never do.&lt;/p&gt;

&lt;p&gt;It should never shame a child for a wrong answer.&lt;/p&gt;

&lt;p&gt;It should never compare children.&lt;/p&gt;

&lt;p&gt;It should never diagnose developmental conditions.&lt;/p&gt;

&lt;p&gt;And it shouldn't pretend to know things outside its role.&lt;/p&gt;

&lt;p&gt;That was one of my first lessons in building AI agents:&lt;/p&gt;

&lt;p&gt;A good system prompt isn't just a description of what an agent can do. It is also a boundary around what it should not do.&lt;/p&gt;

&lt;p&gt;Then the voice needed a place to live&lt;/p&gt;

&lt;p&gt;A voice agent can technically work with nothing more than a microphone and a response.&lt;/p&gt;

&lt;p&gt;But for a child, the surrounding experience matters.&lt;/p&gt;

&lt;p&gt;So I built a complete interface around Chinnu.&lt;/p&gt;

&lt;p&gt;The frontend included:&lt;/p&gt;

&lt;p&gt;Animated word bubbles&lt;br&gt;
A hand-crafted Chinnu character&lt;br&gt;
Language badges&lt;br&gt;
A clear “Talk to Chinnu” call-to-action&lt;br&gt;
Five visible agent states: &lt;code&gt;Ready → Connecting → Listening → Speaking → Call Ended&lt;/code&gt;&lt;br&gt;
A “Who is speaking?” indicator&lt;br&gt;
A friendly microphone permission experience&lt;br&gt;
A child-oriented visual design using playful animations and Nunito typography&lt;/p&gt;

&lt;p&gt;This changed the experience from:&lt;/p&gt;

&lt;p&gt;“Here is an AI voice.”&lt;/p&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;p&gt;“Here is Chinnu, your learning buddy.”&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%2Ftn7ajcsyn2280ozmqiz8.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%2Ftn7ajcsyn2280ozmqiz8.png" alt="Frontend" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That distinction matters when the user is a child.&lt;/p&gt;

&lt;p&gt;The moment Chinnu became personal: memory&lt;/p&gt;

&lt;p&gt;A child learning a language shouldn't have to start from zero every time they return.&lt;/p&gt;

&lt;p&gt;That led to the next question:&lt;/p&gt;
&lt;h2&gt;
  
  
  What should Chinnu remember?
&lt;/h2&gt;

&lt;p&gt;I integrated MongoDB to give each child persistent learning memory.&lt;/p&gt;

&lt;p&gt;Every child gets their own learning identity, and the system can store information such as:&lt;/p&gt;

&lt;p&gt;Name&lt;br&gt;
Words learned&lt;br&gt;
Previous mistakes&lt;br&gt;
Interaction history&lt;/p&gt;

&lt;p&gt;But I didn't want to simply dump all of this information into the system prompt.&lt;/p&gt;

&lt;p&gt;Instead, Chinnu interacts with memory through function calling.&lt;/p&gt;

&lt;p&gt;When memory is needed, the agent can retrieve it.&lt;/p&gt;

&lt;p&gt;When new learning information needs to be saved, it can update the relevant data.&lt;/p&gt;

&lt;p&gt;I also added consent-based memory saving.&lt;/p&gt;

&lt;p&gt;Chinnu asks before remembering new learning information, and saving is blocked when permission hasn't been granted.&lt;/p&gt;

&lt;p&gt;There is also strict child-level memory isolation so an agent tool call cannot simply select another child's data.&lt;/p&gt;

&lt;p&gt;That produced a much more meaningful learning loop:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Child struggles with a word → Chinnu remembers → conversation ends → child returns → Chinnu retrieves the memory → future practice continues from there.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The goal wasn't to make Chinnu remember a child's name.&lt;/p&gt;

&lt;p&gt;The goal was to make every conversation useful to the next conversation.&lt;/p&gt;

&lt;p&gt;Then I gave Chinnu access to the outside world&lt;/p&gt;

&lt;p&gt;An LLM has a lot of knowledge.&lt;/p&gt;

&lt;p&gt;But sometimes the right answer isn't something it should generate from its internal knowledge.&lt;/p&gt;

&lt;p&gt;Sometimes it should look something up.&lt;/p&gt;

&lt;p&gt;So I integrated the Free Dictionary API using a function tool.&lt;/p&gt;

&lt;p&gt;The flow became:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Gemini decides a lookup is needed → Dictionary tool → External API → Gemini → Child-friendly explanation → Murf Falcon&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This taught me an important distinction between an LLM and an agent.&lt;/p&gt;

&lt;p&gt;An LLM can generate an answer.&lt;/p&gt;

&lt;p&gt;An agent can decide:&lt;/p&gt;

&lt;p&gt;“I need to use a tool before I answer.”&lt;/p&gt;

&lt;p&gt;I also had to think about what happens when the tool fails.&lt;/p&gt;

&lt;p&gt;During testing, I said “OK” and Chinnu treated it as a word to look up.&lt;/p&gt;

&lt;p&gt;The dictionary didn't return a useful result.&lt;/p&gt;

&lt;p&gt;Instead of inventing a definition, Chinnu followed the failure path and responded naturally by suggesting another word.&lt;/p&gt;

&lt;p&gt;That small failure was actually one of my favorite moments of the challenge.&lt;/p&gt;

&lt;p&gt;Because production systems don't only need a successful path.&lt;/p&gt;

&lt;p&gt;They need a sensible answer when things go wrong.&lt;/p&gt;

&lt;p&gt;Then Chinnu got a phone&lt;/p&gt;

&lt;p&gt;Until this point, Chinnu waited for someone to open the application.&lt;/p&gt;

&lt;p&gt;Day 6 changed that.&lt;/p&gt;

&lt;p&gt;I connected LiveKit SIP with Twilio and gave Chinnu the ability to make outbound phone calls.&lt;/p&gt;

&lt;p&gt;The architecture became:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Chinnu → LiveKit → SIP → Twilio → Phone&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And the conversation travelled back through the voice pipeline:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Phone → Twilio → LiveKit → Deepgram → Gemini → Murf Falcon → Phone&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This was the first time the agent stopped being limited to a browser.&lt;/p&gt;

&lt;p&gt;It could initiate a real telephone conversation.&lt;/p&gt;

&lt;p&gt;But telephony introduced a completely different layer of complexity.&lt;/p&gt;

&lt;p&gt;The AI wasn't directly “calling a phone.”&lt;/p&gt;

&lt;p&gt;There was a bridge between the voice agent and the traditional telephone network.&lt;/p&gt;

&lt;p&gt;Understanding that bridge was one of the most valuable technical lessons of the challenge.&lt;/p&gt;

&lt;p&gt;I also had to teach Chinnu when to stop&lt;/p&gt;

&lt;p&gt;One of the most important changes wasn't adding another capability.&lt;/p&gt;

&lt;p&gt;It was adding a boundary.&lt;/p&gt;

&lt;p&gt;A good agent shouldn't try to solve every problem itself.&lt;/p&gt;

&lt;p&gt;For BoloBuddy, I identified two situations where Chinnu should ask for human help:&lt;/p&gt;

&lt;p&gt;When a child becomes frustrated&lt;br&gt;
When a child explicitly asks for a teacher&lt;/p&gt;

&lt;p&gt;But escalation couldn't simply be:&lt;/p&gt;

&lt;p&gt;Problem → Human&lt;/p&gt;

&lt;p&gt;There needed to be a consent step.&lt;/p&gt;

&lt;p&gt;The flow became:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Problem → Explain → Ask Permission → Escalate → Notify Parent&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Chinnu asks what information will be shared and gets permission before creating the escalation request.&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%2F356vqvukpia2rocdy0bi.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%2F356vqvukpia2rocdy0bi.png" alt="Escalation Request" width="800" height="359"&gt;&lt;/a&gt;&lt;br&gt;
The system creates a short, useful request rather than simply storing the entire conversation, connects it to the correct child's identity, and surfaces an alert in the parent dashboard.&lt;/p&gt;

&lt;p&gt;And if the child says no?&lt;/p&gt;

&lt;p&gt;Nothing gets created.&lt;/p&gt;

&lt;p&gt;That made me think differently about AI autonomy.&lt;/p&gt;

&lt;p&gt;Knowing what an agent can do is only half the design problem. Knowing when it should not act alone is equally important.&lt;/p&gt;

&lt;p&gt;Then came the question: how do I know if Chinnu is actually helping?&lt;/p&gt;

&lt;p&gt;An AI system can have a perfect connection, a long conversation, and a very natural voice—and still fail at its actual purpose.&lt;/p&gt;

&lt;p&gt;For a language-learning agent, I needed a measurable definition of success.&lt;/p&gt;

&lt;p&gt;So I defined one:&lt;/p&gt;

&lt;p&gt;A session is successful when the child successfully learns at least two unique words.&lt;/p&gt;

&lt;p&gt;I then built session-level tracking around that objective.&lt;/p&gt;

&lt;p&gt;The system:&lt;/p&gt;

&lt;p&gt;Tracks successfully learned words&lt;br&gt;
Prevents duplicate words from being counted multiple times&lt;br&gt;
Determines whether a completed call succeeded or failed&lt;br&gt;
Stores call outcomes and learning data in MongoDB&lt;br&gt;
Displays Total Calls, Successful Calls, and Failed Calls in an analytics dashboard&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%2Fhqpihk0fji2nltx1q6tp.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%2Fhqpihk0fji2nltx1q6tp.png" alt="Analytics Dashboard" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This changed the way I thought about agent evaluation.&lt;/p&gt;

&lt;p&gt;For BoloBuddy, success isn't:&lt;/p&gt;

&lt;p&gt;“The child talked to the AI for ten minutes.”&lt;/p&gt;

&lt;p&gt;It isn't even:&lt;/p&gt;

&lt;p&gt;“The voice connection worked.”&lt;/p&gt;

&lt;p&gt;The meaningful question is:&lt;/p&gt;

&lt;p&gt;“Did the child achieve the learning objective?”&lt;/p&gt;

&lt;p&gt;That shift—from capability to measurable outcome—is something I want to carry into every future agent I build.&lt;/p&gt;

&lt;p&gt;Finally, Chinnu learned that it doesn't have to be the smartest agent in the room&lt;/p&gt;

&lt;p&gt;The final major step was introducing a second agent.&lt;/p&gt;

&lt;p&gt;I created a Pronunciation Specialist whose job is focused specifically on pronunciation help.&lt;/p&gt;

&lt;p&gt;Instead of forcing Chinnu to handle every pronunciation problem, it can hand the conversation over when specialized help is needed.&lt;/p&gt;

&lt;p&gt;The flow became:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Child → Chinnu → Identify Pronunciation Need → Handoff → Pronunciation Specialist → Continue Conversation&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The important part wasn't simply creating another agent.&lt;/p&gt;

&lt;p&gt;It was defining a clear responsibility for that agent.&lt;/p&gt;

&lt;p&gt;The conversation context is preserved, so the child doesn't have to explain the problem again.&lt;/p&gt;

&lt;p&gt;And Chinnu doesn't hand off normal conversations unnecessarily.&lt;/p&gt;

&lt;p&gt;That gave me another important lesson:&lt;/p&gt;

&lt;p&gt;Multi-agent systems aren't about adding more agents. They're about giving each agent a clear responsibility.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the final system looks like
&lt;/h2&gt;

&lt;p&gt;After ten days, BoloBuddy had evolved considerably from the first voice prototype.&lt;/p&gt;

&lt;p&gt;At a high level:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                     ┌──────────────────┐
                     │      Child       │
                     └────────┬─────────┘
                              │
                     Voice / Phone
                              │
                     ┌────────▼─────────┐
                     │     LiveKit      │
                     │ Real-time Voice  │
                     └────────┬─────────┘
                              │
                ┌─────────────┼─────────────┐
                │             │             │
                ▼             ▼             ▼
           Deepgram        Gemini      Murf Falcon
              STT            LLM            TTS
                              │
                ┌─────────────┼──────────────┐
                │             │              │
                ▼             ▼              ▼
            MongoDB      Dictionary API   Escalation
             Memory          Tool            Tool
                │                            │
                │                            ▼
                │                     Parent Dashboard
                │
                ▼
          Learning Context

                     Gemini
                       │
                       ▼
              Pronunciation Need?
                       │
                     Yes
                       ▼
            Pronunciation Specialist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The browser experience, telephony experience, memory, tools, escalation, analytics, and specialist handoff all build around the same core voice-agent pipeline.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I would tell someone building their first voice agent
&lt;/h2&gt;

&lt;p&gt;If you're starting from scratch, you don't need to build everything I built.&lt;/p&gt;

&lt;p&gt;Start with the smallest possible loop:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Speech → STT → LLM → TTS → Speech&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then add capabilities one at a time.&lt;/p&gt;

&lt;p&gt;The starter repository I used provides a production-oriented foundation around LiveKit Agents and Murf Falcon.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the starter
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/murf-ai/murf-livekit-starter.git
cd murf-livekit-starter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The project is split into a backend Python voice agent and a Next.js frontend.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the prerequisites&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;1. Python 3.10+&lt;/li&gt;
&lt;li&gt;2. uv&lt;/li&gt;
&lt;li&gt;3. Node.js 18+&lt;/li&gt;
&lt;li&gt;4. pnpm&lt;/li&gt;
&lt;li&gt;5. A LiveKit project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Windows, uv can be installed with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And pnpm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g pnpm

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

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Configure your API keys&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create .env.local files in the backend and frontend using the provided .env.example files.&lt;/p&gt;

&lt;p&gt;The backend needs credentials 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;LIVEKIT_URL
LIVEKIT_API_KEY
LIVEKIT_API_SECRET
MURF_API_KEY
DEEPGRAM_API_KEY
GOOGLE_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;These should be stored as environment variables.&lt;/p&gt;

&lt;p&gt;Never hard-code API keys into your source code or commit them to GitHub.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the backend
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd backend
uv sync
uv run python src/agent.py download-files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Install the frontend
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd frontend
pnpm install
6. Run the application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can run everything together using the provided startup script, or run the services separately.&lt;/p&gt;

&lt;p&gt;For the separate-terminal approach:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;livekit-server --dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd backend
uv run python src/agent.py dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And in another terminal:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd 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 Start talking, allow microphone access, and speak.&lt;/p&gt;

&lt;p&gt;You now have the basic voice-agent loop running.&lt;/p&gt;

&lt;p&gt;From there, the interesting part begins.&lt;/p&gt;

&lt;p&gt;Where the behavior actually lives&lt;/p&gt;

&lt;p&gt;One of the simplest ways to customize the starter is to change the system prompt.&lt;/p&gt;

&lt;p&gt;In the starter project, the system prompt lives in:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;backend/src/agent.py&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The SYSTEM_PROMPT defines the agent's role and behavior.&lt;/p&gt;

&lt;p&gt;Change that prompt and you can turn the same voice infrastructure into something completely different—a customer support agent, language tutor, receptionist, or another specialized assistant.&lt;/p&gt;

&lt;p&gt;That separation is powerful:&lt;/p&gt;

&lt;p&gt;The infrastructure provides the voice-agent capabilities. The prompt defines what the agent is supposed to be.&lt;/p&gt;

&lt;p&gt;Then tools, memory, telephony, and specialist agents extend what it can actually do.&lt;/p&gt;
&lt;h2&gt;
  
  
  What was actually difficult?
&lt;/h2&gt;

&lt;p&gt;The most difficult part of this challenge wasn't writing one massive piece of code.&lt;/p&gt;

&lt;p&gt;It was understanding how all the pieces fit together.&lt;/p&gt;

&lt;p&gt;Every new capability introduced another system boundary.&lt;/p&gt;

&lt;p&gt;Memory meant thinking about authentication, child identity, database access, consent, and isolation.&lt;/p&gt;

&lt;p&gt;Tools meant thinking about when the LLM should call an external service and what happens when that service fails.&lt;/p&gt;

&lt;p&gt;Telephony meant understanding the bridge between LiveKit, SIP, Twilio, and the phone network.&lt;/p&gt;

&lt;p&gt;Human escalation meant thinking about consent and what information should actually be shared.&lt;/p&gt;

&lt;p&gt;Analytics meant deciding what “success” means before measuring it.&lt;/p&gt;

&lt;p&gt;Multi-agent handoffs meant deciding which agent should own which responsibility.&lt;/p&gt;

&lt;p&gt;The biggest lesson was therefore not a particular API or framework.&lt;/p&gt;

&lt;p&gt;It was this:&lt;/p&gt;

&lt;p&gt;A reliable voice agent is a system of decisions, not just a conversational model.&lt;/p&gt;

&lt;p&gt;What I would build next&lt;/p&gt;

&lt;p&gt;BoloBuddy is still a starting point.&lt;/p&gt;

&lt;p&gt;If I continue developing it, I would want to explore richer learning analytics, more sophisticated personalization, stronger pronunciation evaluation, and deeper parent-facing insights.&lt;/p&gt;

&lt;p&gt;But I wouldn't want to add features simply because they are technically possible.&lt;/p&gt;

&lt;p&gt;The original question should remain the filter:&lt;/p&gt;

&lt;p&gt;Does this make the child's learning experience better?&lt;/p&gt;

&lt;p&gt;That is the standard I want to use for the next version.&lt;/p&gt;

&lt;p&gt;From a voice demo to an agentic system&lt;/p&gt;

&lt;p&gt;Ten days ago, I started with something simple:&lt;/p&gt;

&lt;p&gt;An AI that could hear a child and talk back.&lt;/p&gt;

&lt;p&gt;Today, Chinnu can:&lt;/p&gt;

&lt;p&gt;Speak using an Indian voice powered by Murf Falcon&lt;br&gt;
Handle Telugu, Hindi, English, and code-mixed conversations&lt;br&gt;
Follow a defined personality and safety boundaries&lt;br&gt;
Remember child-specific learning information&lt;br&gt;
Retrieve and update memory through tools&lt;br&gt;
Use an external dictionary API&lt;br&gt;
Handle tool failures gracefully&lt;br&gt;
Make outbound phone calls through LiveKit SIP and Twilio&lt;br&gt;
Ask for human help with consent&lt;br&gt;
Notify parents about escalations&lt;br&gt;
Measure learning outcomes through call analytics&lt;br&gt;
Hand pronunciation conversations to a specialist agent&lt;/p&gt;

&lt;p&gt;The progression wasn't:&lt;/p&gt;

&lt;p&gt;Voice → more voice features.&lt;/p&gt;

&lt;p&gt;It was:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Voice → personality → memory → tools → telephony → human escalation → measurement → specialization.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And that changed how I think about voice AI.&lt;/p&gt;

&lt;p&gt;The most interesting voice agents aren't necessarily the ones that can talk the most.&lt;/p&gt;

&lt;p&gt;They're the ones that understand:&lt;/p&gt;

&lt;p&gt;what to do, when to do it, what not to do, when to ask for help, and what outcome they're actually responsible for.&lt;/p&gt;

&lt;p&gt;That's what I wanted BoloBuddy to become.&lt;/p&gt;

&lt;p&gt;And that's what these ten days taught me about building agents.&lt;/p&gt;
&lt;h2&gt;
  
  
  Explore the project
&lt;/h2&gt;

&lt;p&gt;Source code:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/N-SAI-VENKATA-TEJA" rel="noopener noreferrer"&gt;
        N-SAI-VENKATA-TEJA
      &lt;/a&gt; / &lt;a href="https://github.com/N-SAI-VENKATA-TEJA/murf-livekit-starter" rel="noopener noreferrer"&gt;
        murf-livekit-starter
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Voice Agent Starter — Powered by Murf Falcon&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Build a production voice AI agent in 5 minutes. Powered by the fastest TTS on the market - swap the system prompt to build anything from customer support to language tutors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt; &lt;a href="https://murf.ai/api/docs/text-to-speech/streaming" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/db7bf12a5f5585a33fb99e43d713c1496533102576907c6643e488221cf247d1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5454532d4d75726625323046616c636f6e2d363336364631" alt="Murf Falcon"&gt;&lt;/a&gt; &lt;a href="https://docs.livekit.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fda4f125b93984f962dc38580531fb47772deab77b73e246180e581a8cae1c92/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5472616e73706f72742d4c6976654b69742d303032636632" alt="LiveKit"&gt;&lt;/a&gt; &lt;a href="https://www.typescriptlang.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7e5467cebf1145e2e9b56585b8b28c31ec43e55e8daa2e9ee2f6abe2fe78fe28/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d3030374143433f6c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465" alt="TypeScript"&gt;&lt;/a&gt; &lt;a href="https://www.python.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/aa310a519d421027705c2a5553e301bdea1fa6e331b3cd73e02a9ba368f077d3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31302b2d3337373641423f6c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465" alt="Python"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why Murf Falcon&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;55ms model latency&lt;/strong&gt; - fastest production TTS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;130ms time-to-first-audio&lt;/strong&gt; across 10+ global regions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$0.01/1000 characters&lt;/strong&gt; - up to 10x cheaper than alternatives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;150+ voices&lt;/strong&gt; across 35+ languages&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;99.38% pronunciation accuracy&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&lt;/h2&gt;
&lt;/div&gt;


  &lt;div class="js-render-enrichment-target"&gt;
    &lt;div class="render-plaintext-hidden"&gt;
      &lt;pre&gt;flowchart LR
    A[🎙️ User speaks] --&amp;gt;|audio| B[Deepgram STT]
    B --&amp;gt;|text| C[LLM]
    C --&amp;gt;|response text| D[Murf Falcon TTS]
    D --&amp;gt;|audio| E[LiveKit]
    E --&amp;gt;|stream| F[🔊 User hears]

    style A fill:#444441,stroke:#888780,color:#fff
    style B fill:#185FA5,stroke:#85B7EB,color:#fff
    style C fill:#534AB7,stroke:#AFA9EC,color:#fff
    style D fill:#0F6E56,stroke:#5DCAA5,color:#fff
    style E fill:#D85A30,stroke:#F0997B,color:#fff
    style F fill:#444441,stroke:#888780,color:#fff
&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;span class="js-render-enrichment-loader d-flex flex-justify-center flex-items-center width-full"&gt;
    &lt;span&gt;
      &lt;span class="sr-only"&gt;Loading&lt;/span&gt;
&lt;/span&gt;
  &lt;/span&gt;





&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quickstart&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Prerequisites&lt;/h3&gt;

&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt;

&lt;strong&gt;Python&lt;/strong&gt; 3.10+&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;&lt;a href="https://docs.astral.sh/uv/" rel="nofollow noopener noreferrer"&gt;uv&lt;/a&gt;&lt;/strong&gt; - fast Python package manager

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; macOS/Linux&lt;/span&gt;
curl -LsSf https://astral.sh/uv/install.sh &lt;span class="pl-k"&gt;|&lt;/span&gt; sh
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Windows (PowerShell)&lt;/span&gt;
powershell -ExecutionPolicy ByPass -c &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;irm https://astral.sh/uv/install.ps1 | iex&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; 18+&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pnpm&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/N-SAI-VENKATA-TEJA/murf-livekit-starter" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Built with:&lt;br&gt;
Murf Falcon · LiveKit Agents · Deepgram Nova-3 · Google Gemini · MongoDB · Next.js · Tailwind CSS · Twilio&lt;/p&gt;

&lt;p&gt;Challenge:&lt;br&gt;
10 Days of Voice Agents — VoiceForBharat Edition by Murf AI&lt;/p&gt;

</description>
      <category>murffalcon</category>
      <category>voiceforbharat</category>
      <category>learningandliteracy</category>
      <category>10daysofaivoiceagents</category>
    </item>
  </channel>
</rss>
