基于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自动完成语音转文本,无需额外调用APItranscribeCallback指定转文本完成后的回调接口
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
相关产品推荐
相关产品推荐

