You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:18:06