VEXYL AI

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

  1. 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 with POST /cache/warmup and check the hit rate with GET /cache/stats (TTS cache).
  2. 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.
  3. 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.
  4. 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.
  5. Set the language correctly. A wrong language_code gives poor recognition, which leads to repeats and longer, costlier calls.
  6. End calls cleanly. Give the bot a hang-up tool and a closing line, so calls do not run on in silence (Conversation behaviour).
  7. 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.
  8. Use per-call choices. Premium voices only on the lines that need them.
  9. Watch the real figures. Read the cost block of call.ended or the billing records weekly, and keep config/pricing.json in 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.ended carries 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/stats shows how much synthesis the cache saved since the gateway started.

See Webhooks and billing.