Get started
The interactive UI guides you through the full evaluation process:
- Language selection — pick from 10+ supported Indic languages
- Provider selection — choose providers (only those supporting your language are shown)
- Input CSV — path to CSV file with
idandtextcolumns
Refer to this sample for a template.
- Output directory — where results will be saved (defaults to
./out) - API keys — enter the API keys for the selected providers
Evaluator configuration
By default, an audio LLM judge — routed through OpenRouter (setOPENROUTER_API_KEY in your environment) — evaluates whether the reference text is pronounced correctly in the synthesized audio using the built-in pronunciation evaluator; expand Default evaluator: pronunciation below for the exact system_prompt from the codebase. You can customize the judge model and add multiple evaluators by passing an optional config file with --config:
system_prompt is sent as the system message to its own dedicated audio LLM judge call (one call per evaluator, run in parallel). The user message contains the reference text and the audio sample.
The config file supports:
Each evaluator also accepts:
Binary evaluators produce per-row pass/fail and a mean pass-rate. Rating evaluators produce an integer score on your scale and a mean score in the leaderboard.
When multiple evaluators are defined, each is scored independently — one audio LLM call per evaluator per row, all run in parallel — and appears as a separate column in the results and leaderboard.
Refer to the sample config for a template.
The
--config flag is optional. When omitted, a single built-in
pronunciation evaluator scores audio intelligibility. The TTS judge requires
an audio-capable model.pronunciation (default evaluator system prompt)
pronunciation (default evaluator system prompt)
Matches
DEFAULT_TTS_EVALUATOR in calibrate/judges.py when no --config is passed.Output
Once all the providers have completed, it displays a leaderboard measuring key metrics along with bar charts for better visualization. Each provider output directory includes:results.csvwith one row per input text (id,text,audio_path,ttfb, evaluator scores, and evaluator reasoning).metrics.jsonwith evaluator summaries,ttfbpercentiles, and acostobject. Each provider is priced in its native billing unit — no unit conversion. Character-billed providers (most) reportbilling_unit: "character",total_characters, and the per-million-character rate (cost_per_million_chars_currency); audio-billed providers (OpenAI, Gemini) reportbilling_unit: "minute",total_seconds,audio_minutes, and the per-minute rate (cost_per_minute_currency), with the audio duration measured from the synthesized output. The rate is denominated incurrency. Providers billed in a non-USD currency (e.g. Sarvam in INR) report the native-currency totalcost_in_currencyand, when the live exchange rate is reachable, theconversion_rateused (native-currency units per 1 USD) andcost_usd. If the exchange rate can’t be fetched, the native-currency cost is still reported andcost_usdis omitted, so that provider is left out of the USD comparison rather than failing the run.cost_usdis the metric comparable across all providers.leaderboard/tts_leaderboard.xlsxwith acost_usdcolumn in the summary sheet (the one cost figure comparable across providers; per-unit rates and native-currency figures stay in each provider’smetrics.json).


Learn more about metrics
Detailed explanation of all metrics and how LLM Judge works
Resources
Integrations
See the full list of supported providers and their configuration options