Backed by Y Combinator

OpenRouter for Voice

We measure the models language by language, then route on the result.

Benchmarks
STT Universal-3.5 Pro AssemblyAI 2.0% 66ms
LLM gpt-5.6-luna OpenAI 100% 449ms
TTS aura-2 Deepgram 3.47 125ms
50+
Providers
150+
Models
10+
Languages
0ms
Speech-to-text
Rank Model
1 Universal-3.5 Pro AssemblyAI 2.0% 66ms
2 Realtime STT-1 Inworld 3.3% 139ms
3 Scribe v2 ElevenLabs 3.1% 233ms
LLM
Rank Model
1 gemma-4-31b Cerebras 92 192ms
2 Claude Haiku 4.5 Anthropic 91 532ms
3 gpt-5.6-luna OpenAI 88 449ms
Text-to-speech
Rank Model
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
Speech-to-speech
Rank Model
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

More

$ 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();
  },
});
  1. Keep the standard LiveKit services.
  2. Set the base URL once.
  3. Use the same Speko key for all three stages.
$ 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"))
  1. Speech stages come from the Speko plugin.
  2. One policy sets the routing language for both.
  3. The same key serves your LLM on the compatible route.
$ 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}" }
    }
  }
}
  1. Point your client at the hosted server. It speaks streamable HTTP.
  2. Sign in through OAuth on first connect, or send an API key on the Authorization header.
  3. Your agent can then search the docs, list voices and models, and place a test call.

Point an agent at it

One command.

Claude Code
$ claude mcp add --transport http speko https://mcp.speko.ai/mcp
Read the docs

No key to read it.

curl
$ curl -s https://api.speko.ai/v1/models
Browse the catalog

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.

Phone numbersWebhook toolsKnowledge basesEvals
AICPA SOC 2 HIPAA GDPR
One router for speech-to-text, LLM and text-to-speech.

Need the whole agent, not just the models? Build one on the platform

Speko