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

如何在Angular Web应用中使用Twilio JavaScript Voice SDK实现通话转接与录制

通话录制与转接功能实现方案

一、通话录制实现

Twilio的通话录制需要在通话流程的TwiML配置中开启,结合你的现有代码,从两部分适配:

1. 后端TwiML配置

在处理外呼的后端TwiML响应中,给<Dial>标签添加录制参数,实现双向通话录制:

<Response>
  <!-- record参数指定录制模式,record-from-ringing-dual表示从振铃开始双向录制 -->
  <Dial record="record-from-ringing-dual" recordingStatusCallback="/your-recording-callback">
    <Number>+91xxxxxxxxx</Number>
  </Dial>
</Response>

注:recordingStatusCallback是可选的录制状态回调接口,可用于接收录制完成后的文件地址等信息

2. 前端状态监听

在现有connect事件中添加录制状态监听,方便前端展示录制状态:

device.on('connect', (connection) => {
    console.log(connection);
    if ('patientPhoneNumber' in connection.message) {
        this.callStartTime = new Date();
    }
    // 监听录制开始/结束事件
    connection.on('recordingStarted', () => {
        console.log('通话录制已启动');
    });
    connection.on('recordingStopped', () => {
        console.log('通话录制已停止');
    });
    this.addCallStatus(connection);
});

二、通话转接实现(医护A转医护B,A自动挂断)

这个功能需要前端触发转接请求,后端调用Twilio API完成通话重定向,具体步骤:

1. 前端添加转接触发逻辑

在UI中添加转接按钮,绑定以下方法:

transferCall() {
    const activeConnection = this.device.activeConnection();
    if (!activeConnection) return;

    // 传入医护B的标识(客户端ID或手机号)
    const transferData = {
        callSid: activeConnection.parameters.CallSid,
        targetAgent: '医护B的Twilio客户端ID/手机号'
    };

    // 向后端发送转接请求
    this.authService.postRequest('audiocall/twilio/transfer', transferData).subscribe((res) => {
        console.log('转接请求已提交');
    }, (err) => {
        this.toastr.error('转接失败,请重试');
    });
}

2. 后端处理转接逻辑

后端使用Twilio SDK调用Calls API,将当前通话重定向到医护B:

// Node.js示例,其他语言逻辑一致
const twilio = require('twilio')(yourAccountSid, yourAuthToken);

twilio.calls(transferData.callSid)
  .update({
    // 该URL返回连接医护B的TwiML
    url: 'https://your-public-server.com/connect-agent-b',
    method: 'POST'
  })
  .then(call => console.log('转接指令已发送'))
  .catch(err => console.error('转接失败:', err));

上述URL返回的TwiML示例:

<Response>
  <Dial record="continue"> <!-- 保持通话录制 -->
    <Client>医护B的客户端ID</Client> <!-- 若为手机号则用<Number>+91xxxxxxxxx</Number> -->
  </Dial>
</Response>

3. 前端自动处理A的挂断

当Twilio完成转接后,医护A的通话连接会自动断开,现有disconnect事件可直接适配,只需调整状态标记:

device.on('disconnect', (connection) => {
    setTimeout(() => {
        self.callEndTime = new Date();
        self.addMessageCenterData();
        let formData = {
            'status': 'TRANSFERRED', // 将通话状态标记为已转接
            'voiceCallLogId': self.voiceCallLogId,
            'callEndTime': self.callEndTime,
            'callSid': connection.parameters.CallSid
        }
        self.updateCallStatus(formData);
        self.toastr.info('通话已转接,您已退出');
        self.dialogRef.close();
    }, 500);
});

三、关键注意事项

  • 试用账户默认支持通话录制,但需确保TwiML中的录制参数配置正确
  • 后端提供的TwiML地址必须能被Twilio公网访问,本地开发可使用ngrok等工具暴露端口
  • 医护B需通过Twilio Device正常登录在线,确保能被转接接通

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:29:58