基于Twilio的AI呼叫机器人实时获取通话对象语音的技术方案咨询
实现Twilio实时获取通话接收方语音响应的方案
核心方案:Twilio Media Streams
Twilio的Media Streams可以实时将通话中的音频数据以WebSocket形式推送到你的服务器,你能在服务器端解析音频流、区分接收方(被叫)的语音内容,进而完成实时处理(比如转文本、生成AI回复)。
为什么Gather/Record不适用?
- Gather需要用户按键或完整说完后才返回结果,无法实现实时获取
- Record是录制完整片段或整个通话,不能实时拆分出接收方的语音
Python实现示例
1. 搭建WebSocket服务器接收媒体流
使用websockets库处理Twilio的WebSocket连接,解析音频帧并区分语音方向:
import asyncio import websockets import json async def handle_twilio_stream(websocket): async for message in websocket: data = json.loads(message) # 筛选接收方语音:direction为'receiving'对应被叫的音频 if data['event'] == 'media' and data['media']['direction'] == 'receiving': # 获取base64编码的PCM音频数据 audio_data = data['media']['payload'] # 此处替换为实时ASR处理逻辑(如OpenAI Whisper实时版、Google Speech-to-Text流式识别) print(f"收到接收方音频片段,长度:{len(audio_data)}") start_server = websockets.serve(handle_twilio_stream, "0.0.0.0", 8765) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever()
2. 配置Twilio通话指向服务器
在Twilio控制台创建TwiML应用,通话接通时返回含<Stream>动词的TwiML,指向你的WebSocket服务器地址:
<Response> <Start> <Stream url="wss://你的公网服务器域名:8765"/> </Start> <Say>Hello</Say> </Response>
PHP实现示例
1. 用Ratchet搭建WebSocket服务器
使用Ratchet库实现WebSocket服务,处理Twilio媒体流:
<?php use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; use Ratchet\Server\IoServer; use Ratchet\WebSocket\WsServer; require __DIR__ . '/vendor/autoload.php'; class TwilioStreamHandler implements MessageComponentInterface { public function onOpen(ConnectionInterface $conn) { echo "新连接建立!({$conn->resourceId})\n"; } public function onMessage(ConnectionInterface $conn, $msg) { $data = json_decode($msg, true); // 筛选接收方语音数据 if ($data['event'] == 'media' && $data['media']['direction'] == 'receiving') { $audioPayload = $data['media']['payload']; // 替换为实时ASR处理逻辑 echo "收到接收方音频片段,长度:" . strlen($audioPayload) . "\n"; } } public function onClose(ConnectionInterface $conn) { echo "连接{$conn->resourceId}已断开\n"; } public function onError(ConnectionInterface $conn, \Exception $e) { echo "发生错误:{$e->getMessage()}\n"; $conn->close(); } } $server = IoServer::factory( new WsServer(new TwilioStreamHandler()), 8765 ); $server->run();
2. 生成TwiML响应
PHP后端收到Twilio的Webhook请求时,返回含<Stream>的TwiML:
<?php header('Content-Type: application/xml'); echo '<Response> <Start> <Stream url="wss://你的公网服务器域名:8765"/> </Start> <Say>Hello</Say> </Response>'; ?>
关键注意事项
- 音频格式适配:Twilio Media Streams推送的是PCM 8kHz单声道音频(base64编码),需确保你的ASR服务支持该格式的实时处理
- 语音方向判断:通过
media.direction字段区分,receiving对应接收方语音,sending对应机器人自身的语音 - 实时ASR选型:可选用OpenAI Whisper实时API、Google Cloud Speech-to-Text流式识别,或Twilio原生语音识别服务结合Media Streams
- 服务器部署要求:WebSocket服务器需公网可访问,且支持WSS(SSL加密),Twilio要求WebSocket连接使用HTTPS/WSS
内容的提问来源于stack exchange,提问作者Aqib Javaid
相关产品推荐
相关产品推荐

