使用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_transcriptionmax_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
最新文章
- 把 C# 里的 HttpClient 封装起来,告别复杂的配置,让 Restful API 调用更轻松更高效
- 释放Spring Boot API中数字签名的强大功能
- 如何使用ChatGPT JavaScript API,3个简单步骤
- 如何通过 SEO rank API 进行竞争对手分析
- PromptPay二维码支付是什么?
- 实时航班追踪背后的技术:在线飞机追踪器的工作原理
- DeepSpeed-Chat 模型与数据
- API审核的核心概念是什么
- OWASP API安全十大风险简介 – Graylog
- 使用Gateway API访问Kafka – Strimzi
- 如何测试实时视频流API性能 – FastPix
- 如何用 OpenAPI 在 Express 中构建更好的 API