OpenRouter for Voice
We measure the models language by language, then route on the result.
| STT | Universal-3.5 Pro AssemblyAI | 2.0% | 66ms |
| LLM | gpt-5.6-luna OpenAI | 100% | 449ms |
| TTS | aura-2 Deepgram | 3.47 | 125ms |
The route is decided when your session opens, not while you speak. Auth runs once at the socket upgrade, upstream HTTP connections come pre-warmed from a pool, and usage is recorded after the response - no routing, auth, or metering work rides the stream.
| Rank | Model | Word Error Rate on FLEURS read English (n=50), batch API. Read speech, not studio-clean audio. Lower is better. Measured and published at https://benchmarks.speko.ai/stt. | End-of-speech to final transcript, p50 (us-east4, n=30). Whisker spans p50->p90. Measured and published at https://benchmarks.speko.ai/stt. |
|---|---|---|---|
| 1 | Universal-3.5 Pro AssemblyAI | 2.0% | 66ms |
| 2 | Realtime STT-1 Inworld | 3.3% | 139ms |
| 3 | Scribe v2 ElevenLabs | 3.1% | 233ms |
| Rank | Model | Weighted, speed-first: TTFT 50%, task 25%, dead-air 15%, fabrication 10%. Higher is better. Measured and published at https://benchmarks.speko.ai/llm. | Time-to-first-token, p50 (us-east4). Whisker spans p50->p90. Measured and published at https://benchmarks.speko.ai/llm. |
|---|---|---|---|
| 1 | gemma-4-31b Cerebras | 92 | 192ms |
| 2 | Claude Haiku 4.5 Anthropic | 91 | 532ms |
| 3 | gpt-5.6-luna OpenAI | 88 | 449ms |
| Rank | Model | Blind human A/B preference as an Internal MOS (1-5); higher = preferred. Measured and published at https://benchmarks.speko.ai/tts. | Time to first audio, p50 (n=30, us-east4, sequential). Lower is better. Row caption spans p50-p90. Measured and published at https://benchmarks.speko.ai/tts. |
|---|---|---|---|
| 1 | eleven_v3 ElevenLabs | 3.51 | 481ms |
| 2 | gemini-3.1-flash-tts-preview Google | 3.51 | 978ms |
| 3 | aura-2 Deepgram | 3.47 | 125ms |
| Rank | Model | Completion x capability (action weighted), mean over 6 concierge scenarios, n=3. Measured and published at https://benchmarks.speko.ai/s2s. | End-of-speech to first audio, p50, us-east4 (reused from 2026-07-08). Measured and published at https://benchmarks.speko.ai/s2s. |
|---|---|---|---|
| 1 | grok-voice-think-fast-2.0 xAI | 0.80 | 820ms |
| 2 | gemini-3.1-flash-live Google | 0.77 | 1108ms |
| 3 | gpt-realtime OpenAI | 0.76 | 494ms |
$ bun add @livekit/agents @livekit/agents-plugin-openai 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', useRealtime: false }), llm: new openai.LLM({ apiKey: key, baseURL, model: 'auto' }), tts: new openai.TTS({ apiKey: key, baseURL, model: 'auto', voice: 'alloy' }), }); await session.start({ agent: new voice.Agent({ instructions: 'Be concise.' }), room: ctx.room, }); await ctx.connect(); }, });
- Keep the standard LiveKit services.
- Set the base URL once.
- Use the same Speko key for all three stages.
- Read the LiveKit guide
$ pip install "pipecat-speko==0.1.1" "pipecat-ai[openai]==1.6.0" import os from pipecat_speko import SpekoPolicy, SpekoSTTService, SpekoTTSService from pipecat.services.openai.llm import OpenAILLMService key = os.environ["SPEKO_API_KEY"] gateway = "https://api.speko.ai" policy = SpekoPolicy(language="en") stt = SpekoSTTService(api_key=key, base_url=gateway, policy=policy) tts = SpekoTTSService(api_key=key, base_url=gateway, policy=policy) llm = OpenAILLMService(api_key=key, base_url=f"{gateway}/v1", settings=OpenAILLMService.Settings(model="auto"))
- Speech stages come from the Speko plugin.
- One policy sets the routing language for both.
- The same key serves your LLM on the compatible route.
- Read the Pipecat guide
$ claude mcp add --transport http speko https://mcp.speko.ai/mcp # or send a key instead of signing in through the browser $ claude mcp add --transport http speko https://mcp.speko.ai/mcp \ --header "Authorization: Bearer $SPEKO_API_KEY"
// ~/.cursor/mcp.json { "mcpServers": { "speko": { "url": "https://mcp.speko.ai/mcp", "headers": { "Authorization": "Bearer ${env:SPEKO_API_KEY}" } } } }
- Point your client at the hosted server. It speaks streamable HTTP.
- Sign in through OAuth on first connect, or send an API key on the Authorization header.
- Your agent can then search the docs, list voices and models, and place a test call.
- Read the docs
Point an agent at it
One command.
$ claude mcp add --transport http speko https://mcp.speko.ai/mcp
Describe it
Say what the agent should do in plain English, and pick a voice.
Talk to it
Call it in the browser from the console, before it answers anyone else.
Ship it
Give it a phone number, and every call comes back with its transcript.
Need the whole agent, not just the models? Build one on the platform