Skip to main content

Get started

The interactive UI guides you through the full evaluation process:
  1. Language selection — pick from 10+ supported Indic languages
  2. Provider selection — choose providers (only those supporting your language are shown)
  3. Input directory — path to the directory containing your audio files and reference transcripts
The input directory should have this structure:
The stt.csv file contains the reference transcriptions:
All audio files should be in WAV format. The evaluation script expects files at audios/<id>.wav where <id> matches the id column in your CSV.
Refer to the sample dataset for a template.
  1. Output directory — where results will be saved (defaults to ./out)
  2. API keys — enter the API keys for the selected providers
The evaluation runs providers in parallel (max 2 at a time), showing the transcriptions as they are generated.

Evaluator configuration

By default, a text LLM judge — routed through OpenRouter (set OPENROUTER_API_KEY in your environment) — evaluates whether each transcription matches the reference text semantically using the built-in semantic_match evaluator; expand Default evaluator: semantic_match 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:
Each evaluator’s system_prompt is sent as the system message to its own dedicated LLM judge call (one call per evaluator, run in parallel). The user message contains the source/transcription pair. 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 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 semantic_match evaluator scores semantic match between source and transcription.
Matches DEFAULT_STT_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.csv with one row per input audio. In addition to id, gt, pred, WER, evaluator scores, and evaluator reasoning, STT runs include audio_duration_seconds.
  • metrics.json with aggregate wer, evaluator summaries, and a cost object. The cost object includes provider, pricing_model, currency, billing_unit, total_seconds, audio_minutes, the native per-minute rate (cost_per_minute_currency, denominated in currency), and cost_usd. Providers billed in a non-USD currency (e.g. Sarvam in INR) report the native-currency total cost_in_currency and, when the live exchange rate is reachable, the conversion_rate used (native-currency units per 1 USD) and cost_usd. If the exchange rate can’t be fetched, the native-currency cost is still reported and cost_usd is omitted, so that provider is left out of the USD comparison rather than failing the run. Cost is a proportional estimate from bundled rates; provider invoices may differ because of per-file rounding, minimums, tiers, or regional pricing.
  • leaderboard/stt_leaderboard.xlsx with a cost_usd column in the summary sheet (the one cost figure comparable across providers; per-unit rates and native-currency figures stay in each provider’s metrics.json).
STT leaderboard
You can also view the generated transcript and metrics for each row of your dataset including the LLM judge score and reasoning.
STT provider outputs

Learn more about metrics

Detailed explanation of all metrics and why using an LLM Judge is necessary

Resources

Integrations

See the full list of supported providers and their configuration options