Over the past 10 days, I took part in 10 Days of Voice Agents -VoiceForBharat Edition and built ResQ Voice, a voice assistant focused on disaster response.
The idea was simple: during an emergency, people shouldn't have to navigate complicated apps or type long messages. A voice interface can make it easier to ask for information, describe a situation, and get the right kind of help.
The Problem
During disasters, information can be difficult to access quickly.
Someone might need to:
Find an emergency shelter
Understand basic safety steps
Ask about shelter availability
Get help when they are trapped or injured
Be connected to a human when the AI cannot safely handle the situation
I wanted ResQ Voice to handle the first layer of these interactions while being very clear about its limitations.
Meet ResQ Voice
ResQ Voice is a Disaster Response Voice Assistant built around LiveKit.
Its main responsibilities are to:
1) Understand what the person needs.
2) Provide safe disaster-preparedness guidance.
3) Look up shelter information from available data.
4) Escalate situations that require human help.
5) Hand specialised requests to a specialist agent.
The voice pipeline uses Deepgram for speech-to-text, Gemini as the LLM, and Murf Falcon for text-to-speech, with LiveKit handling the real-time communication layer.
How the System Works
The architecture for the system is as follows:
The agent was designed for browser-based conversations and was also extended toward outbound calling during the challenge.
What I Built
I. Disaster-response personality and guardrails
I gave the agent a specific role instead of making it a general-purpose chatbot.
It is instructed not to:
- Give medical diagnoses
- Predict disasters
- Invent official alerts
- Claim an area is safe
- Pretend it has access to live emergency systems
It also adapts to the user's language, including English, Hindi and Hinglish.
This was important because in an emergency, a confident but incorrect answer can be worse than admitting that the system doesn't know something.
II. Shelter lookup
I added a shelter lookup tool that searches a local demonstration dataset. The agent only calls it after the user provides a location such as a town, district, locality or landmark.
It can return information such as:
- Shelter name
- Available capacity
- Last updated information
The agent is explicitly instructed not to invent a shelter when the data doesn't contain one.
III. Human escalation
One of the most important features I added was a human-help escalation system.
For example, if someone says:
"I'm trapped and injured."
The agent shouldn't continue trying to solve the entire situation itself.
Instead, it can collect a short summary containing:
- Who needs help
- What happened
- What the agent already checked
- Urgency
- Language
- Preferred follow-up method
Before creating the request, the agent asks the caller for permission to share those details.
The request receives a reference ID and is stored in a local human-help queue.
IV. Outbound calling
I also explored outbound calling using Twilio.
The idea for the Disaster Response track was an outbound welfare-check or district-alert scenario.
This introduced a different challenge compared with browser-based conversations because an outbound caller has to immediately explain:
- Who is calling?
- Why they are calling?
- How the person can stop the interaction?
V. Call analytics
I added call metrics using SQLite.
The system records whether a call was:
- Successful
- Failed
I then built a small Flask dashboard showing:
- Total Calls
- Successful Calls
- Failed Calls
The dashboard uses the database rather than hardcoded numbers.
VI. Specialist handoff
Another interesting part was separating responsibilities between agents.
The main ResQ agent doesn't need to know everything.
I created a specialist agent for shelter information and added a handoff mechanism.
The flow becomes:
User
↓
ResQ Voice
↓
"Let me connect you to our shelter specialist."
↓
Shelter Specialist
↓
Continues the conversation
The important part is that the user doesn't have to repeat their entire problem.
Some of the Challenges I Faced
Not everything worked perfectly on the first try.
One of the biggest problems I faced was my development environment. Some of the LiveKit dependencies, particularly around uv and platform compatibility on my Mac, made it difficult to run the complete backend locally.
I had to separate what I could actually run and test from what I could verify through the code and configuration.
I also ran into smaller issues while building the dashboard, including Python environments, Flask dependencies, imports and port conflicts. For example, installing Flask with uv didn't mean that running python3 directly would automatically use that environment. I had to run the application through: uv run python dashboard.py.
That was a small problem, but it was a good reminder that the environment is part of the application.
Building the Agent
The basic LiveKit agent session connects the different components:
Tools can then be exposed to the agent using LiveKit's function-tool mechanism.
For example, the shelter functionality is exposed as a tool:
This allows the LLM to decide when the tool is actually relevant instead of running it for every conversation.
Keeping API Keys Safe
API keys are stored in environment variables rather than directly in the source code.
For example: .env.local contains the required credentials. The file should never be committed to GitHub! A .gitignore entry should include .env.local
Anyone building a similar project should create their own API keys and environment file.
Testing the Agent
I tested the conversation paths that were available in my development environment and verified the remaining flows through the implementation and configuration.
A normal conversation should stay with the main agent.
For example:
"What should I keep in an emergency kit?"
But a specialist request should trigger the handoff:
"I need information about an emergency shelter near my area."
Similarly, a serious situation such as:
"I'm trapped and injured."
should trigger the human-help flow rather than normal advice.
This distinction was important because while the agent should not escalate everything, it also shouldn't try to handle situations beyond its role.
What I Learned
The biggest lesson from the challenge was that building a voice agent is much more than connecting an LLM to a microphone.
You also need to think about:
- What the agent is allowed to do
- What it should refuse
- When it should use tools
- When it should ask a human
- How information is stored
- How conversations are measured
- How multiple agents can work together
- What happens when the infrastructure doesn't cooperate
The more features I added, the more important the boundaries became!
What's Next?
If I continue developing ResQ Voice, I'd like to work on:
1) Live verified disaster information
2) Better location-aware services
3) More Indian languages
4) More robust telephony integration
5) A production-ready human support backend
6) Better monitoring and analytics
7) More extensive testing under real emergency scenarios
The current project is a prototype, not a replacement for emergency services. In a real emergency, users should still follow instructions from official local authorities and emergency responders!
My Final Thoughts
The 10 Days of Voice Agents - VoiceForBharat Edition gave me a chance to build something much more complete than a simple chatbot.
ResQ Voice started as a voice agent. By the end, it had a personality, guardrails, tools, memory, outbound-call capabilities, human escalation, analytics, and specialist handoffs. The most useful thing I learned wasn't how to make an AI talk. It was how to design an AI that knows what it can do, knows what it cannot do, and knows when to bring a human into the loop.
I'm grateful to have built this as part of 10 Days of Voice Agents and to experiment with Murf Falcon, LiveKit and the rest of the voice stack.
Links
GitHub
https://github.com/Kopal-404/murf-livekit-starter
Demo / videos
LinkedIn
www.linkedin.com/in/kopal-kumar
Special thanks to Murf AI for organising the challenge and for making the voice experience possible with Murf Falcon.
VoiceForBharat #VoiceAI #AI #LiveKit
Kopal Kumar





Top comments (0)