Appearance
OpenRouter 支持音频输入和音频输出两种模式。音频输入:使用 input_audio content type,将音频文件 base64 编码后通过 chat completions API 发送,支持 wav、mp3、aiff、aac、ogg、flac、m4a、pcm16、pcm24 等格式。音频输出:在请求中设置 modalities: ["text", "audio"],配置 audio.voice 和 audio.format,必须开启 streaming,音频数据和文字稿通过 SSE 流中 delta.audio.data 和 delta.audio.transcript 字段增量返回。
OpenRouter 支持向兼容模型发送音频文件,以及从具备音频输出能力的模型接收语音响应。
音频输入
将音频文件发送给模型进行转录、分析和处理。使用 /api/v1/chat/completions API,content type 为 input_audio。音频文件必须 base64 编码,不支持直接传 URL。
在 Models 页面 过滤"audio input modality"可查看支持的模型。
发送音频文件
typescript
import { OpenRouter } from '@openrouter/sdk';
import fs from "fs/promises";
const openRouter = new OpenRouter({
apiKey: '<OPENROUTER_API_KEY>',
});
async function encodeAudioToBase64(audioPath: string): Promise<string> {
const audioBuffer = await fs.readFile(audioPath);
return audioBuffer.toString("base64");
}
const base64Audio = await encodeAudioToBase64("path/to/your/audio.wav");
const result = await openRouter.chat.send({
model: "openai/gpt-4o-audio-preview",
messages: [
{
role: "user",
content: [
{
type: "text",
text: "Please transcribe this audio file.",
},
{
type: "input_audio",
inputAudio: {
data: base64Audio,
format: "wav",
},
},
],
},
],
stream: false,
});
console.log(result);支持的音频输入格式
各 provider 支持的格式不同,常见格式包括:
| 格式 | 说明 |
|---|---|
wav | WAV 音频 |
mp3 | MP3 音频 |
aiff | AIFF 音频 |
aac | AAC 音频 |
ogg | OGG Vorbis 音频 |
flac | FLAC 无损音频 |
m4a | M4A 音频 |
pcm16 | PCM16 原始音频 |
pcm24 | PCM24 原始音频 |
使用前请确认所选模型支持该格式。
音频输出
从支持音频输出的模型接收语音响应。在请求中设置 modalities: ["text", "audio"] 和 audio 配置。
在 Models 页面 过滤"audio output modality"可查看支持的模型。
请求音频输出
注意:音频输出必须开启 streaming(
stream: true),音频数据以 SSE chunk 形式增量返回。
python
import requests
import json
import base64
url = "https://openrouter.ai/api/v1/chat/completions"
headers = {
"Authorization": f"Bearer {OPENROUTER_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "openai/gpt-4o-audio-preview",
"messages": [
{
"role": "user",
"content": "Say hello in a friendly tone."
}
],
"modalities": ["text", "audio"],
"audio": {
"voice": "alloy",
"format": "wav"
},
"stream": True
}
response = requests.post(url, headers=headers, json=payload, stream=True)
audio_data_chunks = []
transcript_chunks = []
for line in response.iter_lines():
if not line:
continue
decoded = line.decode("utf-8")
if not decoded.startswith("data: "):
continue
data = decoded[len("data: "):]
if data.strip() == "[DONE]":
break
chunk = json.loads(data)
delta = chunk["choices"][0].get("delta", {})
audio = delta.get("audio", {})
if audio.get("data"):
audio_data_chunks.append(audio["data"])
if audio.get("transcript"):
transcript_chunks.append(audio["transcript"])
transcript = "".join(transcript_chunks)
print(f"Transcript: {transcript}")
# 拼接并解码 base64 音频数据
full_audio_b64 = "".join(audio_data_chunks)
audio_bytes = base64.b64decode(full_audio_b64)
with open("output.wav", "wb") as f:
f.write(audio_bytes)Streaming Chunk 格式
每个 SSE chunk 的 delta.audio 字段携带音频数据和文字稿:
json
{
"choices": [
{
"delta": {
"audio": {
"data": "<base64-encoded audio chunk>",
"transcript": "Hello"
}
}
}
]
}音频配置参数
audio 对象支持以下参数:
| 参数 | 说明 |
|---|---|
voice | 语音音色,如 alloy、echo、fable、onyx、nova、shimmer,可用音色因模型而异 |
format | 输出格式,如 wav、mp3、flac、opus、pcm16,可用格式因模型而异 |
常见问题
Q: 音频输出为什么必须用 streaming?
A: 音频数据量大,非 streaming 模式的响应体很容易超时。Streaming 模式下音频和文字稿以 chunk 形式实时传输,既降低首字节延迟,也避免请求超时。
Q: 可以只获取音频不获取文字稿吗?
A: 可以,只需在处理 chunk 时忽略 delta.audio.transcript 字段。但模型通常会同时生成两者,设置 modalities: ["audio"](不含 text)会让模型只生成音频,无文字稿。
Q: 怎么知道模型支持哪些 voice 选项?
A: 在 OpenRouter 的 Models 页面 筛选支持音频输出的模型后,查看对应模型的详情页;也可以查阅该模型的官方文档获取可用 voice 列表。