如何使用 Twilio 和 OpenAI 构建实时语音助手

更新时间:2024/11/17, 22:00

语音助手正在改变人们与技术交互的方式,通过人工智能实现无缝实时通信。借助 Twilio 的电话基础设施和 OpenAI 的生成式模型,您可以轻松创建一个处理动态对话的语音助手。以下是实现过程的完整指南,并包括详细的代码示例和功能说明。


项目概述

使用 Twilio 和 OpenAI 构建的实时语音助手可以实现以下功能:

  • 处理实时语音输入,并生成动态语音响应。
  • 使用 OpenAI 的 检索增强生成(RAG) 提供上下文感知的答案。
  • 通过模拟或集成真实服务扩展应用场景,例如订单查询、库存检查等。

您可以在 GitHub 仓库 中找到完整代码。


实时交互流程

  1. 用户发起电话呼叫,Twilio 处理呼叫并将音频路由到服务器。
  2. 服务器通过 WebSocket 将语音输入流式传输到 OpenAI 实时 API。
  3. OpenAI 分析输入并生成语音响应。
  4. Twilio 将生成的语音返回给用户,完成互动。


先决条件

  • Twilio 帐户:用于接收和处理电话。
  • OpenAI API 密钥:用于调用实时模型。
  • Python 3.x:项目开发环境。
  • ngrok:用于本地开发时暴露 Webhook。

项目设置

1. 克隆项目并安装依赖

克隆项目并安装所需库:

git clone https://github.com/ericrisco/twilio-realtime-openai-rag
cd twilio-realtime-openai-rag
pip install -r requirements.txt

2. 配置环境变量

创建 .env 文件,存储您的 API 密钥和配置:

VOICE='echo'
OPENAI_API_KEY='your_openai_api_key'
WEBSOCKET_URL='https://your-ngrok-url'
PORT=5000

3. 配置 Twilio 电话号码

  1. 登录 Twilio 控制台
  2. 购买一个支持语音的电话号码。
  3. 配置该号码的 Webhook,将其指向您的服务器 /stream/incoming-call 路由。
WEBSOCKET_URL='https://your-ngrok-url/stream/incoming-call'

4. 启动服务器

运行应用程序:

python app.py

在开发环境中,使用 ngrok 将本地服务器暴露到公网:

ngrok http 5000

代码结构和功能

1. app.py

主应用入口,使用 FastAPI 配置路由和 WebSocket 服务。

from fastapi import FastAPI, WebSocket
import uvicorn

app = FastAPI()

# WebSocket 路由,用于接收 Twilio 和 OpenAI 的实时音频流
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        # 处理实时输入
        response = await process_audio_input(data)
        await websocket.send_text(response)

# 启动服务器
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=5000)

2. stream.py

管理 Twilio 与 OpenAI API 的 WebSocket 实时流。

import websockets
import asyncio

async def handle_stream(audio_stream):
    async with websockets.connect("wss://api.openai.com/audio-stream") as websocket:
        await websocket.send(audio_stream)
        response = await websocket.recv()
        return response

3. 辅助工具

模拟数据(JSON 数据库)

模拟产品库存和订单状态,用于演示或开发:

data.json 示例:

{
    "products": [
        {"id": 1, "name": "Product A", "stock": 100},
        {"id": 2, "name": "Product B", "stock": 50}
    ],
    "orders": [
        {"order_id": "12345", "status": "Shipped"}
    ]
}

读取模拟数据的工具

import json

def read_data(file_path):
    with open(file_path, 'r') as f:
        return json.load(f)

4. 调用 OpenAI API

通过 WebSocket 与 OpenAI 实时 API 通信:

import websockets
import json
import os

OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

async def openai_real_time(audio_input):
    async with websockets.connect("wss://api.openai.com/v1/real-time-audio") as ws:
        headers = {
            "Authorization": f"Bearer {OPENAI_API_KEY}",
            "Content-Type": "application/json"
        }
        await ws.send(json.dumps({"audio": audio_input, "headers": headers}))
        response = await ws.recv()
        return json.loads(response)

运行和测试语音助手

1. 拨打 Twilio 电话

配置好的 Twilio 号码接收呼叫时,将音频流发送到服务器的 WebSocket 路由。

2. 实时语音交互

Twilio 将用户语音输入流式传输到服务器,OpenAI 实时生成语音响应,Twilio 返回给用户。

3. 运行语音助手

完成配置后,拨打 Twilio 号码即可开始测试语音助手。例如,您可以询问:

  • “请告诉我我的订单状态。”
  • “某某产品还有库存吗?”

助手会实时处理请求,调用虚拟数据库或实际服务生成响应。


扩展功能

1. 集成真实服务

将模拟的 JSON 数据库替换为真实服务,例如 CRM 或库存管理系统。

def check_real_stock(product_id):
    # 调用实际库存系统 API
    return {"stock": 20}

2. 增强用户体验

  • 多语言支持:结合 OpenAI 的翻译模型实现实时翻译。
  • 自然语音增强:使用 OpenAI 的更高版本模型,生成更自然的语音响应。

3. 生产部署建议

  • 容器化应用:使用 Docker 部署到云服务(如 AWS 或 GCP)。
  • 增强安全性:在生产环境中启用 HTTPS,并实现身份验证机制。

结论

通过 Twilio 和 OpenAI,您可以轻松构建一个功能强大的实时语音助手。本项目不仅提供了实时语音交互的基础,还支持进一步扩展,实现更多高级功能。无论是用于客户支持还是复杂查询处理,这种语音助手都能显著提升用户体验。

更多细节请访问项目 GitHub 仓库

AI奇想空间
AI奇想空间
https://aimazing.site
AI 奇想空间是一个汇聚人工智能工具、资源和教程的导航网站。 在这里,你可以发现最新的AI技术、工具和应用,学习如何使用各种 AI 平台和框架,获取丰富的 AI 资源。 欢迎广大 AI 爱好者加入我们的社区,开启你的AI之旅!
AI交流群
Copyright © 2024 AI奇想空间.微信