Cost and quality guide
This chapter helps you choose a set-up for the voice agent you want: the lowest cost, a balance of cost and speed, the most human-sounding voice, or realtime speech-to-speech. For each level it shows what to configure and roughly what a minute of conversation costs. It then lists the settings that save money and the ones that make the agent sound natural.
The figures are estimates from provider list prices, not quotes. Your own contract prices, the length of your calls and how much your bot talks change them. Each call's real figures are in the call.ended webhook and the billing record (Webhooks and billing).
What a production gateway really spent
One production gateway, 2026-10-03 to 2026-10-24: 8,844 calls, 17,506 minutes. It ran Sarvam streaming recognition, Google Chirp3-HD voices with the speech cache on, and a LiteBot brain on Gemini 2.5 Flash.
| Part | ₹ per minute of call |
|---|---|
Speech recognition (sarvam) |
0.19 |
Speech synthesis (google Chirp3-HD) |
0.45 |
| AI brain (LiteBot, real token use) | 0.65 |
| Total | 1.29 |
What those calls looked like:
- The median call lasted 87 seconds and cost ₹1.72.
- The bot spoke about 470 characters per minute of call. Two thirds of them came from the speech cache, at no cost.
- Recognition was billed for about 22 seconds per minute of call, the time the gateway was listening while the bot was silent.
- The brain was half the bill. Without the cache, synthesis would have been ₹1.41 per minute instead of ₹0.45.
How the estimates are made
The tables below use the production figures as the typical call. Change them to match your calls.
| Assumption | Value |
|---|---|
| Exchange rate | COST_USD_INR=100 (set the same in .env; the built-in default is 87) |
| Prices | The gateway's rate table as of 2026-10-24, provider pay-as-you-go list prices |
| Bot speech | About 470 characters per minute of call |
| Speech cache | Two thirds of those characters cached, as in production. The "no cache" column assumes none |
| Recognition | About 22 seconds billed per minute of call |
| AI brain (LiteBot) | ₹0.65 per minute, the production figure on Gemini 2.5 Flash. When LiteBot reports no usage for a call, the gateway records a flat estimate of ₹3.51 for that call instead |
| Not included | Your licence, server, telephony (trunk or carrier minutes) and your own brain endpoint's model costs |
Prices that will change:
- Sarvam bulbul:v4-flash at ₹1 per 1,000 characters is a launch offer, reported to end 2026-11-12. Sarvam's public list price is ₹2.00.
- Gemini 3.8 TTS rates are introductory and double on 2027-01-01.
- ElevenLabs prices depend on your plan.
Put your real rates in config/pricing.json so the billing records match your invoices; see Cost tracking.
Price list per minute
What each part adds to one minute of call, under the assumptions above.
| Speech recognition | Mode | ₹ per minute of call |
|---|---|---|
vexyl-stt (self-hosted) |
Streaming | 0 (your server) |
groq |
Batch | 0.07 |
deepgram |
Batch | 0.16 |
sarvam |
Streaming | 0.19 |
openai |
Batch | 0.22 |
google |
Streaming | 0.59 |
| Speech synthesis | ₹ per 1,000 characters | ₹ per minute, no cache | ₹ per minute, two thirds cached |
|---|---|---|---|
vexyl (self-hosted) |
0 | 0 (your server) | 0 |
openrouter, Kokoro |
0.06 | 0.03 | 0.01 |
gemini, 3.8 Flash-Lite |
0.93 | 0.44 | 0.15 |
sarvam, bulbul:v4-flash |
1.00 (2.00 list) | 0.47 (0.94 list) | 0.16 (0.32 list) |
openrouter, Voxtral |
1.30 | 0.61 | 0.21 |
deepgram, Aura |
1.35 | 0.63 | 0.22 |
gemini, 3.8 Flash |
1.40 | 0.66 | 0.22 |
azure, Neural |
1.50 | 0.71 | 0.24 |
smallest, Lightning |
1.75 | 0.82 | 0.28 |
sarvam, bulbul:v3 |
3.00 | 1.41 | 0.48 |
google, Chirp3-HD |
3.00 | 1.41 | 0.48 |
murf |
3.00 | 1.41 | 0.48 |
elevenlabs, Flash |
11.00 | 5.17 | 1.76 |
How much the cache saves depends on your bot. Greetings, menus and fixed phrases repeat on every call; answers built from a caller's details never do.
Choosing a level
Per-minute figures include the ₹0.65 brain. The first figure assumes no cache, the second two thirds cached.
| Level | Recognition | Synthesis | Brain | ₹ per minute | 10,000 minutes a month |
|---|---|---|---|---|---|
| Lowest cost | groq |
gemini 3.8 Flash-Lite, or sarvam v4-flash |
LiteBot, or your endpoint on a small model | 1.16, cached 0.87 | ₹8,700 to ₹11,600 |
| Balanced (recommended for Indian languages) | sarvam |
sarvam v4-flash |
LiteBot | 1.31, cached 1.00 (list price 1.78, cached 1.16) | ₹10,000 to ₹17,800 |
| Premium voice | sarvam |
google Chirp3-HD, gemini 3.8 Flash, or elevenlabs |
LiteBot | 1.50 to 6.01, cached 1.06 to 2.60 | ₹10,600 to ₹60,100 |
| Realtime speech-to-speech | inside the model | inside the model | Gemini Live or LiteBot Live | about 2.3 and up, rising with call length; no cache | ₹23,000 and up |
| Self-hosted speech | vexyl-stt |
vexyl |
LiteBot | 0.65 plus your servers | ₹6,500 plus servers |
The realtime figure is an estimate from Google's list prices for audio tokens, not a production measurement. Check it against the billing records of your first calls.
Lowest cost
STT_PROVIDER=groq
TTS_PROVIDER=gemini
GEMINI_TTS_MODEL=gemini-3.8-flash-lite-tts
TTS_CACHE_ENABLED=true
Batch recognition waits for the caller to finish and then sends the whole utterance, which adds a noticeable pause to every turn. Choose it for reminders, surveys and notifications where the caller says little. For conversations, the balanced level costs only a few paise more per minute and answers much faster.
Balanced
STT_PROVIDER=sarvam
TTS_PROVIDER=sarvam
SARVAM_TTS_MODEL=bulbul:v4-flash
SARVAM_TTS_STREAM_TRANSPORT=http
SARVAM_TTS_SPEAKER=shilpa_hi_narration
LLM_PROVIDER=litebot
TTS_CACHE_ENABLED=true
Streaming recognition and synthesis for Indian languages. First audio from bulbul:v4-flash over the http transport measured 200 to 277 ms (2026-10-17). A production bot on this set-up answered simple turns in about 1.0 s (2026-10-22). Use the http transport with v4-flash: over WebSocket it cuts sentence endings.
Premium voice
Pick the voice by what matters most:
| Choice | Strength | First audio |
|---|---|---|
google Chirp3-HD |
Natural, streams, all 22 languages except Odia | Starts while the sentence is still being made |
gemini 3.8 Flash |
Very natural delivery; designed or cloned voices | About 0.86 s streamed on Vertex AI (2026-10-21) |
elevenlabs Flash |
Most expressive; voice cloning | About 440 ms on a warm connection; Malayalam and other languages Flash cannot speak go to the slower v3 model |
smallest |
Natural Indian voices, native phone quality | About 445 ms |
Keep sarvam for recognition of Indian languages. Premium voices are where most of the extra money goes: ElevenLabs costs about eleven times Sarvam v4-flash per minute, and Chirp3-HD three times. The production gateway above ran Chirp3-HD and spent ₹1.29 per minute because the cache carried most of the speech.
Realtime speech-to-speech
REALTIME_PROVIDER=litebot
LITEBOT_LIVE_URL=wss://<litebot-host>:<port>
One model hears and speaks, so turn-taking and interruptions feel the most natural. You choose a voice from the model's own set rather than any TTS provider, and you pay by the model's audio tokens. A realtime model re-reads the conversation on every turn, so cost per minute rises as a call gets longer; keep realtime for conversations where naturalness is worth more than a fixed price. Gemini Live is billed by Google token prices; LiteBot Live is billed by LiteBot and reported in the billing record. See Realtime mode.
You can mix levels on one gateway: realtime or premium for a sales line, balanced for support, lowest cost for reminders. Set them per number or per call with the keys in Per-call settings reference.
Saving money
- Turn the speech cache on.
TTS_CACHE_ENABLED=true(off by default). Greetings, menus and fixed phrases are then made once and replayed free. On the production gateway above, the cache served two thirds of everything the bot said and cut synthesis from ₹1.41 to ₹0.45 per minute. Pre-make your common phrases withPOST /cache/warmupand check the hit rate withGET /cache/stats(TTS cache). - Keep bot replies short. Synthesis is paid per character, and the brain per token: the brain was half of the production bill. Ask the bot's prompt for one or two short sentences per turn. It cuts both bills and sounds more like a person on the phone.
- Pick the cheaper model of the same voice. bulbul:v4-flash costs a third of bulbul:v3 at the launch price, and two thirds at list price.
- Match the recogniser to the call. Recognition is the smallest part of the bill, about 15% in production. Choose it for accuracy and speed first; batch recognisers save a few paise per minute but add a pause to every turn.
- Set the language correctly. A wrong
language_codegives poor recognition, which leads to repeats and longer, costlier calls. - End calls cleanly. Give the bot a hang-up tool and a closing line, so calls do not run on in silence (Conversation behaviour).
- Keep long tool chains out of a turn. Each extra brain round-trip adds cost and delay. Shape tools so one call answers the question.
- Use per-call choices. Premium voices only on the lines that need them.
- Watch the real figures. Read the cost block of
call.endedor the billing records weekly, and keepconfig/pricing.jsonin line with your invoices.
Sounding human
Most of what makes an agent feel human is speed and turn-taking, then the voice.
| What callers notice | What to set |
|---|---|
| Long pauses before the bot speaks | Streaming recognition (sarvam, google), streaming synthesis, LiteBot streaming on (LITEBOT_STREAMING), and a fast brain model. The brain is usually most of the wait: on one production gateway it was about 90% of a 1.8 s median response (2026-10-23) |
| Silence while the bot thinks | A short filler sound (PROCESSING_SOUND_ENABLED=true), cut as soon as the reply is ready (Conversation behaviour) |
| The bot talks over the caller, or cannot be interrupted | ENABLE_BARGE_IN=true with the echo guard on, so the caller can interrupt but the bot's own echo cannot (Interrupting the bot) |
| Short replies such as "yes" are missed | Keep the held-transcript and short-reply settings at their defaults (Short replies and quiet handsets) |
| Robotic voice | A conversational voice in the call's language: a _conversational Sarvam persona, a Chirp3-HD voice, or Gemini 3.8 |
| Choppy or broken audio | Usually the network. On a lossy line, put an Asterisk in front with Opus and FEC (SIP trunk) |
| Long, written-style answers | Prompt the bot to talk like a person on the phone: short sentences, one question at a time, numbers said the way people say them |
| Caller has to repeat details | Post caller details before the call (caller_name, llm_context) so the bot can greet by name and skip known questions |
Checking what a call really cost
call.endedcarries a cost breakdown per stage: recognition, synthesis (billed, cached and spoken characters), brain and total.- Billing records carry the same per call, with the unit rates used, and are retried until your receiver accepts them.
GET /cache/statsshows how much synthesis the cache saved since the gateway started.
See Webhooks and billing.