音频与语音
探索 OpenAI API 中的音频和语音功能。
构建音频应用
| 功能 | 描述 |
|---|---|
| 构建语音代理 | 构建交互式语音驱动的应用程序。 |
| 音频转录 | 即时准确地将语音转换为文本。 |
| 文本朗读 | 实时将文本转换为自然语音。 |
音频应用场景概览
大型语言模型(LLM)可以通过以下方式处理音频:
- 将音频作为输入
- 生成音频作为输出
- 同时进行输入和输出
OpenAI 提供多个 API 端点,帮助您构建音频应用程序或语音代理。
语音代理
语音代理能够理解音频以执行任务,并以自然语言进行响应。主要有两种构建方式:
- 使用语音到语音模型和 实时 API
- 将语音转文本模型、文本语言模型和文本转语音模型链接起来
语音到语音方式延迟更低且更自然,但链接方式是将基于文本的代理扩展为语音代理的可靠方法。如果您已经在使用 Agents SDK,可以通过链接方式为现有代理添加语音功能。
流式音频
实时处理音频,构建语音代理和其他低延迟应用程序,包括转录用例。您可以通过 实时 API 流式传输音频输入和输出。我们的高级语音模型提供自动语音识别,以提高准确性、低延迟交互和多语言支持。
文本转语音
将文本转换为语音,请使用 Audio API 的 audio/speech 端点。支持的模型有 gpt-4o-mini-tts、tts-1 和 tts-1-hd。使用 gpt-4o-mini-tts,您可以要求模型以特定方式或语气朗读。
语音转文本
将语音转换为文本,请使用 Audio API 的 audio/transcriptions 端点。支持的模型有 gpt-4o-transcribe、gpt-4o-mini-transcribe 和 whisper-1。通过流式传输,您可以连续传入音频并获得连续的文本流。
选择正确的 API
有多个 API 可用于转录或生成音频:
| API | 支持的模态 | 流式支持 |
|---|---|---|
| 实时 API | 音频和文本输入和输出 | 音频流式输入和输出 |
| 聊天补全 API | 音频和文本输入和输出 | 音频流式输出 |
| 转录 API | 音频输入 | 音频流式输出 |
| 语音 API | 文本输入和音频输出 | 音频流式输出 |
通用 API 与专用 API
主要区别在于通用 API 与专用 API。使用实时 API 和聊天补全 API,您可以利用我们最新模型的原生音频理解和生成功能,并将其与其他功能(如函数调用)结合使用。这些 API 可用于广泛的用例,您可以选择要使用的模型。
另一方面,转录、翻译和语音 API 是为特定模型和单一目的而设计的。
与模型对话与控制脚本
选择正确的 API 的另一种方式是考虑您需要多少控制权。要设计对话交互,让模型以语音思考和响应,请使用实时 API 或聊天补全 API,具体取决于是否需要低延迟。
您无法事先准确知道模型会说什么,因为它会直接生成音频响应,但对话会感到自然。
如果需要更多控制和可预测性,可以使用语音转文本/LLM/文本转语音模式,这样您就能准确知道模型会说什么并控制响应。请注意,这种方法会增加延迟。
推荐
- 如果需要实时交互或实时转录,请使用实时 API。
- 如果实时不是必须条件,但您希望构建语音代理或需要函数调用等功能的音频应用程序,请使用聊天补全 API。
- 对于单一目的的用例,请使用转录、翻译或语音 API。
为现有应用程序添加音频
GPT-4o 或 GPT-4o mini 等模型是原生多模态的,这意味着它们可以理解和生成多种模态的输入和输出。
如果您已经使用聊天补全端点构建了基于文本的 LLM 应用程序,您可能希望添加音频功能。例如,如果您的聊天应用程序支持文本输入,您可以添加音频输入和输出——只需在 modalities 数组中包含 audio,并使用音频模型,如 gpt-4o-audio-preview。
注意:音频尚不支持在响应 API 中使用。
从模型获取音频输出
创建类似人类的音频响应
curl "https://api.openai.com/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4o-audio-preview",
"modalities": ["text", "audio"],
"audio": { "voice": "alloy", "format": "wav" },
"messages": [
{
"role": "user",
"content": "金毛猎犬是否是好的家庭犬?"
}
]
}'
Node.js 示例:
import { writeFileSync } from "node:fs";
import OpenAI from "openai";
const openai = new OpenAI();
// 生成对给定提示的音频响应
const response = await openai.chat.completions.create({
model: "gpt-4o-audio-preview",
modalities: ["text", "audio"],
audio: { voice: "alloy", format: "wav" },
messages: [
{
role: "user",
content: "金毛猎犬是否是好的家庭犬?"
}
],
store: true
});
// 检查返回的数据
console.log(response.choices[0]);
// 将音频数据写入文件
writeFileSync(
"dog.wav",
Buffer.from(response.choices[0].message.audio.data, 'base64'),
{ encoding: "utf-8" }
);
Python 示例:
import base64
from openai import OpenAI
client = OpenAI()
completion = client.chat.completions.create(
model="gpt-4o-audio-preview",
modalities=["text", "audio"],
audio={"voice": "alloy", "format": "wav"},
messages=[
{
"role": "user",
"content": "金毛猎犬是否是好的家庭犬?"
}
]
)
print(completion.choices[0])
wav_bytes = base64.b64decode(completion.choices[0].message.audio.data)
with open("dog.wav", "wb") as f:
f.write(wav_bytes)
将音频作为输入提示模型
使用音频输入提示模型
curl "https://api.openai.com/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4o-audio-preview",
"modalities": ["text", "audio"],
"audio": { "voice": "alloy", "format": "wav" },
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "这段录音里是什么?" },
{
"type": "input_audio",
"input_audio": {
"data": "<base64 bytes here>",
"format": "wav"
}
}
]
}
]
}'
Node.js 示例:
import OpenAI from "openai";
const openai = new OpenAI();
// 获取音频文件并将其转换为 base64 字符串
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-4o-audio-preview",
modalities: ["text", "audio"],
audio: { voice: "alloy", format: "wav" },
messages: [
{
role: "user",
content: [
{ type: "text", text: "这段录音里是什么?" },
{ type: "input_audio", input_audio: { data: base64str, format: "wav" } }
]
}
],
store: true
});
console.log(response.choices[0]);
Python 示例:
import base64
import requests
from openai import OpenAI
client = OpenAI()
# 获取音频文件并将其转换为 base64 编码字符串
url = "https://cdn.openai.com/API/docs/audio/alloy.wav"
response = requests.get(url)
response.raise_for_status()
wav_data = response.content
encoded_string = base64.b64encode(wav_data).decode('utf-8')
completion = client.chat.completions.create(
model="gpt-4o-audio-preview",
modalities=["text", "audio"],
audio={"voice": "alloy", "format": "wav"},
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "这段录音里是什么?"
},
{
"type": "input_audio",
"input_audio": {
"data": encoded_string,
"format": "wav"
}
}
]
},
]
)
print(completion.choices[0].message)