← 返回 2026-09-20 简报

OpenRouter 文本转语音:五分钟掌握 API 教程

语音播报
摘要
事件:OpenRouter推出文本转语音API,通过统一端点支持多提供商模型,开发者可使用兼容OpenAI的接口生成音频。 要点:调用POST /api/v1/audio/speech端点;需指定model、input及voice字段;返回原始音频字节或JSON错误。 影响:简化TTS集成,一行代码切换声音,提升开发效率,降低多供应商适配成本。

我们通过兼容 OpenAI 的 POST /api/v1/audio/speech 端点支持文本转语音(TTS)。发送文本、模型和受支持的语音,然后保存或流式传输音频。使用一个 API 密钥即可通过相同的请求结构访问来自多个提供商的 TTS 模型。

本教程涵盖身份验证、合成、响应验证、流式传输以及模型或语音的更改。

简而言之

将 TTS 请求发送至 https://openrouter.ai/api/v1/audio/speech 。

使用 OpenAI Python SDK,将 base_url 设置为 https://openrouter.ai/api/v1 。

当模型支持其他语音时,只需在一行代码中更改 voice 值。在切换提供商时,请同时更改匹配的模型和语音。

您在请求正文中指定模型名称。无论您选择哪个提供商的语音模型,端点、身份验证和响应处理都保持不变。

我们的音频 API 公告涵盖了更广泛的发布内容。对于语音转文本,请使用我们的转录指南 。

使用 OpenRouter 文本转语音所需的内容

创建一个 OpenRouter API 密钥并将其存储在环境变量中,以使其远离源代码。

在 macOS 或 Linux 上,为当前终端会话设置变量:

export OPENROUTER_API_KEY = "your-api-key"
所有示例均使用 https://openrouter.ai/api/v1 作为基础 URL,并在 Authorization: Bearer 头中发送密钥。

该端点接受两个必填字段以及大多数模型所需的语音字段:

model 用于选择语音模型。

input 包含您希望模型朗读的文本。

voice 用于选择该模型支持的语音。仅当提供商文档说明存在默认语音时,才可以省略此字段,因此在实践中应将其视为必填项。

response_format 和 speed 是可选的,但显式设置输出格式可使响应更具可预测性,因为格式支持因模型而异。当您省略 response_format 时,我们的端点默认为 PCM,而 Mistral Voxtral Mini TTS 仅接受 MP3,且 speed 仅在支持的模型上改变语速。

成功的请求将返回原始音频字节,而非成功的请求将返回 JSON。在将其写入音频文件之前,请验证响应。

明确了密钥和响应行为后,您就可以生成第一个音频文件了。

使用 cURL 生成第一个 MP3 文件

以下请求使用 Mistral Voxtral Mini TTS 及其 en_paul_neutral 语音。它将返回的字节直接保存到 output.mp3 。

curl --silent \
--show-error \
--fail-with-body \
--request POST \
--url https://openrouter.ai/api/v1/audio/speech \
--header "Authorization: Bearer $OPENROUTER_API_KEY " \
--header "Content-Type: application/json" \
--data '{
"model": "mistralai/voxtral-mini-tts-2603",
"input": "OpenRouter turns this text into speech through one API endpoint.",
"voice": "en_paul_neutral",
"response_format": "mp3"
}' \
--dump-header output.headers \
--output output.mp3
这些标志有助于正确处理失败的请求。--fail-with-body 使 cURL 在收到 4xx 或 5xx 响应时以错误退出,并且由于设置了 --output,它会将服务器的 JSON 错误正文写入 output.mp3 而不是终端。当命令失败时,使用 cat output.mp3 读取错误,并在重试之前删除该文件,以免将 JSON 文件作为音频播放。--dump-header 保存响应头,以便您可以确认内容类型并捕获生成 ID。

在播放音频之前,请确认 output.mp3 存在且包含数据:

ls -lh output.mp3
在 macOS 上,您可以使用 afplay output.mp3 播放它。在 Linux 上,请使用已安装的播放器(如 ffplay )。

