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

基于Twilio的虚拟号码来电语音留言功能开发求助

实现Twilio虚拟号码语音留言及转文本邮件推送方案

1. 调整TwiML响应,触发语音留言逻辑

当转接失败(无人接听、占线、无法接通)时,需在TwiML中指定失败回调接口,并在该接口返回录音指令,引导来电方留言。

现有转接逻辑的TwiML可修改为:

<Response>
  <Dial action="/handle-dial-failure" method="POST">
    <Number>+1234567890</Number> <!-- 用户真实号码 -->
  </Dial>
</Response>

在/handle-dial-failure接口中返回录音引导的TwiML:

<Response>
  <Say language="zh-CN">您好,对方暂时无法接听,请在嘟声后留言,留言结束请挂机。</Say>
  <Record 
    action="/handle-recording" 
    method="POST"
    maxLength="300"
    finishOnKey="#"
    transcribe="true"
    transcribeCallback="/handle-transcription"
  />
</Response>
  • transcribe="true"会让Twilio自动完成语音转文本,无需额外调用API
  • transcribeCallback指定转文本完成后的回调接口

2. 存储录音信息到数据库

在/handle-recording接口中,Twilio会传递RecordingUrl、RecordingSid、From、To等核心参数,直接写入数据库即可:

// 示例Node.js代码,可根据自身技术栈调整
app.post('/handle-recording', (req, res) => {
  const { RecordingUrl, RecordingSid, From, To } = req.body;
  // 写入数据库逻辑
  db.query(
    'INSERT INTO voicemails (recording_sid, recording_url, caller_number, virtual_number) VALUES (?, ?, ?, ?)',
    [RecordingSid, RecordingUrl, From, To],
    (err) => err && console.error(err)
  );
  res.send('<Response></Response>');
});

3. 处理转文本结果并发送邮件

在/handle-transcription接口中,Twilio会推送TranscriptionText(转写内容)、RecordingSid等参数,关联数据库记录后发送邮件给用户:

app.post('/handle-transcription', (req, res) => {
  const { TranscriptionText, RecordingSid, From, To, RecordingUrl } = req.body;
  // 查询对应用户邮箱
  db.query(
    'SELECT user_email FROM virtual_numbers JOIN users ON virtual_numbers.user_id = users.id WHERE virtual_numbers.number = ?',
    [To],
    (err, results) => {
      if (err) {
        console.error(err);
        return res.sendStatus(500);
      }
      const userEmail = results[0].user_email;
      // 发送邮件(以nodemailer为例)
      const transporter = nodemailer.createTransport({
        service: 'Gmail',
        auth: {
          user: 'your-service-email@gmail.com',
          pass: 'your-app-password'
        }
      });
      const mailOptions = {
        from: '语音留言服务 <your-service-email@gmail.com>',
        to: userEmail,
        subject: `新语音留言:${From}`,
        html: `<p>留言内容:<br>${TranscriptionText}</p><p>录音链接:<a href="${RecordingUrl}">点击收听</a></p>`
      };
      transporter.sendMail(mailOptions, (error) => error && console.error(error));
    }
  );
  res.send('<Response></Response>');
});

4. 验证Twilio配置

  • 确认虚拟号码的"A Call Comes In" webhook指向转接处理接口(如/incoming-call),请求方法选POST
  • 检查ngrok公网地址可被Twilio正常访问(可通过Twilio控制台的验证功能测试)
  • 确认账号已开通语音转文本权限(默认开通,异常时可在控制台权限页检查)

内容的提问来源于stack exchange,提问作者Full Stack Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:22:54