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

技术咨询:能否在Twilio中结合Dial与Gather动词实现实时监听通话?

结合实现Twilio通话实时监听+收集响应的方案

绝对可以实现!我之前做过类似的场景,结合Twilio的<Dial>、<Conference>和<Gather>就能完美满足你实时监听通话+收集被叫响应的需求。下面是具体的实现思路和代码示例:

核心思路

我们需要把被叫方、监听方同时接入同一个会议,这样监听方可以实时听到通话动态;同时在会议中对被叫方发起<Gather>指令收集响应,整个过程中监听方保持在线监听。

具体步骤&代码示例

以下用Node.js + Express为例,展示完整流程:

1. 初始呼叫的TwiML响应(被叫方接入+呼叫监听方)

当Twilio发起呼叫到被叫方后,你的服务器返回这个TwiML,同时完成三件事:

  • 将被叫方接入专属会议
  • 呼叫监听方并将其接入同一会议(静音模式)
  • 对被叫方播放提示音并启动<Gather>收集输入
const twilio = require('twilio');
const express = require('express');
const app = express();
app.use(express.urlencoded({ extended: true }));

// 处理初始呼叫的TwiML请求
app.post('/twiml/initial-call', (req, res) => {
  const twiml = new twilio.twiml.VoiceResponse();

  // 让被叫方进入会议,设置会议不随被叫方挂断而结束
  const conference = twiml.conference({
    name: `CallMonitor_${req.body.CallSid}`, // 用CallSid生成唯一会议名
    startConferenceOnEnter: true,
    endConferenceOnExit: false,
  });

  // 呼叫监听方,接入同一会议并设置静音
  const dial = twiml.dial();
  dial.number({
    url: '/twiml/monitor-join', // 监听方接入时的专属TwiML
  }, '+1234567890'); // 替换成你的监听方手机号

  // 对被叫方发起<Gather>收集响应
  const gather = twiml.gather({
    numDigits: 1,
    action: '/twiml/gather-response',
    method: 'POST',
  });
  gather.say('请按1确认,按2取消操作');

  res.type('text/xml');
  res.send(twiml.toString());
});

2. 监听方接入会议的TwiML

这里设置监听方为静音模式,避免干扰被叫方的输入:

app.post('/twiml/monitor-join', (req, res) => {
  const twiml = new twilio.twiml.VoiceResponse();
  twiml.conference({
    name: `CallMonitor_${req.body.ParentCallSid}`, // 关联初始呼叫的会议
    muted: true, // 监听方静音
    startConferenceOnEnter: false, // 等待被叫方进入会议
  });
  res.type('text/xml');
  res.send(twiml.toString());
});

3. 处理收集到的响应

当Twilio收集到被叫方的输入后,会回调这个接口,你可以根据输入继续处理业务,同时监听方依然保持在会议中:

app.post('/twiml/gather-response', (req, res) => {
  const twiml = new twilio.twiml.VoiceResponse();
  const inputDigits = req.body.Digits;

  if (inputDigits === '1') {
    twiml.say('确认成功,正在为您转接至人工客服');
    // 这里可以继续用<Dial>转接其他号码,监听方会全程监听转接后的通话
    twiml.dial('+0987654321');
  } else if (inputDigits === '2') {
    twiml.say('操作已取消,通话即将结束');
    twiml.hangup();
  } else {
    twiml.say('输入无效,请重新操作');
    // 重新发起<Gather>
    const gather = twiml.gather({ numDigits: 1, action: '/twiml/gather-response' });
    gather.say('请按1确认,按2取消操作');
  }

  res.type('text/xml');
  res.send(twiml.toString());
});

app.listen(3000, () => console.log('Server running on port 3000'));

关键注意事项

  • 会议唯一性:用初始呼叫的CallSid生成唯一会议名,避免不同通话之间的干扰
  • 监听方静音:务必给监听方设置muted: true,防止监听方的声音传入被叫方,影响<Gather>的收集效果
  • 会议生命周期:设置endConferenceOnExit: false,确保被叫方在输入过程中误挂断时,监听方不会被强制退出

内容的提问来源于stack exchange,提问作者GrowinMan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:09:05