所有文章 > 如何集成API > 使用OpenAI构建支持语音的Python FastAPI应用...
使用OpenAI构建支持语音的Python FastAPI应用...

使用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.createdconventions.created 响应这些事件。

响应事件

服务器通过语音活动检测(VAD)处理传入的音频,并在语音结束时生成响应。如果通过客户端 API 手动创建会话项,则需要通过 response.create 事件触发服务器响应。

以下是常见的响应事件类型:

  • response.created:通知响应开始生成。
  • response.text.delta:文本响应的一部分。
  • response.text.done:完整文本响应已生成。
  • response.audio.delta:音频响应的一部分,包含 Base64 编码的音频数据。
  • response.audio.done:音频生成完成。

构建支持语音的 WebSocket 应用

为了实现实时语音交互,我将应用程序分为两部分:

  1. WebSocket 连接代码:用于与 OpenAI WebSocket 建立连接并发送、接收请求。
  2. 辅助函数:用于发送会话更新和处理消息。

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 可序列化的,并且可以直接用于路由。

以下是实现的关键步骤:

  1. 从终端录制音频,并以 _receive_from_client 函数期望的格式发送。
  2. 播放从 OpenAI 接收到的音频。
  3. 确保以非阻塞方式处理音频,以避免中断其他 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文章!

我们有何不同?

API服务商零注册

多API并行试用

数据驱动选型,提升决策效率

查看全部API→
🔥

热门场景实测,选对API

#AI文本生成大模型API

对比大模型API的内容创意新颖性、情感共鸣力、商业转化潜力

25个渠道
一键对比试用API 限时免费

#AI深度推理大模型API

对比大模型API的逻辑推理准确性、分析深度、可视化建议合理性

10个渠道
一键对比试用API 限时免费