Twilio呼入通话场景下未向WebSocket发送媒体流数据的问题求助
Twilio呼入通话场景下未向WebSocket发送媒体流数据的问题求助
我现在碰到了一个Twilio的配置难题,想请教下各位:我的核心需求是——当有人拨打我的Twilio号码时,系统要完成两个动作:一是把呼叫转接到我的手机,二是把通话的实时音频流推送到我的服务器上。
目前我已经搞定了**外呼(outbound)的场景:通过Web应用发起呼叫到我的手机时,音频流能正常传输到我的WebSocket服务。但切换到呼入(inbound)**场景时,Twilio就完全没把数据发送到我的WebSocket了,这可把我愁坏了。
我当前的实现代码(基于Express)
1. Twilio号码绑定的/voice端点
这是处理呼入请求的核心端点,返回TwiML指令:
app.post('/voice', (req, res) => { var msg = JSON.parse(JSON.stringify(req.body)) var to = msg.To; var from = msg.From; let response = ` <Response> <Say>Please Leave a message</Say> <Start> <Stream url="wss://NGROK_TUNNEL_URL/transcribe" track="inbound_track"/> </Start> <Dial callerId="${to}"> ${targetPhone} </Dial> <Pause length="10"></Pause> </Response> ` res .header('Content-Type', 'text/xml') .status(200) .send(response); });
2. 处理媒体流的WebSocket端点(/transcribe)
这段代码是参考Twilio官方示例仓库改的:
app.ws('/transcribe', (ws, req) => { console.log(`[ws] open`) new MediaStreamHandler(ws, clientWebSockets) }); class MediaStreamHandler { constructor(connection: any) { connection.on('message', this.processMessage.bind(this)); connection.on('close', this.close.bind(this)); connection.on('error', this.error.bind(this)) } processMessage(message: any) { var msg = JSON.parse(message); switch (msg.event) { case "connected": console.log(`[ws]: connected.`); break; case "start": console.log(`[ws]: start`) break; case "media": console.log(`[ws]: media sent`) break; case "stop": console.log(`Call Has Ended`); break; } } close() { console.log('[ws] closed'); } error(err: any) { console.log(`[ws] Error: ${err}`) } }
当前测试结果
当有呼入请求时:
- Twilio确实会调用我的/voice端点,也成功将呼叫转接到了我的目标手机
- 查看Twilio的呼叫日志,没有任何报错,返回的TwiML响应格式完全正确
<Stream>标签里配置的WebSocket URL(用ngrok做的公网隧道)是有效的,外呼场景下能正常使用
但问题在于:Twilio只会用GET请求访问一次我的/transcribe端点,之后就没有任何后续动作了——WebSocket连接根本没真正建立起来,我的服务器也收不到任何connected、start或者media类型的事件消息。
有没有大佬能帮我排查下问题出在哪呀?
内容来源于stack exchange
相关产品推荐
相关产品推荐