当将此请求移入应用程序代码时,请确认请求成功且响应包含音频后再保存它。这些检查可防止将 JSON 错误响应写入 MP3 文件。

使用 Python 生成并保存语音

如果您的项目尚未使用 requests,请安装它:

python -m pip install requests
此示例检查 HTTP 状态码,并在保存文件之前验证我们返回的是 MP3 数据:

import os
from pathlib import Path

import requests

response = requests.post(
"https://openrouter.ai/api/v1/audio/speech" ,
headers = {
"Authorization" : f "Bearer { os.environ[ 'OPENROUTER_API_KEY' ] } " ,
"Content-Type" : "application/json" ,
},
json = {
"model" : "mistralai/voxtral-mini-tts-2603" ,
"input" : (
"OpenRouter turns this text into speech through one API endpoint."
),
"voice" : "en_paul_neutral" ,
"response_format" : "mp3" ,
},
timeout = 60 ,
)

response.raise_for_status()

content_type = response.headers.get( "Content-Type" , "" ).split( ";" )[ 0 ]
if content_type != "audio/mpeg" :
raise RuntimeError ( f "Expected audio/mpeg, received { content_type } " )

Path( "output.mp3" ).write_bytes(response.content)

generation_id = response.headers.get( "X-Generation-Id" )
print ( f "Saved output.mp3. Generation ID: { generation_id } " )

raise_for_status() 会在 API 返回 4xx 或 5xx 响应时引发异常,从而防止应用程序将错误主体保存为音频。如果请求成功,内容类型检查会确认响应包含音频后再将其写入文件。记录 X-Generation-Id 以便您可以追踪该请求或在联系支持服务时提供参考。

当 SDK 管理响应流时,同样的验证同样适用。下一个示例保留了 OpenRouter 的基础 URL,并将文件处理移至 OpenAI Python 客户端。

使用 OpenAI Python SDK 流式传输响应

我们的 TTS 端点遵循 OpenAI Audio Speech API 的结构。您可以将 OpenAI 客户端指向我们的基础 URL,并将 HTTP 响应流式传输到文件中:

import os
from pathlib import Path

from openai import OpenAI

client = OpenAI(
api_key = os.environ[ "OPENROUTER_API_KEY" ],
base_url = "https://openrouter.ai/api/v1" ,
)

with client.audio.speech.with_streaming_response.create(
model = "mistralai/voxtral-mini-tts-2603" ,
voice = "en_paul_neutral" ,
input = "OpenRouter can stream this response into an audio file." ,
response_format = "mp3" ,
) as response:
response.stream_to_file(Path( "output.mp3" ))

这种模式在保存文件的同时增量读取响应。渐进式播放需要一个能够缓冲传入数据块的播放器。

JavaScript 可以通过 arrayBuffer() 读取相同的响应。此示例在创建文件之前检查状态和内容类型:

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

const response = await fetch (
"https://openrouter.ai/api/v1/audio/speech" ,
{
method: "POST" ,
headers: {
Authorization: Bearer ${ process . env . OPENROUTER_API_KEY } ,
"Content-Type" : "application/json" ,
},
body: JSON . stringify ({
model: "mistralai/voxtral-mini-tts-2603" ,
input: "OpenRouter returns audio bytes to JavaScript." ,
voice: "en_paul_neutral" ,
response_format: "mp3" ,
}),
},
);

if ( ! response.ok) {
throw new Error ( HTTP ${ response . status }: ${ await response . text () } );
}

const contentType = response.headers. get ( "content-type" )?. split ( ";" )[ 0 ];
if (contentType !== "audio/mpeg" ) {
await response.body?. cancel ();
throw new Error ( Expected audio/mpeg, received ${ contentType } );
}

await writeFile ( "output.mp3" , Buffer. from ( await response. arrayBuffer ()));
console. log (response.headers. get ( "x-generation-id" ));

