The Passive Voice Agent Problem
Every voice AI demo follows the same pattern: open a browser, click a button, talk to the agent. The agent waits. You initiate. If you don't call, nothing happens.
That's fine for customer support widgets. It's useless for a farmer standing in a field at 6 AM, wondering if today is the day to spray his cotton crop.
Agriculture is time-sensitive. A weather alert at noon is worthless if the spraying window was morning. The agent needs to call the farmer, not wait for them to find a URL, open a browser, and figure out microphone permissions.
So on Day 9, we built the outbound calling feature. Kisan Sahayak now places proactive phone calls to registered farmers with weather alerts and crop advisories. But I'm getting ahead of myself.
What Kisan Sahayak Actually Is
Kisan Sahayak (किसान सहायक) is a voice AI helpline for Indian farmers. It speaks Hindi, understands code-mixed speech (Hindi + English + regional dialects), and handles the full spectrum of farm advisory:
- Crop selection and sowing windows — kharif, rabi, zaid cycles for the farmer's region
- Live weather forecasts — district-level, fetched mid-conversation via Open-Meteo
- Caller memory — remembers returning farmers by name, crops, and district
- Crop problem specialist — a separate agent with a different voice for pest/disease diagnosis
- Human escalation — creates structured help requests when the AI can't help
- Outbound phone calls — proactive weather alerts via SIP trunks
- Call analytics — success rates, latency, escalation tracking
The Stack, Honest Edition
| Layer | Tool | Why |
|---|---|---|
| TTS | Murf Falcon | 55ms latency, Indian voices that sound like a neighbor, not a robot |
| STT | Deepgram Nova-3 | Multi-language mode handles Hindi-English code-switching |
| LLM | Gemini 3.5 Flash | Fast enough for real-time, smart enough for farm advisory |
| Transport | LiveKit | WebRTC for browsers, SIP for phone calls, rooms for agent handoffs |
| VAD | Silero + Multilingual Turn Detector | Detects when the farmer stops speaking, even mid-sentence |
| Memory | SQLite | One table per caller. Minimal. Private. Farmer-controlled. |
| Frontend | Next.js + LiveKit Agents UI | Five queue variants, analytics dashboard, escalation page |
The pipeline is simple to draw and hard to make work:
Farmer speaks (Hindi)
↓
Deepgram Nova-3 (multi-language STT)
↓
Gemini 3.5 Flash (with 2000-word system prompt)
↓
Murf Falcon TTS (Aman voice, 55ms latency)
↓
LiveKit streams audio back to farmer
Four components. Each one a potential point of failure. Each one required tuning that no tutorial tells you about.
The 10-Day Build Log
Here's what happened each day, documented in real-time on LinkedIn:
The Three Things Nobody Tells You
1. The Prompt Is the Product
We spent more time on the system prompt than on any other piece of code. The prompt is 2000+ words. It defines the agent's identity, knowledge boundaries, tool usage rules, language behavior, and safety guardrails.
Here's a fragment:
GUARDRAILS:
Hard refusals. Never do any of the following:
- Never quote a current market/mandi price as a fact.
If asked for bhava say only: "Batch price roz badalta hai,
yahan se main vishwas ke saath nahi bata sakta."
- Never give a pesticide dosage in grams/millilitres per litre.
Say: "Sahi quantity ke liye packet ke label par dekh lijiye."
- Never name a drug, prescribe medicine, or diagnose illness.
- Never confirm an order, a government payout, a loan,
or an insurance claim.
Every guardrail was added after the agent broke it in testing. The prompt is a living document — it captures every failure mode we discovered.
2. Agent Handoff Is the Hardest Problem
When a farmer reports a pest problem, the main agent hands off to a crop specialist. The specialist has a different voice (Sunaina instead of Aman), a different personality, and a focused prompt.
The farmer should not notice the handoff except for the voice change. They should not repeat their name, district, or what they already said.
@function_tool
async def transfer_to_crop_specialist(self, ctx: RunContext):
specialist = CropProblemSpecialist(
chat_ctx=self.chat_ctx.copy(exclude_instructions=True)
)
return specialist, "I will connect you to our crop specialist."
copy(exclude_instructions=True) is the key line. The conversation history transfers. The specialist picks up mid-conversation. The farmer's experience is seamless.
3. Outbound Calling Changes the Product Category
A voice agent that waits for calls is a tool. A voice agent that calls farmers with weather alerts is a service.
The outbound agent uses LiveKit SIP with a Linphone trunk. Every call follows a strict opening:
1. Greet by name (if known from memory)
2. Say WHO you are and WHY you're calling
3. State the reason: weather alert, pest advisory
4. Tell them how to stop: "calls band karo" keh dijiye
5. Deliver the advisory or ask if they want it now
The opt-out is non-negotiable. Every call includes it. If a farmer says "calls band karo," the agent confirms and ends. No follow-up. No "are you sure?" The farmer's choice is final.
The Numbers
How to Build Your Own
Prerequisites
Setup
git clone https://github.com/murf-ai/murf-livekit-starter.git
cd murf-livekit-starter
# Backend
cd backend
cp .env.example .env.local
uv sync
uv run python src/agent.py download-files
uv run python src/agent.py dev
# Frontend
cd frontend
cp .env.example .env.local
pnpm install
pnpm dev
Open http://localhost:3000. Click "Start talking." The agent responds in Hindi with Murf Falcon.
API Keys
Copy .env.example to .env.local in both backend/ and frontend/. Fill in your keys. Never commit .env.local — the .gitignore already excludes it.
Change What It Does
Edit the SYSTEM_PROMPT in backend/src/agent.py. Change the prompt, change the agent. Customer support, language tutor, receptionist — same pipeline, different instructions.
Change the Voice
Edit the murf.TTS(voice="...") call. Browse voices at Murf Voice Library. For Indian English: Aman (male), Sunaina (female), Pooja (female), Samar (male).
What We'd Improve Next
- Real-time translation — Hindi farmer talks to English-speaking agriculture expert, agent translates both ways
- Voice biometrics — identify callers without asking for names, just voice
- Multi-turn crop diagnosis — ask follow-up questions about leaf patterns, soil conditions, spread rate
- PM-KISAN integration — help farmers check scheme eligibility during the call
- WhatsApp follow-up — send weather summary and advisory text after the call ends
The Repo
github.com/murf-ai/murf-livekit-starter
The starter template works out of the box. Clone, configure, run. The same pipeline powers Kisan Sahayak and can power your agent in an afternoon.
Acknowledgments
Built during 10 Days of Voice Agents — VoiceForBharat Edition by Murf AI.
The challenge wasn't just about building a voice agent. It was about building one that works for the person who needs it most — a farmer who's never heard of AI, doesn't care about technology, and just wants help with their crops.
55ms latency. Hindi that sounds natural. Outbound calls that respect the farmer's time. That's Kisan Sahayak.
#VoiceForBharat