Skip to content

OpenRouter 支持音频输入和音频输出两种模式。音频输入:使用 input_audio content type,将音频文件 base64 编码后通过 chat completions API 发送,支持 wav、mp3、aiff、aac、ogg、flac、m4a、pcm16、pcm24 等格式。音频输出:在请求中设置 modalities: ["text", "audio"],配置 audio.voiceaudio.format必须开启 streaming,音频数据和文字稿通过 SSE 流中 delta.audio.datadelta.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 支持的格式不同,常见格式包括:

格式说明
wavWAV 音频
mp3MP3 音频
aiffAIFF 音频
aacAAC 音频
oggOGG Vorbis 音频
flacFLAC 无损音频
m4aM4A 音频
pcm16PCM16 原始音频
pcm24PCM24 原始音频

使用前请确认所选模型支持该格式。

音频输出

从支持音频输出的模型接收语音响应。在请求中设置 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语音音色,如 alloyechofableonyxnovashimmer,可用音色因模型而异
format输出格式,如 wavmp3flacopuspcm16,可用格式因模型而异

常见问题

Q: 音频输出为什么必须用 streaming?

A: 音频数据量大,非 streaming 模式的响应体很容易超时。Streaming 模式下音频和文字稿以 chunk 形式实时传输,既降低首字节延迟,也避免请求超时。

Q: 可以只获取音频不获取文字稿吗?

A: 可以,只需在处理 chunk 时忽略 delta.audio.transcript 字段。但模型通常会同时生成两者,设置 modalities: ["audio"](不含 text)会让模型只生成音频,无文字稿。

Q: 怎么知道模型支持哪些 voice 选项?

A: 在 OpenRouter 的 Models 页面 筛选支持音频输出的模型后,查看对应模型的详情页;也可以查阅该模型的官方文档获取可用 voice 列表。