如何通过Twilio语音函数向呼叫者流式返回音频?
如何向呼叫者流式返回音频?
实现方案
Twilio语音函数支持直接流式返回音频,无需等待完整文件上传。你可以用Node.js的PassThrough流配合Twilio的响应对象,将实时获取的音频流直接推送给呼叫者,实现边接收边播放。
完整代码示例
const stream = require('stream'); const twilio = require('twilio'); exports.handler = async function(context, event, callback) { // 你的实时音频可读流(示例中为mp3.body) const readable = mp3.body; const passThroughStream = new stream.PassThrough(); // 配置流式响应头,启用分块传输 const twilioResponse = new Twilio.Response(); twilioResponse.setHeaders({ 'Content-Type': 'audio/mpeg', // 根据音频格式调整,如audio/wav 'Transfer-Encoding': 'chunked' }); // 管道连接流,将实时音频传递给Twilio readable.pipe(passThroughStream); twilioResponse.setBody(passThroughStream); // 音频流结束后,执行后续交互逻辑 passThroughStream.on('end', () => { const postAudioResponse = new twilio.twiml.VoiceResponse(); postAudioResponse.gather({ numDigits: 1 }, node => { node.say('请按1继续,按2退出'); }); // 后续逻辑可通过回调返回新的TwiML,或配置Webhook跳转 callback(null, postAudioResponse); }); // 添加错误监听,避免流异常导致通话中断 readable.on('error', err => callback(err)); passThroughStream.on('error', err => callback(err)); // 返回流式音频响应 callback(null, twilioResponse); };
关键要点
- Content-Type必须匹配:严格对应你的音频格式(MP3用
audio/mpeg,WAV用audio/wav),否则Twilio无法解析播放。 - 分块传输必不可少:
Transfer-Encoding: chunked让Twilio能边接收数据边播放,消除等待延迟。 - 错误处理要到位:给流添加错误监听,避免因音频源异常导致通话崩溃。
- 后续流程衔接:音频播放完成后,Twilio会执行
end事件中定义的后续交互逻辑,比如收集用户按键输入。
内容的提问来源于stack exchange,提问作者Ruchir Baronia
相关产品推荐
相关产品推荐

