Which model to call, per language and per objective, decided from published measurements instead of a vendor's English leaderboard.
Accuracy (WER)
$0.0010$0.01602.0%11.0%
Realtime STT-13.3% · $0.0025
Universal-3.5 Pro2.0% · $0.0075
Velma 24.4% · $0.0010
GPT-4o Transcribe2.3% · $0.0060
GPT-4o-mini Transcribe2.7% · $0.0030
Cost ($/min)
#Model
1
Universal-3.5 Proassemblyai:universal-3-5-pro
2.0%$0.0075
2
GPT-4o Transcribeopenai:gpt-4o-transcribe
2.3%$0.0060
3
GPT-4o-mini Transcribeopenai:gpt-4o-mini-transcribe
2.7%$0.0030
4
Qwen3-ASRalibaba:qwen3-asr-flash
2.8%$0.0054
5
Realtime STT-1inworld:inworld-stt-1
3.3%$0.0025
6
Chirp 3google:chirp_3
3.9%$0.0160
7
Velma 2modulate:velma-2-stt-streaming-english-v2
4.4%$0.0010
8
Grok STTxai:stt
4.8%$0.0033
9
Solaria-1gladia:solaria-1
5.0%$0.0125
10
Pulsesmallest:pulse
5.1%~$0.0050
11
stt-rt-v5soniox:stt-rt-v5
7.5%$0.0020
12
Gradium ASRgradium:default
8.4%$0.0104
13
Nova-3deepgram:nova-3
9.8%$0.0048
14
Ink-2cartesia:ink-2
11.0%$0.0090
—
Fluxdeepgram:flux-general-en
—$0.0065
—
Scribe v2 Realtimeelevenlabs:scribe_v2_realtime
—$0.0065
—
GPT Live Transcribeopenai:gpt-live-transcribe
—$0.0170
One base URL and one key in front of every provider, speaking the API your framework already calls.
Speko speaks the OpenAI API, so the frameworks you already use need a hostname and a model string.
import { defineAgent, voice } from '@livekit/agents';
import * as openai from '@livekit/agents-plugin-openai';
const key = process.env.SPEKO_API_KEY!;
const baseURL = 'https://api.speko.ai/v1';
export default defineAgent({
entry: async (ctx) => {
const session = new voice.AgentSession({
stt: new openai.STT({ apiKey: key, baseURL, model: 'auto' }),
llm: new openai.LLM({ apiKey: key, baseURL, model: 'auto' }),
tts: new openai.TTS({ apiKey: key, baseURL, model: 'auto' }),
});
await session.start({ agent: new voice.Agent({ ... }) });
},
});