---
title: "Best TTS and STT Aggregator APIs in 2026: AllModels vs OpenRouter, Eden AI, Telnyx and More"
description: "Compare 9 TTS and STT aggregator APIs in 2026: text-to-speech, speech-to-text, real-time WebSocket streaming, OpenAI and ElevenLabs SDK support and pricing."
canonical: "https://allmodels.io/guides/best-tts-stt-aggregator-api"
markdown: "https://allmodels.io/guides/best-tts-stt-aggregator-api.md"
author: "AllModels"
datePublished: "2026-10-16"
dateModified: "2026-10-19"
---

# Best TTS and STT aggregator APIs in 2026

A side-by-side comparison of 9 services that put text-to-speech and speech-to-text models from several providers behind one integration: what each one covers, how it streams, which SDKs it accepts and how it charges.

> AllModels is an independent service and is not affiliated with, endorsed by, or sponsored by the providers whose models it routes to.

## What a TTS and STT aggregator API is

A TTS and STT aggregator API gives you text-to-speech and speech-to-text models from many providers through one account, one API key and one integration. Instead of signing up with Cartesia, ElevenLabs, Deepgram, AssemblyAI and OpenAI separately, learning each SDK and paying each bill, your application calls one service and chooses a model by ID. The same idea is also called a unified speech API, a speech abstraction layer, or an "OpenRouter for voice".

The services in this space differ a lot. Some only do text-to-speech, some only do speech-to-text, and only a few do both. Some stream audio over a WebSocket as it is produced, while others return a finished file. Some accept the OpenAI or ElevenLabs SDK you may already use; others need their own client. A few are open-source libraries rather than hosted APIs, so you still hold a key and a bill with every provider.

### How we compared them

We picked the services that AI coding agents most often recommended when we asked them to find an API that standardizes real-time TTS or STT providers. Every fact in the table comes from that company's own website and documentation, checked in October 2026. Where a company's own pages disagree, we show the range. We checked each service for:

- **Text-to-speech and speech-to-text** through a public API.
- **Real-time streaming** for each: a WebSocket that streams audio or transcripts as they are produced. HTTP streaming of one finished request does not count.
- **OpenAI- and ElevenLabs-compatible** endpoints, meaning the official SDK works after changing its base URL.
- **Provider choice** per request, the size of the catalogue, and the pricing model.

### Where AllModels fits

AllModels is built for teams that need both directions of speech in one place. Text-to-speech and speech-to-text share one API key and one prepaid balance, both stream in real time, and both work with the official OpenAI and ElevenLabs SDKs. It is the only service in this comparison that accepts the ElevenLabs SDK. Pricing is pay-as-you-go at provider list price plus a 5.5% fee, the same model OpenRouter uses, and new accounts get free credits.

## TTS and STT aggregator APIs compared

**Yes** means the company documents the feature. Anything else is **No**.

Capabilities as documented on each company's own website and docs. Checked October 2026.

