A Hindi and Malayalam phone agent on Wixzel Voice's sarvam engine
You will have two phone agents on Wixzel Voice, one speaking Hindi and one Malayalam, both on the sarvam engine: Sarvam's Saaras speech recognition, the Sarvam-105B language model and the Bulbul voice as one pipeline. With a SIP trunk already connected it takes about 20 minutes, in cURL. The sarvam engine costs $0.0623 per connected minute, about $0.19 for a three-minute call, billed per second from a prepaid balance, plus your carrier's rate for the line.
By Aqeel Shamsudheen · Published · Updated
- Takes
- About 20 minutes once a trunk is connected
- Engine
- sarvam
- Engine time
- $0.0623 per connected minute
What do you need before you start?
- A Wixzel Voice API key with credit, exported as
WIXZEL_API_KEY. - A SIP trunk with a number on it. For Indian numbers, a carrier such as Exotel or Vobiz, with KYC and any DLT registration finished: an account that has not finished them can hold a balance and still have every outbound call cleared.
- curl, jq and uuidgen.
How do you build this on Wixzel Voice, step by step?
01Check the languages and voices the engine serves
Ask the API rather than hardcoding either list:
shellcurl https://api.voice.wixzel.com/v1/engines/sarvam/languages \ -H "Authorization: Bearer $WIXZEL_API_KEY" curl https://api.voice.wixzel.com/v1/engines/sarvam/voices \ -H "Authorization: Bearer $WIXZEL_API_KEY"The languages endpoint returns 11 codes today:
en-IN,hi-IN,bn-IN,gu-IN,kn-IN,ml-IN,mr-IN,od-IN,pa-IN,ta-IN,te-IN. Hindi ishi-INand Malayalam isml-IN. The voices are Bulbul v3 speaker names, such aspriya,kavyaandshubh; Sarvam publishes the names and nothing else, so audition a voice before you choose it.02Create the Hindi agent
Three settings carry the language.
voice.stt.languagepins recognition and speech to Hindi; the agent'slanguagetells the model to reply in it; and the prompt and opening line are written the way the agent should sound. All three stages are Sarvam models, because the speech-to-text provider selects the pipeline and the other two must come from the same family.shellcurl https://api.voice.wixzel.com/v1/agents \ -H "Authorization: Bearer $WIXZEL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Hindi reception", "language": "hi-IN", "system_prompt": "You answer the phone for Sharma Dental Clinic, in Hindi. Speak the everyday Hindi callers use, English words included. Keep replies to one or two short sentences.", "opening_message": "नमस्ते, शर्मा डेंटल क्लिनिक में आपका स्वागत है। बताइए, मैं आपकी क्या मदद करूँ?", "voice": { "stt": { "model": "sarvam/saaras-v3-realtime", "language": "hi-IN" }, "llm": { "model": "sarvam/sarvam-105b" }, "tts": { "model": "sarvam/bulbul-v3", "voice": "priya" } } }'Keep the
idfrom the response asHINDI_AGENT_ID. A language or voice the engine does not serve is refused when the agent is created, with the valid ones listed in the error.03Create the Malayalam agent
The same shape, with
ml-INin both places and a Malayalam opening line:shellcurl https://api.voice.wixzel.com/v1/agents \ -H "Authorization: Bearer $WIXZEL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Malayalam reception", "language": "ml-IN", "system_prompt": "You answer the phone for a dental clinic in Kochi, in Malayalam. Speak the everyday Malayalam callers use, English words included. Keep replies to one or two short sentences.", "opening_message": "നമസ്കാരം, കൊച്ചി ഡെന്റൽ ക്ലിനിക്കിലേക്ക് സ്വാഗതം. ഞാൻ എങ്ങനെ സഹായിക്കാം?", "voice": { "stt": { "model": "sarvam/saaras-v3-realtime", "language": "ml-IN" }, "llm": { "model": "sarvam/sarvam-105b" }, "tts": { "model": "sarvam/bulbul-v3", "voice": "kavya" } } }'Keep this
idasMALAYALAM_AGENT_ID. One agent speaks one language: the sarvam engine has no automatic detection mode, so serving both groups of callers means one number per language on the way in, and choosing the agent per call on the way out.04Route calls in, or place one out
Give a number the Hindi agent for inbound calls, or ring someone with the Malayalam one:
shell# Inbound: calls to this number reach the Hindi agent jq -n --arg agent "$HINDI_AGENT_ID" '{inbound_agent_id: $agent}' | curl -X PATCH https://api.voice.wixzel.com/v1/phone-numbers/$NUMBER_ID \ -H "Authorization: Bearer $WIXZEL_API_KEY" \ -H "Content-Type: application/json" \ -d @- # Outbound: the Malayalam agent rings $TO (E.164, for example +91 and ten digits) jq -n --arg to "$TO" --arg agent "$MALAYALAM_AGENT_ID" --arg from "$NUMBER_ID" \ '{to: $to, agent_id: $agent, from_number_id: $from}' | curl https://api.voice.wixzel.com/v1/calls \ -H "Authorization: Bearer $WIXZEL_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d @-Idempotency-Keyis required onPOST /v1/calls: a retry with the same key returns the original call instead of dialling twice.05Test with the way your callers really talk
Most callers mix English into Hindi or Malayalam: dates, numbers, brand names, words like "appointment" and "cancel". Sarvam's models cope with code-mixed speech such as Hinglish, within what the models handle, so write the prompt to allow it rather than forbid it.
What the agent cannot do is follow a caller who switches wholly to another Indian language, because recognition is pinned to
voice.stt.languagewhen the call starts. Place a few calls with real phrasing before you route live traffic, and read what was heard in the transcript fromGET /v1/calls/{id}.
What does this build cost on Wixzel Voice?
Engine time for 3-minute calls on the sarvam engine at $0.0623 per connected minute: about $0.19 per call. Telephony is your own trunk at your carrier’s rate and is not included.
| Calls per month | Connected minutes | Engine cost per month |
|---|---|---|
| 500 | 1,500 | $93.45 |
| 2,500 | 7,500 | $467 |
| 10,000 | 30,000 | $1,869 |
The sarvam engine is $0.0623 per connected minute including the orchestration fee; the classic engine, for comparison, is $0.0867, so a Hindi or Malayalam minute on Sarvam costs less than an English one on classic. Each stage is metered in its own unit while the call is live, so a quiet call costs less than the estimate and a talkative one more. Your carrier bills the line separately.
Prepaid, with no subscription and no free tier: add credit from $5 and usage spends it. Estimate your own mix.
Which Wixzel Voice limits apply to this build?
- One language per agent. The sarvam engine has no automatic language detection, so a caller who switches wholly to another language is not followed.
- Sarvam processes speech and text in India during the call. The call log, the transcript and any recording are stored on servers in Finland.
- Bulbul voices come as names only, with no gender or accent descriptions. Auditioning one means a test call, which rings a real phone and spends credit.
- Indian carriers gate outbound calling behind KYC and often DLT registration. A call your carrier clears for that reason fails at the carrier, and nothing on the platform side can fix it.
- Five calls can be live at once per account by default, raised on request.
Frequently asked questions
- How do I build a Hindi phone agent on Wixzel Voice?
- Create an agent on the sarvam engine with
voice.stt.languageand the agent'slanguageset tohi-IN, a Hindi opening line and a Bulbul voice, then give a number itsinbound_agent_idor place a call withPOST /v1/calls. It holds phone calls in Hindi over your SIP trunk, or sessions in your web and mobile apps over a WebSocket, at $0.0623 per connected minute. - Can an AI phone agent speak Malayalam?
- Yes. Set
voice.stt.languageand the agent'slanguagetoml-INon a sarvam agent, write the opening line in Malayalam, and pick a Bulbul voice. Recognition, the language model and the voice all run on Sarvam's models, which are built for Indian languages. - Can one agent speak both Hindi and Malayalam?
- No. The recognition language is fixed per agent when the call starts, and the sarvam engine has no detection mode. Create one agent per language and route each number, or each outbound call, to the right one.
- Does a sarvam agent on Wixzel Voice understand Hinglish?
- Within what Sarvam's models handle, yes: they cope with code-mixed speech, such as English words inside Hindi sentences. Test with real callers' phrasing before going live, and read the transcripts to see what was heard.
- Is Indian call data kept in India?
- Sarvam processes speech and text in India for the duration of the call. The call log, transcript and any recording are stored in Finland. The Privacy Policy and DPA list every processor and location.
Where to read more
- Voice enginesdocs
The two voice shapes, the voice rosters and the language endpoints.
- Compose a voice enginedocs
Families, model ids and how a composed minute is priced.
- SIP trunksdocs
Exotel and Vobiz setup, and the KYC and DLT checks.
- Agentsdocs
Every agent field and where its valid values come from.
About Wixzel Voice
Wixzel Voice is a voice AI API for building AI agents that place and answer real phone calls over your own SIP trunk, or talk to people in your web and mobile apps. One API key and one prepaid balance cover every voice engine, billed per second of actual usage.
More guides
Claude, in Claude Code or claude.ai, placing a real call over your SIP trunk and reading back the transcript, with a confirmation before anything dials.
Your existing Twilio number answered by an AI receptionist that books appointments into the API, built in Node.js.
A Flutter app where users talk to your voice agent over a WebSocket, with the API key kept on your server and no phone number involved.
A Gemini Live agent ringing a real phone over your SIP trunk from four cURL requests, and the call record with its transcript and cost.
A list of leads called by your agent over your SIP trunk, in batches sized to your concurrency limit, with every call's status and transcript read back.
