如何让twiml.say在拨打后立即向通话对象发声?
解决你的Twilio TwiML.Say相关问题
问题1:如何让twiml.say向已拨打的对象(被叫方)发声?
如果你想在被叫方接听后立即给他们播放语音内容,得用到Twilio的**呼叫筛选(Call Screening)**功能——通过<Dial>动词的url参数指定一个筛选端点。当被叫方接听时,Twilio会自动请求这个端点,你可以在该端点返回的TwiML里用<Say>给被叫方播放语音,之后再完成主叫和被叫的桥接。
给你举个实际的代码例子:
主呼叫处理函数(发起呼叫)
exports.handler = function(context, event, callback) { let twiml = new Twilio.twiml.VoiceResponse(); // 判断目标是电话号码还是客户端 const attr = isAValidPhoneNumber(event.To) ? 'number' : 'client'; // 创建Dial动词,指定筛选端点的路径 const dial = twiml.dial({ url: '/call-screening' // 替换成你的筛选端点路径 }); dial[attr](event.To); callback(null, twiml); };
呼叫筛选端点(给被叫方播放语音)
exports.screeningHandler = function(context, event, callback) { let twiml = new Twilio.twiml.VoiceResponse(); // 这段内容会直接播放给刚接听的被叫方 twiml.say('您好,这里是来自XX的呼叫,请稍候为您接通。'); // 用<Connect>完成主叫和被叫的通话桥接 twiml.connect(); callback(null, twiml); };
这样设置后,被叫方一接听就会听到<Say>的内容,之后才会和主叫方建立通话。
问题2:拨打911后,twiml.say需等对方挂断才执行,如何让它在拨打完成(接通)后立即运行?
默认情况下,<Dial>动词会阻塞后续的TwiML代码,直到呼叫结束(对方挂断)才会执行后面的内容。要在呼叫接通后立刻触发<Say>,你需要用到<Dial>的action属性——它可以指定一个端点,当呼叫状态发生变化(比如接通、挂断)时,Twilio会自动请求这个端点并执行返回的TwiML。
修改你的代码如下:
主呼叫处理函数
exports.handler = function(context, event, callback) { let twiml = new Twilio.twiml.VoiceResponse(); const attr = isAValidPhoneNumber(event.To) ? 'number' : 'client'; // 创建Dial动词,设置action指向接通后的处理端点 const dial = twiml.dial({ action: '/post-connect-action', // 替换成你的后续处理端点路径 method: 'POST' }); dial[attr](event.To); // 这里event.To是911号码 callback(null, twiml); };
接通后的处理端点
exports.postConnectHandler = function(context, event, callback) { let twiml = new Twilio.twiml.VoiceResponse(); // 这段内容会在呼叫接通后立即播放,不需要等对方挂断 twiml.say('呼叫已接通,请注意您的通话内容。'); // 如果需要保持通话,不需要额外操作;如果要主动结束通话可以添加twiml.hangup() // twiml.hangup(); callback(null, twiml); };
⚠️ 注意:911属于紧急呼叫,部分地区的运营商或Twilio服务可能对这类呼叫有特殊限制,建议测试前确认当地的紧急呼叫规则。
内容的提问来源于stack exchange,提问作者Tim Clemans
相关产品推荐
相关产品推荐

