
2025旅行api集成指南:顶级技巧与api推荐
仅仅一周后,OpenAI 推出了强大的实时 API,为希望集成高级语音功能的应用程序提供了全新的可能性。我利用了 10 月 2 日的假期,尝试使用这一新特性,并记录下了整个过程的学习成果。本文将分享如何从一个简单的示例开始,逐步构建支持语音的 Python FastAPI 应用程序,并最终实现语音播放功能。
在将实时 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 连接的主要逻辑:
辅助函数的核心功能包括:
session.update
对象的 tools
属性中。conversation.item.create
对象,并通过 response.create
事件触发响应。以下是一个解析响应事件的示例代码:
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 应用中。我在 WebSocket 服务器中设置了一个路由,允许用户连接以发送和接收语音消息。
FastAPI 的 WebSocket API 非常适合此场景,因为其对象(如 WebSocket
)是 JSON 可序列化的,并且可以直接用于路由。
以下是实现的关键步骤:
_receive_from_client
函数期望的格式发送。通过以上步骤,您可以构建一个支持语音的 Python FastAPI 应用程序,并实现与 OpenAI 实时 API 的交互。虽然目前实时 API 的成本较高,但其强大的功能为语音应用开发提供了无限可能。
如果您对本文介绍的功能感兴趣,可以访问 mahilo 项目 GitHub 仓库 查看完整代码。希望本文能为您的开发提供帮助,祝您编码愉快!
原文链接: https://medium.com/thedeephub/building-a-voice-enabled-python-fastapi-app-using-openais-realtime-api-bfdf2947c3e4