使用OpenAI构建支持语音的Python FastAPI应用...
仅仅一周后,OpenAI 推出了强大的实时 API,为希望集成高级语音功能的应用程序提供了全新的可能性。我利用了 10 月 2 日的假期,尝试使用这一新特性,并记录下了整个过程的学习成果。本文将分享如何从一个简单的示例开始,逐步构建支持语音的 Python FastAPI 应用程序,并最终实现语音播放功能。
了解 OpenAI 实时 API 的事件类型
在将实时 API 集成到应用程序之前,了解 API 支持的事件类型至关重要。以下是与本文示例相关的主要事件类型,完整列表可以参考 OpenAI API 文档。
会话事件
会话事件表示客户端与服务器的整个交互过程,允许设置和更新对话中的参数。以下是一个会话对象的示例:
{
"session_id": "example_session",
"parameters": {
"voice": "en-US",
"input_format": "audio",
"output_format": "text",
"instructions": "Translate to English",
"tools": []
}
}
通过 session.update
事件将上述 JSON 对象发送到实时 API,可以设置默认参数,例如语音类型、输入输出格式和可用工具等。然而,在使用过程中,我发现以下两个属性会导致调用失败:
input_audio_transcription
max_output_tokens
建议在调用前移除这些属性,以避免会话调用失败。
对话事件
对话事件用于管理客户端与服务器之间的通信。最常用的事件是 conversation.item.create
,它可以向对话中添加新项目。例如:
- 用户消息
- 助理消息
- 系统提示
- 模拟函数调用的
function_call
项目 - 通知工具调用结果的
function_call_output
项目
服务器会通过 conversation.item.created
或 conventions.created
响应这些事件。
响应事件
服务器通过语音活动检测(VAD)处理传入的音频,并在语音结束时生成响应。如果通过客户端 API 手动创建会话项,则需要通过 response.create
事件触发服务器响应。
以下是常见的响应事件类型:
response.created
:通知响应开始生成。response.text.delta
:文本响应的一部分。response.text.done
:完整文本响应已生成。response.audio.delta
:音频响应的一部分,包含 Base64 编码的音频数据。response.audio.done
:音频生成完成。
构建支持语音的 WebSocket 应用
为了实现实时语音交互,我将应用程序分为两部分:
- WebSocket 连接代码:用于与 OpenAI WebSocket 建立连接并发送、接收请求。
- 辅助函数:用于发送会话更新和处理消息。
WebSocket 连接代码
以下是 WebSocket 连接的主要逻辑:
- 定义 OpenAI 实时 API 的 WebSocket URL(支持 Azure 和 OpenAI 端点)。
- 在开始对话前发送会话更新,包含 API 所需的工具配置。
- 监听客户端事件,并将其转发到 OpenAI 服务器。
辅助函数
辅助函数的核心功能包括:
- 定义工具:工具的 JSON 结构与聊天完成 API 略有不同,需要插入到
session.update
对象的tools
属性中。 - 发送用户消息:创建
conversation.item.create
对象,并通过response.create
事件触发响应。 - 解析 OpenAI 输出:根据响应事件类型执行相应操作,例如解码音频增量或处理函数调用。
以下是一个解析响应事件的示例代码:
async def _send_to_client(self, websocket: WebSocket, openai_ws: WebSocketClientProtocol) -> None:
...
audio_payload = base64.b64encode(base64.b64decode(response['delta'])).decode('utf-8')
audio_delta = {
"event": "media",
"media": {
"payload": audio_payload
}
}
# 将音频增量发送到客户端
await websocket.send_json(audio_delta)
...
集成到 FastAPI 应用
在完成上述功能后,可以将其集成到 FastAPI 应用中。我在 WebSocket 服务器中设置了一个路由,允许用户连接以发送和接收语音消息。
FastAPI 的 WebSocket API 非常适合此场景,因为其对象(如 WebSocket
)是 JSON 可序列化的,并且可以直接用于路由。
以下是实现的关键步骤:
- 从终端录制音频,并以
_receive_from_client
函数期望的格式发送。 - 播放从 OpenAI 接收到的音频。
- 确保以非阻塞方式处理音频,以避免中断其他 WebSocket 连接。
总结
通过以上步骤,您可以构建一个支持语音的 Python FastAPI 应用程序,并实现与 OpenAI 实时 API 的交互。虽然目前实时 API 的成本较高,但其强大的功能为语音应用开发提供了无限可能。
如果您对本文介绍的功能感兴趣,可以访问 mahilo 项目 GitHub 仓库 查看完整代码。希望本文能为您的开发提供帮助,祝您编码愉快!
原文链接: https://medium.com/thedeephub/building-a-voice-enabled-python-fastapi-app-using-openais-realtime-api-bfdf2947c3e4
热门API
- 1. AI文本生成
- 2. AI图片生成_文生图
- 3. AI图片生成_图生图
- 4. AI图像编辑
- 5. AI视频生成_文生视频
- 6. AI视频生成_图生视频
- 7. AI语音合成_文生语音
- 8. AI文本生成(中国)
最新文章
- 使用Python进行API调用:面向开发人员的分步指南
- Go工程化(五) API 设计下: 基于 protobuf 自动生成 gin 代码
- Python调用股票API获取实时数据
- API在量子计算中的作用
- API请求 – 什么是API请求?
- 给初学者的RESTful API 安全设计指南!
- 如何在 Facebook Developers 上设置 WhatsApp Cloud API
- 支付网关API如何支持小型企业?
- Python调用免费翻译API实现Excel文件批量翻译
- 为开源项目 go-gin-api 增加 WebSocket 模块
- AI编程的风险,如何毁掉你的 API?
- 使用预约调度API的运输管理