音频模型可以理解语音输入、生成语音输出,或在同一交互中同时完成这两项操作。本指南解释了 OpenAI 音频文档中使用的词汇。当您准备好选择实现路径时,请从 实时与音频概述.
音频模态
音频应用组合了以下一个或多个模态:
| 模态 | 含义 | 常见用例 |
|---|---|---|
| 音频输入 | 模型接收来自用户或应用的声音。 | 语音代理、转录、翻译。 |
| 音频输出 | 模型或 API 返回语音音频。 | 语音代理、文本转语音、语音响应。 |
| 文本转录 | 语音转为文本。 | 字幕、通话分析、搜索、记录。 |
| 文本提示 | 文本控制模型说什么或做什么。 | 语音生成、脚本化语音流程、提示词。 |
常见语音任务
语音转文本 将语音转换为文本。可用于字幕、笔记、转录、分析、搜索和无障碍访问。转录可以是基于请求的文件转录,也可以是针对实时音频的流式转录。
文本转语音 将文本转换为语音音频。可用于旁白、助手、无障碍访问和生成的语音响应。语音生成可以在模型生成音频时流式传回音频。
语音转语音 允许模型在一个低延迟会话中聆听、推理和说话。当助手需要做出响应、调用工具或维护会话状态时,可用于构建会话式语音代理。
语音翻译 聆听一种语言的语音,并返回另一种语言的翻译语音或转录输出。当翻译需要在音频到达时连续不断地开始时,请使用专用的实时翻译会话。
流式传输与延迟
流式传输意味着客户端和服务在交互仍处于活动状态时交换部分输入或输出。当用户期望获得即时反馈(如实时字幕、通话、语音代理和翻译)时,流式传输非常有用。
较低的延迟需要实时连接、更精细的音频处理,以及能够发出部分事件的会话模型。基于请求的 API 更适合文件上传和非交互式工作,但它们不支持相同的实时交互模式。
基于请求的 API 与实时会话
OpenAI 支持两大类音频架构:
| 架构 | 适用场景 | 示例 |
|---|---|---|
| 基于请求的音频 API | 您拥有文件、文本输入或有边界的请求。 | 语音转文本, 文本转语音. |
| 实时会话 | 音频是实时的,且应用需要低延迟事件。 | 语音智能体, 翻译, 转录. |
| 多模态聊天补全 | 您正在使用音频扩展现有的聊天流程。 | 音频输入或输出. |
有关构建路径的指导,请参阅 实时与音频概述.
为现有应用添加音频
诸如 gpt-realtime-2 and gpt-audio-1.5 之类的模型是原生多模态的,这意味着它们能够将音频和文本作为输入和输出进行理解和生成。
对于浏览器实时的语音转语音交互,请从 JavaScript SDK 中的实时会话开始:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { RealtimeAgent, RealtimeSession } from "@openai/agents/realtime";
const agent = new RealtimeAgent({
name: "Assistant",
instructions: "You are a helpful voice assistant.",
});
const session = new RealtimeSession(agent, {
model: "gpt-realtime-2",
});
await session.connect({
apiKey: "ek_...(ephemeral key from your server)",
});此示例使用 JavaScript,因为浏览器语音代理通过客户端的 WebRTC 进行连接。对于 Python 语音工作流,请使用 语音代理指南,涵盖链式语音管道。
如果您已经有一个基于文本并使用 Chat Completions 端点,您可能需要添加音频功能。例如,如果您的聊天应用程序支持文本输入,您可以添加音频输入和输出:包括 audio in the modalities 数组,并使用音频模型,例如 gpt-audio-1.5.
The Responses API 文档目前描述的是带有文本输出的文本和图像输入。对于这种音频聊天模式,请将 Chat Completions 与支持音频的模型结合使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import { writeFileSync } from "node:fs";
import OpenAI from "openai";
const openai = new OpenAI();
// Generate an audio response to the given prompt
const response = await openai.chat.completions.create({
model: "gpt-audio-1.5",
modalities: ["text", "audio"],
audio: { voice: "alloy", format: "wav" },
messages: [
{
role: "user",
content: "Is a golden retriever a good family dog?"
}
],
store: true,
});
// Inspect returned data
console.log(response.choices[0]);
// Write audio data to a file
writeFileSync(
"dog.wav",
Buffer.from(response.choices[0].message.audio.data, 'base64'),
{ encoding: "utf-8" }
);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import OpenAI from "openai";
const openai = new OpenAI();
// Fetch an audio file and convert it to a base64 string
const url = "https://cdn.openai.com/API/docs/audio/alloy.wav";
const audioResponse = await fetch(url);
const buffer = await audioResponse.arrayBuffer();
const base64str = Buffer.from(buffer).toString("base64");
const response = await openai.chat.completions.create({
model: "gpt-audio-1.5",
modalities: ["text", "audio"],
audio: { voice: "alloy", format: "wav" },
messages: [
{
role: "user",
content: [
{ type: "text", text: "What is in this recording?" },
{ type: "input_audio", input_audio: { data: base64str, format: "wav" }}
]
}
],
store: true,
});
console.log(response.choices[0]);