<?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: ASN Bharadwaj</title>
    <description>The latest articles on DEV Community by ASN Bharadwaj (@asnbharadwaj).</description>
    <link>https://dev.to/asnbharadwaj</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%2F4078025%2Ff6b63d28-d4d4-4910-b75d-a60f66e5ccf9.png</url>
      <title>DEV Community: ASN Bharadwaj</title>
      <link>https://dev.to/asnbharadwaj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/asnbharadwaj"/>
    <language>en</language>
    <item>
      <title>How I created "Beacon"</title>
      <dc:creator>ASN Bharadwaj</dc:creator>
      <pubDate>Sat, 15 Aug 2026 06:48:28 +0000</pubDate>
      <link>https://dev.to/asnbharadwaj/how-i-created-beacon-435i</link>
      <guid>https://dev.to/asnbharadwaj/how-i-created-beacon-435i</guid>
      <description>&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%2Fkvhmpuoy1lj0rxug3yy5.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%2Fkvhmpuoy1lj0rxug3yy5.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&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%2Fjrb82x2eac6udwg9txiu.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%2Fjrb82x2eac6udwg9txiu.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&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%2Fqi0dl6vcy3vkagthyrnd.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%2Fqi0dl6vcy3vkagthyrnd.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&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%2F97hac0fq0ewxn3yk8uu7.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%2F97hac0fq0ewxn3yk8uu7.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&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%2Fh5zsplr4b4l8iix2ikr3.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%2Fh5zsplr4b4l8iix2ikr3.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;# Building Beacon AI: A 10-Day Journey in Voice AI Engineering — LiveKit + Murf Falcon&lt;/p&gt;

&lt;p&gt;Over the past 10 days, I took part in the &lt;strong&gt;Voice for Bharat Challenge 2026&lt;/strong&gt;, where I built &lt;strong&gt;Beacon AI&lt;/strong&gt;, a multi-agent educational voice assistant powered by real-time voice AI.&lt;/p&gt;

&lt;p&gt;This journey gave me hands-on experience with &lt;strong&gt;speech pipelines, streaming audio, latency optimization, agentic workflows, and multi-agent routing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk through what I built, the architecture behind it, the major technical challenges I faced, and how I solved them.&lt;/p&gt;
&lt;h2&gt;
  
  
  🎙️ Introducing Beacon AI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Beacon AI&lt;/strong&gt; is an interactive voice tutor designed to make learning &lt;strong&gt;general knowledge, space trivia, language translation, and mental math&lt;/strong&gt; accessible through natural voice conversations.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why voice?
&lt;/h3&gt;

&lt;p&gt;Voice interfaces can remove a major barrier to interaction. For learners who struggle with typing or simply prefer conversational learning, a voice-based assistant can make education feel more natural and accessible.&lt;/p&gt;

&lt;p&gt;Beacon AI also supports &lt;strong&gt;code-mixed Hindi/English conversations&lt;/strong&gt;, helping bridge the gap between traditional text-based interfaces and real-world conversations.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚙️ Core Architecture
&lt;/h2&gt;

&lt;p&gt;Beacon AI runs as a real-time voice pipeline consisting of four major components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
  ↓
LiveKit WebRTC
  ↓
Deepgram STT
  ↓
Google Gemini
  ↓
Agent Tools / Specialist Agents
  ↓
Murf Falcon TTS
  ↓
User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Transport Layer — LiveKit
&lt;/h3&gt;

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

&lt;p&gt;It manages the streaming audio session and provides the infrastructure required for low-latency voice interactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Speech-to-Text — Deepgram
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Deepgram&lt;/strong&gt; converts the user's speech into text in real time.&lt;/p&gt;

&lt;p&gt;This transcription is then passed to the language model for reasoning and intent detection.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Language Model — Google Gemini
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Google Gemini&lt;/strong&gt; acts as the reasoning layer.&lt;/p&gt;

&lt;p&gt;It processes the transcription, determines what the user wants, calls tools when necessary, and generates the response.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Text-to-Speech — Murf Falcon
&lt;/h3&gt;

&lt;p&gt;Finally, &lt;strong&gt;Murf Falcon&lt;/strong&gt; converts the generated response back into natural-sounding speech.&lt;/p&gt;

&lt;p&gt;One of the biggest focuses of this project was keeping the voice interaction fast and responsive. Murf Falcon's extremely low latency makes it particularly useful for real-time conversational agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ What I Built Over 10 Days
&lt;/h2&gt;

&lt;p&gt;Beacon AI evolved from a basic voice assistant into a small &lt;strong&gt;agentic ecosystem&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Dynamic User Memory
&lt;/h3&gt;

&lt;p&gt;Beacon AI can look up users from a local database using their name.&lt;/p&gt;

&lt;p&gt;This allows the assistant to recognize returning users and remember things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Previously covered topics&lt;/li&gt;
&lt;li&gt;Past mistakes&lt;/li&gt;
&lt;li&gt;Learning progress&lt;/li&gt;
&lt;li&gt;Conversation context&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🤖 Specialist Micro-Agents
&lt;/h3&gt;