| Product | Text-to-speech | Speech-to-text | Real-time TTS | Real-time STT | OpenAI SDK | ElevenLabs SDK | Choose provider | Catalogue | Pricing |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| [AllModels](https://allmodels.io/) | Yes (41 models) | Yes (33 models) | Yes (WebSocket) | Yes (WebSocket) | Yes | Yes | Yes (`only`, `order`, `ignore`) | 81 models from 18 providers | Prepaid pay-as-you-go plus a 5.5% fee; free credits at signup |
| Telnyx | Yes | Yes | Yes (WebSocket) | Yes (WebSocket) | No | No | Yes | About 9–12 TTS and 12–14 STT engines | Pay-as-you-go with volume tiers |
| Eden AI | Yes | Yes | No | No | Yes | No | Yes (`provider/model`) | 7 TTS and 7 STT providers | Pay-as-you-go at list price plus a 5.5% fee |
| OpenRouter | Yes | Yes | No | No | Yes | No | No | 35 TTS and 26 STT models | Pay-as-you-go at list price plus a 5.5% fee on credits |
| Speechbase | Yes | No | No | No | No | No | Yes (`provider/model`) | 15–17 TTS providers | Free tier; Pro from $25/month; credits |
| SpeechSDK | Yes | No | No | No | No | No | Yes (`provider/model`) | 14–17 TTS providers | Free and open source; you pay each provider |
| SLNG | Yes | Yes | Yes (WebSocket) | Yes (WebSocket) | No | No | Yes (Model in the URL) | 13 TTS and 8 STT models | Prepaid, per audio minute |
| VoiceRun | No | Yes | No | Yes (WebSocket) | No | No | Yes | About 14 STT models | Provider cost plus $0.02/min audio |
| router.audio | No | Yes | No | Yes (WebSocket) | No | No | Yes (`provider` or `auto`) | 10 STT providers | Free with your own provider keys |

- **Real-time** means audio or transcripts stream over a WebSocket while you send.
- **OpenAI SDK** and **ElevenLabs SDK** mean the official SDK works by changing its base URL.

### Each service in brief

#### Telnyx

A telecom platform whose speech APIs cover text-to-speech and an STT router over REST, WebSocket and live phone calls, mixing Telnyx-hosted models with third-party engines.

**Pick it if:** you are building phone or voice agents on Telnyx telephony and want speech next to the call network.

#### Eden AI

A general AI API aggregator. Its speech endpoints wrap third-party TTS and STT providers behind OpenAI-compatible and native endpoints, returning finished audio and transcripts rather than streams.

#### OpenRouter

A model router best known for LLMs that also offers OpenAI-compatible text-to-speech and speech-to-text. Speech is request and response: TTS audio can stream back over HTTP, but there is no WebSocket for streaming text in, and transcription is file-based.

**Pick it if:** you only need the most basic text-to-speech and speech-to-text and already use OpenRouter for LLMs.

#### Speechbase

A hosted text-to-speech gateway with a voice library, pronunciation dictionaries and request logs. It does not offer speech-to-text.

#### SpeechSDK

A free, open-source TypeScript library from the team behind Speechbase. It runs in your own code and calls each text-to-speech provider directly with your own keys, so it is not a hosted API.

#### SLNG

A regional voice gateway with a unified API over STT and TTS models, including its own hosted models, with WebSocket streaming in both directions.

#### VoiceRun

An enterprise platform for building voice agents in code. It exposes a real-time WebSocket STT router; text-to-speech is used inside its agents rather than as a standalone API.

**Pick it if:** you are building production phone agents and want evals, telephony and STT fallbacks in one platform.

#### router.audio

A lightweight WebSocket proxy that normalizes real-time speech-to-text across about ten providers. It has no text-to-speech and no file transcription.

## The best TTS and STT aggregator API in 2026: AllModels

AllModels is the best TTS and STT aggregator API in this comparison. It is the only one of the 9 services marked yes in every feature column.

- **Speech in and speech out with one key.** Text-to-speech and speech-to-text share one API key and one prepaid balance. Only five of the 9 services offer both.
- **Real-time in both directions.** Text-to-speech and speech-to-text both stream over WebSocket. Only AllModels, Telnyx and SLNG do this.
- **The SDKs you already use.** The official OpenAI SDK works for text-to-speech, speech-to-text and realtime transcription, and the official ElevenLabs SDK works too. No other service in the table accepts the ElevenLabs SDK.
- **Choice of models and providers.** 81 models from 18 providers, with `only`, `order` and `ignore` provider preferences on each request.

Every other service covers only part of the table. **Speechbase** and **SpeechSDK** are text-to-speech only. **router.audio** is speech-to-text only. **Eden AI** and **OpenRouter** return finished files instead of real-time streams. **Telnyx** and **VoiceRun** build speech around their own telephony and agent platforms. **SLNG** needs its own client instead of the OpenAI or ElevenLabs SDK.

AllModels covers all of it with one integration. Browse the [model catalogue](https://allmodels.io/models) or start with free credits.

## One key for speech in and speech out

The same AllModels key and client handle both directions. Pick a client, a mode and a language; highlighted lines are the AllModels base URL and the values you change to try another model.

### HTTP, text to speech — JavaScript · Node.js · fetch

Client: Native · Mode: Text to speech · Language: JS

Already have the complete text? POST it to `https://api.allmodels.io/oai/audio/speech` and save the audio file. [TTS docs](https://allmodels.io/docs/text-to-speech).

```javascript
import { writeFile } from "node:fs/promises";

const response = await fetch("https://api.allmodels.io/oai/audio/speech", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.ALLMODELS_API_KEY}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    model: "grok/grok-tts",
    voice: "eve",
    input: "Your order has shipped. It arrives tomorrow.",
    response_format: "mp3"
  })
});

if (!response.ok) throw new Error(await response.text());
await writeFile("speech.mp3", Buffer.from(await response.arrayBuffer()));
```

### HTTP, text to speech — Python · requests

Client: Native · Mode: Text to speech · Language: Python

Already have the complete text? POST it to `https://api.allmodels.io/oai/audio/speech` and save the audio file. [TTS docs](https://allmodels.io/docs/text-to-speech).

```python
import os

import requests

response = requests.post(
    "https://api.allmodels.io/oai/audio/speech",
    headers={"Authorization": f"Bearer {os.environ['ALLMODELS_API_KEY']}"},
    json={
        "model": "grok/grok-tts",
        "voice": "eve",
        "input": "Your order has shipped. It arrives tomorrow.",
        "response_format": "mp3",
    },
    timeout=60,
)
response.raise_for_status()

with open("speech.mp3", "wb") as output:
    output.write(response.content)
```

### HTTP, speech to text — JavaScript · Node.js · fetch

Client: Native · Mode: Speech to text · Language: JS

Already have the recording? POST it to `https://api.allmodels.io/oai/audio/transcriptions` and read the transcript. [STT docs](https://allmodels.io/docs/speech-to-text).

```javascript
import { readFile } from "node:fs/promises";

const form = new FormData();
form.set("model", "deepgram/nova-3");
form.set("language", "en");
form.set("file", new Blob([await readFile("call.wav")], { type: "audio/wav" }), "call.wav");

const response = await fetch("https://api.allmodels.io/oai/audio/transcriptions", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.ALLMODELS_API_KEY}` },
  body: form
});

if (!response.ok) throw new Error(await response.text());
const transcript = await response.json();
console.log(transcript.text);
```

### HTTP, speech to text — Python · requests

Client: Native · Mode: Speech to text · Language: Python

Already have the recording? POST it to `https://api.allmodels.io/oai/audio/transcriptions` and read the transcript. [STT docs](https://allmodels.io/docs/speech-to-text).

```python
import os
import requests

with open("call.wav", "rb") as audio:
    response = requests.post(
        "https://api.allmodels.io/oai/audio/transcriptions",
        headers={"Authorization": f"Bearer {os.environ['ALLMODELS_API_KEY']}"},
        data={"model": "deepgram/nova-3", "language": "en"},
        files={"file": ("call.wav", audio, "audio/wav")},
        timeout=60,
    )

response.raise_for_status()
print(response.json()["text"])
```

### OpenAI SDK, text to speech — JavaScript · openai

Client: OpenAI SDK · Mode: Text to speech · Language: JS

Set the OpenAI SDK base URL to `https://api.allmodels.io/oai` and request a complete audio file. [OpenAI TTS docs](https://allmodels.io/docs/openai/text-to-speech).

```javascript
import { writeFile } from "node:fs/promises";
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.ALLMODELS_API_KEY,
  baseURL: "https://api.allmodels.io/oai"
});

const audio = await client.audio.speech.create({
  model: "grok/grok-tts",
  voice: "eve",
  input: "Your order has shipped. It arrives tomorrow.",
  response_format: "mp3"
});

await writeFile("speech.mp3", Buffer.from(await audio.arrayBuffer()));
```

### OpenAI SDK, text to speech — Python · openai

Client: OpenAI SDK · Mode: Text to speech · Language: Python

Set the OpenAI SDK base URL to `https://api.allmodels.io/oai` and request a complete audio file. [OpenAI TTS docs](https://allmodels.io/docs/openai/text-to-speech).

```python
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["ALLMODELS_API_KEY"],
    base_url="https://api.allmodels.io/oai",
)

audio = client.audio.speech.create(
    model="grok/grok-tts",
    voice="eve",
    input="Your order has shipped. It arrives tomorrow.",
    response_format="mp3",
)

audio.write_to_file("speech.mp3")
```

### OpenAI SDK, speech to text — JavaScript · openai

Client: OpenAI SDK · Mode: Speech to text · Language: JS

Set the OpenAI SDK base URL to `https://api.allmodels.io/oai` and transcribe a complete file with `audio.transcriptions.create`. [OpenAI transcription docs](https://allmodels.io/docs/openai/transcription).

```javascript
import { createReadStream } from "node:fs";
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.ALLMODELS_API_KEY,
  baseURL: "https://api.allmodels.io/oai"
});

const transcript = await client.audio.transcriptions.create({
  file: createReadStream("call.wav"),
  model: "deepgram/nova-3",
  language: "en"
});

console.log(transcript.text);
```

### OpenAI SDK, speech to text — Python · openai

Client: OpenAI SDK · Mode: Speech to text · Language: Python

Set the OpenAI SDK base URL to `https://api.allmodels.io/oai` and transcribe a complete file with `audio.transcriptions.create`. [OpenAI transcription docs](https://allmodels.io/docs/openai/transcription).

```python
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["ALLMODELS_API_KEY"],
    base_url="https://api.allmodels.io/oai",
)

with open("call.wav", "rb") as audio:
    transcript = client.audio.transcriptions.create(
        file=audio,
        model="deepgram/nova-3",
        language="en",
    )

print(transcript.text)
```

### ElevenLabs SDK, text to speech — JavaScript · @elevenlabs/elevenlabs-js

Client: ElevenLabs SDK · Mode: Text to speech · Language: JS

Set the ElevenLabs SDK base URL to `https://api.allmodels.io/el` and convert complete text to an audio file. [ElevenLabs TTS docs](https://allmodels.io/docs/elevenlabs/text-to-speech).

```javascript
import { writeFile } from "node:fs/promises";
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";

const client = new ElevenLabsClient({
  apiKey: process.env.ALLMODELS_API_KEY,
  baseUrl: "https://api.allmodels.io/el"
});

const audio = await client.textToSpeech.convert("eve", {
  text: "Your order has shipped. It arrives tomorrow.",
  modelId: "grok/grok-tts",
  outputFormat: "mp3_44100_128"
});

const chunks = await Array.fromAsync(audio, (chunk) => Buffer.from(chunk));
await writeFile("speech.mp3", Buffer.concat(chunks));
```

### ElevenLabs SDK, text to speech — Python · elevenlabs

Client: ElevenLabs SDK · Mode: Text to speech · Language: Python

Set the ElevenLabs SDK base URL to `https://api.allmodels.io/el` and convert complete text to an audio file. [ElevenLabs TTS docs](https://allmodels.io/docs/elevenlabs/text-to-speech).

```python
import os
from elevenlabs.client import ElevenLabs

client = ElevenLabs(
    api_key=os.environ["ALLMODELS_API_KEY"],
    base_url="https://api.allmodels.io/el",
)

audio = client.text_to_speech.convert(
    "eve",
    text="Your order has shipped. It arrives tomorrow.",
    model_id="grok/grok-tts",
    output_format="mp3_44100_128",
)

with open("speech.mp3", "wb") as output:
    for chunk in audio:
        output.write(chunk)
```

### ElevenLabs SDK, speech to text — JavaScript · @elevenlabs/elevenlabs-js

Client: ElevenLabs SDK · Mode: Speech to text · Language: JS

Set the ElevenLabs SDK base URL to `https://api.allmodels.io/el` and transcribe a complete file. The JavaScript SDK checks model IDs, so use an ID it recognizes such as `scribe_v2`. [ElevenLabs transcription docs](https://allmodels.io/docs/elevenlabs/transcription).

```javascript
import { File } from "node:buffer";
import { readFile } from "node:fs/promises";
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";

const client = new ElevenLabsClient({
  apiKey: process.env.ALLMODELS_API_KEY,
  baseUrl: "https://api.allmodels.io/el"
});

const bytes = await readFile("call.wav");
const transcript = await client.speechToText.convert({
  file: new File([bytes], "call.wav", { type: "audio/wav" }),
  modelId: "scribe_v2",
  languageCode: "en"
});

console.log(transcript.text);
```

### ElevenLabs SDK, speech to text — Python · elevenlabs

Client: ElevenLabs SDK · Mode: Speech to text · Language: Python

Set the ElevenLabs SDK base URL to `https://api.allmodels.io/el` and transcribe a complete file with any AllModels STT model ID. [ElevenLabs transcription docs](https://allmodels.io/docs/elevenlabs/transcription).

```python
import os
from elevenlabs.client import ElevenLabs

client = ElevenLabs(
    api_key=os.environ["ALLMODELS_API_KEY"],
    base_url="https://api.allmodels.io/el",
)

with open("call.wav", "rb") as audio:
    transcript = client.speech_to_text.convert(
        file=audio,
        model_id="deepgram/nova-3",
        language_code="en",
    )

print(transcript.text)
```

## Keep the SDK you already use

### OpenAI-compatible

Endpoint: `https://api.allmodels.io/oai`

Point the official OpenAI SDK at AllModels and keep calling `audio.speech.create`, `audio.transcriptions.create` and realtime transcription, now with any AllModels model ID.

- [Read the OpenAI SDK docs](https://allmodels.io/docs/openai/overview)

### ElevenLabs-compatible

Endpoint: `https://api.allmodels.io/el`

Point the official ElevenLabs SDK at AllModels and keep using its text-to-speech, streaming, speech-to-text and realtime methods with models from other providers too.

- [Read the ElevenLabs SDK docs](https://allmodels.io/docs/elevenlabs/overview)

## TTS and STT aggregator questions

### What is the best TTS and STT aggregator API in 2026?

AllModels. It is the only service in this comparison that offers text-to-speech and speech-to-text with real-time WebSocket streaming in both directions, the official OpenAI SDK and the official ElevenLabs SDK, all with one API key and one prepaid balance.

### Does OpenRouter support real-time text-to-speech?

No. OpenRouter's text-to-speech and speech-to-text are request and response only, with no real-time streaming. AllModels streams both over WebSocket.

### Does Speechbase support speech-to-text?

No. As of October 2026, Speechbase's docs and API reference only describe text-to-speech endpoints. Its open-source companion, SpeechSDK, is also text-to-speech only.

### What is the difference between an aggregator API and an open-source speech library?

A library such as SpeechSDK runs inside your application and still needs your own account, key and bill with every provider. A hosted aggregator such as AllModels gives you one key and one prepaid balance for its whole [model catalogue](https://allmodels.io/models).

## Try AllModels in three steps

1. **Choose models.** Pick a [TTS model](https://allmodels.io/models?type=tts) and an [STT model](https://allmodels.io/models?type=stt) by their `provider/model` IDs.
2. **Use one API key.** Authenticate both directions with one AllModels key instead of a key per provider.
3. **Stream or send files.** Use WebSocket for live audio and transcripts, or HTTP for complete files.

## Speech in and speech out, one key.

Start with free credits and switch models without changing your integration.

- [Start free](https://dash.allmodels.io/signup)
- [Browse models](https://allmodels.io/models)
- [Read the AllModels documentation](https://allmodels.io/docs)
- [View the canonical HTML guide](https://allmodels.io/guides/best-tts-stt-aggregator-api)
