https://api.allmodels.io/oai
OpenAI互換
すでにOpenAI SDKを使っていますか?ベースURLをAllModelsに設定すれば、AllModelsのモデルIDでそのままaudio.speech.createを呼び出せます。ストリーミングと単一リクエストのどちらにも対応しています。
AllModels経由で複数のTTSモデルに接続できます。WebSocketで音声をストリーミングしたり、OpenAI互換・ElevenLabs互換のSDKを使ったりでき、音声スタックを作り直さずにモデルを切り替えられます。
AllModelsは独立したサービスであり、ルーティング先のモデルを提供するプロバイダーとは提携関係になく、その承認や後援も受けていません。
統合型の音声合成(TTS)APIとは、さまざまなプロバイダーのモデルで音声を生成できる単一のインテグレーションです。Cartesia用、ElevenLabs用、MiniMax用、OpenAI用とクライアントを個別に書く代わりに、アプリケーションは1つのエンドポイントと1つのAPIキーでやり取りします。どのプロバイダーが処理するかは、選んだモデルで決まります。AllModelsはこの種の統合型TTS APIです。cartesia/sonic-3-6やminimax/speech-2-8-hdのようなモデルIDを送ると、AllModelsがリクエストをそのプロバイダーにルーティングし、音声をストリーミングで返します。同じ考え方は、TTSアグリゲーターAPI、音声合成の抽象化レイヤー、「音声合成版のOpenRouter」とも呼ばれます。
AllModelsのTTSカタログにあるすべてのモデルにはprovider/model形式のIDがあります。認証はAllModelsのAPIキー1つで済み、プロバイダーごとに管理していた個別のキーや請求アカウントは不要になります。AllModelsでは、同じモデルを次の3つの方法で呼び出せます。
wss://api.allmodels.io/v1/tts。テキストを生成されるそばから送り、音声をバイナリメッセージとして受け取ります。AllModelsネイティブのリアルタイムインターフェースです。https://api.allmodels.io/oai。公式のOpenAI SDKのベースURLをここに向ければ、そのままaudio.speech.createを呼び出せます。https://api.allmodels.io/el。公式のElevenLabs SDKのベースURLをここに向ければ、ストリーミングを含む音声合成メソッドをそのまま呼び出せます。3つとも同じカタログにアクセスします。コードベースですでにOpenAIやElevenLabsのSDKを使っている場合は、ベースURLとAPIキーを変えるだけでAllModelsに移行できます。
アグリゲーターであるAllModelsでは、プロバイダーの比較と制御も1か所で行えます。GET /v1/modelsは、すべてのTTSモデルと、それを提供するプロバイダー、1,000文字あたりの価格を一覧表示します。1つのモデルを複数のプロバイダーが提供している場合は、providerの設定でどれを使うかを選べます。onlyは指定したプロバイダーに固定し、orderは指定したプロバイダーを優先し、ignoreは指定したプロバイダーを除外します。すべてのプロバイダーの利用料は、プロバイダーごとの個別請求ではなく、AllModelsのプリペイド残高1つから差し引かれます。
APIキー、エンドポイント、クライアント、リクエストのコードは、プロバイダーが変わってもまったく同じです。別のTTSモデルを使うにはモデルIDを変えるだけです。プロバイダーへの接続、そのAPIの処理、アプリケーションへの音声の返却はAllModelsが引き受けます。
クライアント、モード、言語を選んでください。ハイライトされた行は、AllModelsのベースURLと、別のモデルを試すときに変更するモデルとボイスの値です。
wss://api.allmodels.io/v1/ttsに接続し、テキストを生成されるそばから送って、音声をバイナリメッセージとして受け取ります。 ストリーミングガイド。
import { once } from "node:events";
import { createWriteStream } from "node:fs";
import WebSocket from "ws";
const url = new URL("wss://api.allmodels.io/v1/tts");
url.searchParams.set("model", "grok/grok-tts");
url.searchParams.set("voice", "eve");
url.searchParams.set("format", "pcm");
const output = createWriteStream("reply.pcm");
const ws = new WebSocket(url, {
headers: { Authorization: `Bearer ${process.env.ALLMODELS_API_KEY}` }
});
// Audio arrives as binary WebSocket messages.
ws.on("message", (data, isBinary) => {
if (isBinary) output.write(data);
});
await once(ws, "open");
// Send text as your LLM or application produces it.
ws.send(JSON.stringify({ type: "text", text: "Your order has shipped. " }));
ws.send(JSON.stringify({ type: "text", text: "It arrives tomorrow." }));
ws.send(JSON.stringify({ type: "flush" }));
ws.send(JSON.stringify({ type: "close" }));
await once(ws, "close");
output.end();wss://api.allmodels.io/v1/ttsに接続し、テキストを生成されるそばから送って、音声をバイナリメッセージとして受け取ります。 ストリーミングガイド。
import asyncio
import json
import os
import websockets
URL = (
"wss://api.allmodels.io/v1/tts"
"?model=grok%2Fgrok-tts&voice=eve&format=pcm"
)
async def receive_audio(socket):
with open("reply.pcm", "wb", buffering=0) as output:
async for message in socket:
if isinstance(message, bytes):
output.write(message)
async def main():
async with websockets.connect(
URL,
additional_headers={
"Authorization": f"Bearer {os.environ['ALLMODELS_API_KEY']}"
},
) as socket:
receiver = asyncio.create_task(receive_audio(socket))
for text in ["Your order has shipped. ", "It arrives tomorrow."]:
await socket.send(json.dumps({"type": "text", "text": text}))
await socket.send(json.dumps({"type": "flush"}))
await socket.send(json.dumps({"type": "close"}))
await receiver
asyncio.run(main())テキストがすでに揃っている場合は、https://api.allmodels.io/oai/audio/speechにPOSTして音声ファイルを保存します。 TTSドキュメント。
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()));テキストがすでに揃っている場合は、https://api.allmodels.io/oai/audio/speechにPOSTして音声ファイルを保存します。 TTSドキュメント。
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)OpenAI SDKのベースURLをhttps://api.allmodels.io/oaiに設定し、audio.speech.createを呼び出します。音声は生成されるそばからストリーミングで返されます。 OpenAI TTSドキュメント。
import { createWriteStream } from "node:fs";
import { Readable } from "node:stream";
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.ALLMODELS_API_KEY,
baseURL: "https://api.allmodels.io/oai"
});
const response = await client.audio.speech.create({
model: "grok/grok-tts",
voice: "eve",
input: "Your order has shipped. It arrives tomorrow.",
response_format: "pcm",
stream_format: "audio"
});
Readable.fromWeb(response.body).pipe(createWriteStream("speech.pcm"));OpenAI SDKのベースURLをhttps://api.allmodels.io/oaiに設定し、生成されるそばからレスポンスをファイルにストリーミングします。 OpenAI TTSドキュメント。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["ALLMODELS_API_KEY"],
base_url="https://api.allmodels.io/oai",
)
with client.audio.speech.with_streaming_response.create(
model="grok/grok-tts",
voice="eve",
input="Your order has shipped. It arrives tomorrow.",
response_format="pcm",
) as response:
response.stream_to_file("speech.pcm")OpenAI SDKのベースURLをhttps://api.allmodels.io/oaiに設定し、完成した音声ファイルをリクエストします。 OpenAI TTSドキュメント。
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のベースURLをhttps://api.allmodels.io/oaiに設定し、完成した音声ファイルをリクエストします。 OpenAI TTSドキュメント。
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")ElevenLabs SDKのベースURLをhttps://api.allmodels.io/elに設定し、生成されるそばから音声チャンクをストリーミングします。 ElevenLabs TTSドキュメント。
import { createWriteStream } from "node:fs";
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.stream("eve", {
text: "Your order has shipped. It arrives tomorrow.",
modelId: "grok/grok-tts",
outputFormat: "mp3_44100_128"
});
const output = createWriteStream("speech.mp3");
for await (const chunk of audio) {
output.write(Buffer.from(chunk));
}
output.end();ElevenLabs SDKのベースURLをhttps://api.allmodels.io/elに設定します。convert_realtimeはテキストを生成されるそばからWebSocketで送り、届いた音声を順次返します。 ElevenLabs TTSドキュメント。
import os
from elevenlabs.client import ElevenLabs
client = ElevenLabs(
api_key=os.environ["ALLMODELS_API_KEY"],
base_url="https://api.allmodels.io/el",
)
def generated_text():
# Yield text as your LLM or application produces it.
yield "Your order has shipped. "
yield "It arrives tomorrow."
audio = client.text_to_speech.convert_realtime(
"eve",
text=generated_text(),
model_id="grok/grok-tts",
output_format="pcm_24000",
)
with open("reply.pcm", "wb", buffering=0) as output:
for chunk in audio:
output.write(chunk)ElevenLabs SDKのベースURLをhttps://api.allmodels.io/elに設定し、完成したテキストを音声ファイルに変換します。 ElevenLabs TTSドキュメント。
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のベースURLをhttps://api.allmodels.io/elに設定し、完成したテキストを音声ファイルに変換します。 ElevenLabs TTSドキュメント。
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)互換インターフェース
https://api.allmodels.io/oai
すでにOpenAI SDKを使っていますか?ベースURLをAllModelsに設定すれば、AllModelsのモデルIDでそのままaudio.speech.createを呼び出せます。ストリーミングと単一リクエストのどちらにも対応しています。
https://api.allmodels.io/el
すでにElevenLabs SDKを使っていますか?ベースURLをAllModelsに設定すれば、AllModelsのモデルIDでconvert、stream、realtimeの各メソッドをそのまま使えます。
ElevenLabs TTSドキュメントを読む要点まとめ
統合型TTS APIは、複数の音声合成モデルに対する単一のインテグレーション窓口をアプリケーションに提供します。AllModelsでは、選んだモデルIDでルートが決まり、認証と基本的なリクエストの流れは変わりません。
はい。ネイティブインターフェースは/v1/ttsでWebSocket経由のストリーミングを行い、ElevenLabs Python SDKは互換WebSocket経由でテキストをストリーミング入力でき、どちらのSDKもHTTPで音声をストリーミングで受け取れます。ストリーミング対応はモデルによって異なります。
はい。共通の設定は標準のフィールドで指定し、ボイス設定などのプロバイダー固有の設定はprovider_optionsに入れると、そのままプロバイダーに渡されます。
はい。AllModelsは音声版のOpenRouterのように使えます。1つのAPIキーと1つのエンドポイントで、複数プロバイダーの音声合成モデルをprovider/model形式のIDで選んで利用できます。公式のOpenAI SDKとElevenLabs SDKにも対応しているため、既存のコードはベースURLとキーを変えるだけで済みます。
オープンソースの抽象化ライブラリはアプリケーション内で動作し、ラップする各プロバイダーごとに自前のアカウント、APIキー、請求が必要です。AllModelsのようなアグリゲーターAPIはホスト型サービスで、1つのキーと1つのプリペイド残高でTTSカタログ全体を利用でき、すでに使っているOpenAIやElevenLabsのSDK、またはWebSocketで呼び出せます。
アプリケーションのモデルIDを変更する前に、TTSカタログで利用可能なモデル、ルート、価格、言語、ボイス、APIの例を比較してください。
provider/model形式のIDでTTSモデルを選びます。