&lt;p&gt;Instead of forcing one agent to handle every type of question, Beacon AI uses specialist agents.&lt;/p&gt;

&lt;p&gt;The main agent can hand conversations over to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Beacon Maths&lt;/strong&gt; — arithmetic drills and mental math&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beacon Cosmos&lt;/strong&gt; — science, space, and gravity trivia&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beacon Bhasha&lt;/strong&gt; — grammar and language practice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps the individual agent prompts focused and makes the overall system easier to extend.&lt;/p&gt;

&lt;h3&gt;
  
  
  📰 Live News Integration
&lt;/h3&gt;

&lt;p&gt;Beacon AI can retrieve current headlines using RSS feeds from &lt;strong&gt;BBC News&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Users can ask for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;General news&lt;/li&gt;
&lt;li&gt;Science news&lt;/li&gt;
&lt;li&gt;Technology news&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent retrieves the relevant feed and presents the information conversationally.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧑‍🏫 Human Escalation
&lt;/h3&gt;

&lt;p&gt;Sometimes the best response from an AI system is knowing when to involve a human.&lt;/p&gt;

&lt;p&gt;If a user becomes frustrated or explicitly asks for a human tutor, Beacon AI creates an escalation ticket and sends a webhook notification to a dedicated Discord tutor channel.&lt;/p&gt;

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

&lt;p&gt;I also built a &lt;strong&gt;Next.js analytics dashboard&lt;/strong&gt; to monitor the voice agent.&lt;/p&gt;

&lt;p&gt;It tracks metrics such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Call duration&lt;/li&gt;
&lt;li&gt;User turns&lt;/li&gt;
&lt;li&gt;Call success rate&lt;/li&gt;
&lt;li&gt;Active escalation tickets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives a clearer picture of how the system behaves beyond the voice interaction itself.&lt;/p&gt;




&lt;h1&gt;
  
  
  🚧 The Hardest Technical Challenges
&lt;/h1&gt;

&lt;p&gt;Building a real-time voice agent isn't just about connecting an LLM to a TTS API.&lt;/p&gt;

&lt;p&gt;Timing, concurrency, streaming, and unpredictable LLM behavior can create some interesting problems.&lt;/p&gt;

&lt;p&gt;Two challenges stood out during development.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Handoff Transition Race Condition
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The problem
&lt;/h3&gt;

&lt;p&gt;Initially, when the main agent handed a conversation to a specialist, I used background tasks and arbitrary &lt;code&gt;asyncio.sleep()&lt;/code&gt; timers to trigger the specialist's response.&lt;/p&gt;

&lt;p&gt;That seemed to work during simple tests.&lt;/p&gt;

&lt;p&gt;But on slower networks, the main agent could still be draining its TTS stream when the transition task fired.&lt;/p&gt;

&lt;p&gt;This caused conflicts in the session and, in some cases, left the user with silence.&lt;/p&gt;

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

&lt;p&gt;Instead of trying to guess when the previous agent would finish, I moved the logic to &lt;strong&gt;LiveKit's native &lt;code&gt;on_enter()&lt;/code&gt; lifecycle hook&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The specialist now waits until it has actually taken control before generating its response:&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="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_enter&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Specialist entered. Triggering reply.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_reply&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;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;history&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This eliminated the timing race condition and made the handoff much more reliable.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. LLMs Skipping Tool Calls
&lt;/h1&gt;

&lt;p&gt;This was another interesting problem.&lt;/p&gt;

&lt;p&gt;Initially, I instructed the main agent to do something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I will connect you to our Cosmos specialist."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and then call the &lt;code&gt;handoff_to_cosmos&lt;/code&gt; tool.&lt;/p&gt;

&lt;p&gt;The problem was that smaller/faster models could sometimes generate the conversational sentence but &lt;strong&gt;skip the tool call&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That meant the user would be told they were being transferred, but the transfer wouldn't actually happen.&lt;/p&gt;

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

&lt;p&gt;I separated the conversational response from the tool invocation.&lt;/p&gt;

&lt;p&gt;Instead of asking the LLM to both speak and call the tool, I instructed it to immediately execute the handoff tool.&lt;/p&gt;

&lt;p&gt;The transition message itself is spoken inside the tool:&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;handoff_to_cosmos&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="n"&gt;Agent&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;context&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="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 will connect you to our Cosmos specialist.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;allow_interruptions&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;specialist&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separation made the routing significantly more reliable.&lt;/p&gt;

&lt;p&gt;The LLM handles &lt;strong&gt;decision-making&lt;/strong&gt;, while the tool handles the &lt;strong&gt;actual transition and announcement&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  🌐 Language &amp;amp; Script Handling
&lt;/h1&gt;

&lt;p&gt;Since Beacon AI supports multilingual and code-mixed conversations, I also added explicit language and script instructions to the system prompt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LANGUAGE &amp;amp; SCRIPT

Always write every language in its own native script.

Hindi → Devanagari (नमस्ते)
Never use romanized Hindi (never "namaste").

