
本教程详细介绍了如何使用Twilio构建一个具备呼叫转发功能的系统,并在此基础上实现未接来电自动转接语音留言。文章将涵盖Twilio TwiML中的`Dial`和`Record`动词的使用,包括设置呼叫超时、录制语音留言,以及通过Webhook处理录音回调和转录,最终实现将语音留言通过邮件通知用户。
在现代通信应用中,为用户提供一个隐私保护的虚拟号码(即掩码号码)并将其呼叫转发至真实号码是一项常见需求。然而,当用户真实号码无法接通、占线或未及时应答时,如何确保客户能够留下语音留言,并及时通知用户,是提升用户体验的关键。本教程将详细阐述如何利用Twilio的强大功能,构建一个完整的呼叫转发与未接来电语音留言系统。
1. 核心需求分析
我们的目标是实现以下功能:
- 客户拨打用户的掩码号码。
- Twilio将呼叫转发至用户的真实号码。
- 如果用户真实号码未接通、占线或未应答,客户可以录制语音留言。
- 语音留言将被存储,并通过Twilio的语音转文本API进行转录。
- 转录文本和语音文件链接将通过电子邮件发送给用户。
2. Twilio TwiML动词:Dial与Record
Twilio通过TwiML(Twilio Markup Language)来控制呼叫流程。实现上述功能主要依赖于Dial和Record这两个核心动词。
2.1 使用 Dial 动词进行呼叫转发与超时设置
Dial动词用于将当前呼叫连接到另一个电话号码或Twilio客户端。为了处理未接来电,我们需要利用Dial动词的timeout和action属性。
- timeout:指定Twilio等待被叫方接听的时间(秒)。如果在此时间内未接听,Twilio将停止尝试连接。
- action:当Dial动词执行结束时(例如,被叫方未接听、占线或失败),Twilio会向此URL发起一个HTTP请求。这个URL将用于处理呼叫的后续逻辑,例如转接至语音留言。
示例代码:主呼叫Webhook (/webhook/voice)
const twilio = require("twilio");
const express = require("express");
const router = express.Router();
// 假设 getNumberWithoutUser 和 updateQuota 是你的数据库操作函数
// const { getNumberWithoutUser, updateQuota } = require("../db/dbOperations");
router.post("/webhook/voice", async (req, res) => {
const { To, From, CallStatus } = req.body;
// 假设根据 'To' 掩码号码获取用户信息和真实号码
// const [numbers] = await getNumberWithoutUser(To);
// if (!numbers) return res.status(400).send("User does not own this number");
// 假设这些信息从数据库中获取
const primaryPhoneNumber = "+8613800138000"; // 示例:用户的真实号码
const isToPrimaryPhone = true; // 示例:是否开启了呼叫转发
if (isToPrimaryPhone) {
const twiml = new twilio.twiml.VoiceResponse();
// 可选:在转接前播放欢迎语
twiml.say({ voice: 'alice', language: 'zh-CN' }, "请稍候,我们正在为您转接。");
// 使用Dial动词将呼叫转发到用户的真实号码
// 设置15秒超时,如果未接听,则将控制权转交给 /webhook/handle_dial_outcome
twiml.dial({
timeout: 15, // 等待被叫方接听的秒数
action: '/webhook/handle_dial_outcome', // 如果未接听,Twilio将请求此URL
hangupOnStar: true // 允许呼叫者按 * 键跳过语音留言
}, primaryPhoneNumber);
// 假设更新呼叫配额
// await updateQuota(numbers._id, To, "callForwarding", type);
res.type("text/xml");
return res.send(twiml.toString());
}
// 如果呼叫转发未启用或套餐已过期
res.send("Call Forwarding is disabled or package has finished");
});
module.exports = router;登录后复制
2.2 使用 Record 动词录制语音留言
当Dial动词因超时而结束时,Twilio会调用action指定的URL。在这个新的Webhook中,我们将使用Record动词来提示客户录制语音留言。
还木有评论哦,快来抢沙发吧~