当您需要一个体积更小且能与标准音频播放器兼容的文件时,请选择 MP3。PCM 可避免压缩开销,并能在兼容的实时流式传输管道中降低延迟。我们返回 audio/mpeg 格式的 MP3 和 audio/pcm 格式的 PCM,可选地包含 rate 和 channels 参数,尽管可用的格式取决于所选模型。Mistral Voxtral Mini TTS 仅接受 MP3,因此请求 PCM 会返回 400 错误。播放原始 PCM 还需要正确的音频设置,因为将文件扩展名更改为 .mp3 并不会转换音频格式。

传输代码在支持的模型之间保持不变。model 和 voice 字段必须保持为有效配对。

更改 TTS 模型和声音

语音标识符属于特定模型。在同一模型内进行语音比较时,可以仅更改一行。例如,当前的 Grok Voice TTS 1.0 模型页面列出了五个内置语音:eve、ara、rex、sal 和 leo。

从以下模型和语音配对开始:

"model" : "x-ai/grok-voice-tts-1.0" ,
"voice" : "eve"

然后仅更改语音行:

  • "voice": "eve"
  • "voice": "ara"

Grok 示例还展示了从 Mistral 到 xAI 的提供商变更。同时更新模型和语音,因为每个提供商都提供其自己的模型和语音 ID,而端点、身份验证、输入和响应检查保持不变:

  • "model": "mistralai/voxtral-mini-tts-2603",
  • "voice": "en_paul_neutral"
  • "model": "x-ai/grok-voice-tts-1.0",
  • "voice": "eve"

在发送请求之前,请在所选模型页面上确认这两个值,因为模型的可用性和语音目录可能会发生变化。

使用 Models API 检索当前的 TTS 模型:

curl "https://openrouter.ai/api/v1/models?output_modalities=speech"

您也可以浏览我们的文本转语音模型集合。

模型 ID | 示例语音 | 显著选项

mistralai/voxtral-mini-tts-2603 | en_paul_neutral | 通过 OpenRouter 语音端点输出 MP3

x-ai/grok-voice-tts-1.0 | eve、ara、rex、sal、leo | 跨 20 多种语言的五个内置语音

microsoft/mai-voice-2 | en-US-Harper:MAI-Voice-2 | speed、Azure style 和 styledegree

我们的 TTS 文档描述了您可以针对支持这些功能的模型通过 provider.options. 传递的特定于提供商的选项。截至 2026 年 9 月,实时目录中没有 OpenAI 语音模型,因此在依赖特定于提供商的字段之前,请检查当前模型列表。

Microsoft MAI-Voice-2 接受 Azure 语音名称。它还支持记录的 0.5 到 2.0 的速度范围以及表达性的 Azure 选项:

{
"model" : "microsoft/mai-voice-2" ,
"input" : "Welcome to the product update." ,
"voice" : "en-US-Harper:MAI-Voice-2" ,
"response_format" : "mp3" ,
"speed" : 1.0 ,
"provider" : {
"options" : {
"azure" : {
"style" : "cheerful" ,
"styledegree" : 1.2
}
}
}
}

这些控制措施仍然特定于提供商。不受支持的提供商可能会忽略 speed,而样式取决于所选的语音。请将提供商选项与匹配的模型配置放在一起。

模型和语音的选择决定了哪些格式和表达性控制可用。生产路径必须在每次生成记录中保留这些设置。

为生产准备集成

在句子或段落边界处拆分长输入,按顺序请求每个片段,并使用了解格式的工具备份音频。这提高了可靠性并更早返回第一个片段。

对每个片段应用相同的响应检查:

遇到非成功 HTTP 状态码时停止。

确认 Content-Type 与请求的格式匹配。

拒绝空响应。

使用模型、语音、格式和应用请求 ID 记录 X-Generation-Id。

在重试之前对响应进行分类,以便永久性请求失败不会进入退避循环。