Follow the same rule for all non-English languages.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps prevent the model from responding with romanized versions of languages that should be rendered in their native scripts.&lt;/p&gt;




&lt;h1&gt;
  
  
  🚀 Running Beacon AI Locally
&lt;/h1&gt;

&lt;p&gt;If you want to experiment with the project yourself, 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;A LiveKit Cloud account&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Environment Variables
&lt;/h2&gt;

&lt;p&gt;Create a &lt;code&gt;.env.local&lt;/code&gt; file in both the backend and frontend where required:&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_key
LIVEKIT_API_SECRET=your_livekit_secret

MURF_API_KEY=your_murf_falcon_key
DEEPGRAM_API_KEY=your_deepgram_key
GOOGLE_API_KEY=your_gemini_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Start the Backend
&lt;/h2&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 dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Start the Frontend
&lt;/h2&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;pnpm dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;/div&gt;



&lt;p&gt;Click &lt;strong&gt;"Ignite Conversation"&lt;/strong&gt; and start talking to Beacon AI.&lt;/p&gt;




&lt;h1&gt;
  
  
  🏗️ What I Learned
&lt;/h1&gt;

&lt;p&gt;The biggest lesson from this challenge was that building a voice agent is very different from building a traditional chatbot.&lt;/p&gt;

&lt;p&gt;A good voice experience requires thinking about:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Latency → Streaming → Interruptions → State → Routing → Tool execution → TTS timing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even a small delay or incorrectly timed handoff can make a conversation feel broken.&lt;/p&gt;

&lt;p&gt;I also learned that &lt;strong&gt;multi-agent architectures aren't just about adding more agents&lt;/strong&gt;. The routing logic between them is just as important as the agents themselves.&lt;/p&gt;




&lt;h1&gt;
  
  
  🔗 Source Code
&lt;/h1&gt;

&lt;p&gt;The complete project, including the &lt;strong&gt;Next.js analytics dashboard&lt;/strong&gt; and &lt;strong&gt;multi-agent handoff implementation&lt;/strong&gt;, is open source:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;code&gt;asn-bharadwaj/beacon-ai-agent&lt;/code&gt;&lt;/p&gt;




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

&lt;p&gt;Building Beacon AI over these 10 days has been an incredible introduction to &lt;strong&gt;real-time voice AI engineering&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;From basic speech pipelines to specialist-agent handoffs, memory, live news, human escalation, and analytics, the project grew into something much more advanced than what I initially planned.&lt;/p&gt;

&lt;p&gt;A huge part of the experience was learning how seemingly small engineering decisions — especially around &lt;strong&gt;latency, concurrency, and agent handoffs&lt;/strong&gt; — can have a huge impact on the user experience.&lt;/p&gt;

&lt;p&gt;And most importantly, I got to build a voice agent using &lt;strong&gt;Murf Falcon, one of the fastest TTS APIs&lt;/strong&gt;, while exploring what is possible with modern real-time AI systems.&lt;/p&gt;

&lt;p&gt;Thanks to the &lt;strong&gt;Voice for Bharat Challenge 2026&lt;/strong&gt; for the opportunity to build, experiment, break things, and learn along the way. 🚀&lt;/p&gt;

&lt;p&gt;If you're building with &lt;strong&gt;LiveKit, Murf Falcon, Gemini, or multi-agent voice systems&lt;/strong&gt;, I'd love to hear what you're working on!&lt;/p&gt;

&lt;h1&gt;
  
  
  Official Resources
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Murf Falcon 2 Documentation:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://murf.ai/api/docs/text-to-speech-models/falcon-2" rel="noopener noreferrer"&gt;https://murf.ai/api/docs/text-to-speech-models/falcon-2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Murf LiveKit Starter Template:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/murf-ai/murf-livekit-starter" rel="noopener noreferrer"&gt;https://github.com/murf-ai/murf-livekit-starter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LiveKit Voice AI Quickstart:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://docs.livekit.io/agents/start/voice-ai/" rel="noopener noreferrer"&gt;https://docs.livekit.io/agents/start/voice-ai/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 10 Challenge Task:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/murf-ai/voice-for-bharat-challenge-2026/blob/main/challenges/Day%2010%20Task.md" rel="noopener noreferrer"&gt;https://github.com/murf-ai/voice-for-bharat-challenge-2026/blob/main/challenges/Day%2010%20Task.md&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Tags
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;#AI&lt;/code&gt; &lt;code&gt;#VoiceAI&lt;/code&gt; &lt;code&gt;#GenerativeAI&lt;/code&gt; &lt;code&gt;#Murf&lt;/code&gt; &lt;code&gt;#LiveKit&lt;/code&gt; &lt;code&gt;#Python&lt;/code&gt; &lt;code&gt;#Gemini&lt;/code&gt; &lt;code&gt;#Deepgram&lt;/code&gt; &lt;code&gt;#MultiAgentAI&lt;/code&gt; &lt;code&gt;#BuildInPublic&lt;/code&gt;&lt;/p&gt;

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