Sehat Sathi: Building a Voice Agent for Health Access in Bharat A developer built Sehat Sathi, a multilingual voice-first health access assistant for India, using Murf Falcon and LiveKit. The agent provides safe, honest guidance in Hindi and English, with guardrails against diagnosis, consent-based memory, and honest fallbacks for facility lookup. It was developed for the VoiceForBharat Edition challenge by Murf AI. A 10-day journey building a multilingual health-access voice assistant with Murf Falcon, LiveKit, and a lot of trial and error. Most voice AI is built for people who already have smartphones, fast data plans, and comfort with English. That leaves out a huge number of people in India - someone in a small town with a mild fever who does not know if it is serious, a family member trying to find the nearest government hospital, or a caller who just needs to know whether to rest at home or see a doctor today. That is the gap Sehat Sathi "Health Companion" tries to fill. It is a voice-first health access assistant for the Health Access track of the 10 Days of Voice Agents - VoiceForBharat Edition challenge, run by Murf AI. The idea is simple: you should be able to just talk to it, in Hindi, English, or a natural mix of both, and get safe, honest guidance - not a diagnosis, but a clear next step. Over ten days, Sehat Sathi grew from a simple talking demo into a system that can: The core pipeline is the same shape used across the whole challenge: Speech-to-Text - LLM - Text-to-Speech - Real-time transport An Indian voice, not a translated one. Early on, hardcoding the voice's locale caused Hindi words to come out with an English accent. The fix was to not hardcode the locale at all, and instead set the STT to multilingual mode and let the voice adapt per sentence - a small config change that made every conversation sound dramatically more natural. Guardrails with a spine. The agent will never diagnose a condition or name a specific medicine. If someone describes a red-flag symptom - chest pain, trouble breathing, heavy bleeding - it stops and tells them clearly to seek in-person or emergency care. Memory, with consent. Before saving anything about a caller, the agent explicitly asks permission. If they say no, nothing is saved. Returning callers are greeted by name and the conversation continues naturally. A real tool with an honest fallback. The facility-lookup tool speaks results naturally instead of reading raw data, and always tells the caller this is from a static reference list, not a live source. When a district is not in the list, it says so honestly and redirects to the local ASHA worker or India's emergency ambulance number - it never invents a hospital name. Human escalation, not silent failure. For red-flag symptoms or direct requests for a diagnosis, the agent explains exactly what it wants to send to a human, asks permission, and only then creates a short, privacy-safe summary - no raw transcripts, no private data - delivered to a real Discord channel with a reference ID the caller can hold onto. Outbound calls that introduce themselves properly. Since an outbound call is unexpected for the person receiving it, the opening states clearly, in the first two sentences, who is calling, why, and how to make it stop. A dashboard with real numbers. Total, successful, and failed calls are pulled live from the same database the agent writes to - nothing hardcoded, and no caller-identifying information is ever shown. A specialist for a narrower job. A clinic-and-appointment specialist agent, Meera, takes over only for booking-related questions, picking up the existing conversation without asking the caller to repeat themselves - and hands back cleanly if they mention a new symptom. The accent problem. As mentioned above, hardcoding locale="en-IN" in the TTS config made Hindi words sound foreign. Removing the hardcoded locale and switching STT to multilingual mode fixed it completely. Speech-to-text misheard names. An uncommon name was transcribed inconsistently across calls, which broke the memory lookup since it searched under a different, misheard name each time. This was not a bug in the code - it was a genuine STT accuracy limitation - so the fix was to test with clearer, more common names and add alternate spellings to lookup data where it mattered. A deprecated model silently broke outbound calls mid-conversation. The outbound agent used a Gemini model name that had been deprecated between the browser agent and the outbound agent being written - the greeting played fine, but every reply after that failed with a 404 from the API. The fix was simply matching the model name to the one already working in the main agent. Recording a phone call is harder than it sounds. The Linphone app deliberately blocks screen recording during calls, a privacy measure most VOIP apps share. The workaround was to put the call on speakerphone and record the phone with a laptop's built-in webcam instead. Mobile hotspots and WebSocket streaming do not mix well. TTS streaming needs a sustained connection; on an unstable hotspot, calls would time out a few messages in even though basic connectivity tests all passed. Understanding why sustained connections behave differently from quick pings made it clear this was not a code problem, just a network reality to work around. Public repository: https://github.com/subratgouda000/murf-livekit-starter https://github.com/subratgouda000/murf-livekit-starter Built as part of 10 Days of Voice Agents - VoiceForBharat Edition by Murf AI, powered by Murf Falcon. No API keys, phone numbers, or caller data are included in this post or in the linked repository.