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"可查看支持的模型。

发送音频文件

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 形式增量返回。

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 字段携带音频数据和文字稿:

{
  "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 列表。