重试 429、502、503、524 和 529 响应,因为速率限制、提供商错误、暂时不可用、超时和提供商过载可能在后续尝试中清除。如果响应包含 Retry-After 标头,请遵循该标头。否则,使用有上限的指数退避,并在少量尝试后停止。在更正请求、凭据或可用积分之前,不要重试 400、401 或 402 响应。

TTS 模型按输入文本的字符数定价。定价因模型和提供商而异,因此在估算生产成本之前,请检查当前模型页面或 Models API。

这些控制措施涵盖了可靠性、可追溯性和成本。其余故障通常源于将错误正文保存为音频,或将模型与不受支持的语音或格式结合使用。

排查常见的 OpenRouter TTS 错误

为什么 MP3 中包含 JSON?

API 返回了错误,且程序在未检查状态码的情况下保存了其主体内容。请在写入响应之前调用 raise_for_status() 或检查状态码。

为什么音频文件为空或已损坏?

空文件或无法读取的文件通常意味着请求未返回任何音频数据,或者响应以错误的格式被保存。请在保存之前检查响应大小和 Content-Type。将 audio/mpeg 保存为 MP3 格式,并将 audio/pcm 作为原始 PCM 处理,同时使用正确的播放器设置,因为仅更改扩展名为 .mp3 并不会转换音频编码。

为什么 OpenRouter 拒绝该声音?

声音标识符因模型而异。请检查所选模型的页面,并发送其支持的声音之一。每次更换模型时,都请重新确认声音。

为什么某个提供商选项没有效果?

提供商控制仅对匹配的提供商生效。请将 OpenAI 指令置于 provider.options.openai 下,将 Azure 风格的控制置于 provider.options.azure 下。部分提供商会静默忽略不支持的速度值。

在涵盖响应检查和特定于提供商的设置后,剩余的问题主要集中在端点、OpenAI SDK 兼容性以及查找当前 TTS 模型上。

常见问题解答

OpenRouter 是否提供文本转语音功能?

是的。向 https://openrouter.ai/api/v1/audio/speech 发送 POST 请求,包含模型、文本输入以及该模型支持的声音。我们将返回所选模型支持的原始音频字节。

OpenRouter TTS 是否与 OpenAI SDK 兼容?

是的。将 SDK 的基础 URL 设置为 https://openrouter.ai/api/v1 并使用您的 OpenRouter API 密钥。模型 ID、声音 ID 和特定于提供商的控制必须与您选择的模型相匹配。

我如何使用文本转语音 API?

向 https://openrouter.ai/api/v1/audio/speech 发送经过身份验证的 POST 请求,包含 model、input 和 voice。设置受支持的 response_format,检查 HTTP 状态码和内容类型,然后将返回的音频字节写入文件或传递给兼容的播放器。

OpenAI API 中的 TTS 是什么?

文本转语音通过 Audio Speech API 将文本输入转换为生成的音频。我们使用相同的请求结构,因此 OpenAI SDK 客户端在更改基础 URL 并提供 OpenRouter API 密钥后,可以调用受支持的 OpenRouter TTS 模型。

我如何查找当前的 OpenRouter TTS 模型?

请求 GET /api/v1/models?output_modalities=speech 或浏览文本转语音合集。使用模型页面确认支持的声音和当前定价。

这些工作流中的端点、身份验证和响应检查保持一致。特定于模型的语音、格式和控制是您在进行每次集成或比较前需要确认的值。

通过 OpenRouter 生成语音

在已配置好端点、模型、声音以及响应检查的情况下,您可以通过 cURL、Python、JavaScript 或 OpenAI SDK 生成可播放的音频文件。请求结构在 TTS 模型之间保持一致,而每个模型则决定可用的声音、格式和提供商控制。

准备好生成第一个文件时,请创建 API 密钥。在比较模型或为生产环境准备集成时,请浏览我们的文本转语音模型合集和 TTS 参考文档。

原文链接:https://openrouter.ai/blog/tutorials/text-to-speech/
来源:OpenRouter
以上内容由 AI 自动翻译,仅供参考。
← 返回简报