音频模型可以理解语音输入、生成语音输出,或在同一次交互中同时完成这两项任务。本指南解释了 OpenAI 音频文档中使用的词汇。当您准备好选择实现路径时,请从实时与音频概览开始。
音频模态
音频应用结合了以下一种或多种模态
| 模态 | 含义 | 常见使用场景 |
|---|---|---|
| 音频输入 | 模型接收来自用户或应用的音频。 | 语音智能体、转录、翻译。 |
| 音频输出 | 模型或 API 返回语音音频。 | 语音智能体、文本转语音、语音回复。 |
| 文本转录 | 语音转换为文本。 | 字幕、通话分析、搜索、记录。 |
| 文本提示词 | 文本控制模型的说话内容或行为。 | 语音生成、脚本化语音流、提示词。 |
常用语音任务
语音转文本将语音转换为文本。可用于字幕、笔记、转录、分析、搜索和辅助功能。转录可以是针对文件的基于请求的转录,也可以是针对实时音频的流式转录。
文本转语音将文本转换为语音音频。可用于旁白、助手、辅助功能和生成的语音回复。语音生成可以在模型产生音频时以流式方式传回音频。
语音转语音允许模型在单个低延迟会话中进行倾听、推理和说话。当助手需要做出回应、调用工具或维护会话状态时,可将其用于对话式语音智能体。
语音翻译倾听一种语言的语音,并返回另一种语言的翻译语音或转录输出。当翻译需要随着音频到达而持续开始时,请使用专用的实时翻译会话。
流式传输与延迟
流式传输意味着客户端和服务在交互仍在进行时交换部分输入或输出。当用户期望即时反馈(如实时字幕、通话、语音智能体和翻译)时,流式传输非常有用。
较低的延迟需要实时连接、更精细的音频处理以及能够发出部分事件的会话模型。基于请求的 API 对于文件上传和非交互式工作更简单,但它们不支持同样的实时交互模式。
基于请求的 API 与实时会话
OpenAI 支持两种广泛的音频架构
| 架构 | 使用场景 | 示例 |
|---|---|---|
| 基于请求的音频 API | 您有一个文件、一个文本输入或一个有界请求。 | 语音转文本、文本转语音。 |
| 实时会话 | 音频是实时的,且应用需要低延迟事件。 | 语音智能体、翻译、转录。 |
| 多模态聊天完成 (Chat Completions) | 您正在使用音频扩展现有的聊天流。 | 音频输入或输出. |
有关构建路径的指南,请参阅实时与音频概览。
将音频添加到现有应用
诸如 gpt-realtime-2 和 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 端点 的文本大语言模型应用,您可能想要添加音频功能。例如,如果您的聊天应用支持文本输入,您可以添加音频输入和输出:在 modalities 数组中包含 audio,并使用音频模型,例如 gpt-audio-1.5。
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]);