如何在Twilio录制音频时循环播放默认提示音且无录制中断?
嘿,这个需求完全可以实现!我之前帮不少开发者搞定过类似的场景,Twilio提供了几种可靠的方式来做到每30秒插入提示音,同时保证录音全程无缝、没有片段缺失。下面是从简单到进阶的实现方案:
方案一:分段录音+自动续录(最简单易上手)
这个思路利用Twilio的<Record>动词结合action回调,实现每30秒播放提示音后自动继续录音,而且通过参数设置保证片段衔接无缺失:
- 核心逻辑:每次启动30秒的录音,录音结束后触发回调URL,在回调里播放提示音,然后再次启动下一段30秒录音,循环直到通话结束。关键是设置
trim="do-not-trim"来保留录音首尾的衔接部分,避免出现断档。 - 初始TwiML(启动第一次录音):
<Response> <!-- 先播放一次Twilio默认提示音,这里用官方的牛铃示例,你可以替换成合规的提示音 --> <Play>https://api.twilio.com/cowbell.mp3</Play> <!-- 启动30秒录音,回调到/continue-recording,不裁剪首尾 --> <Record action="/continue-recording" maxLength="30" trim="do-not-trim" /> </Response> - 回调URL的响应TwiML(循环续录):
<Response> <Play>https://api.twilio.com/cowbell.mp3</Play> <!-- 重复相同的录音设置,继续下一个30秒周期 --> <Record action="/continue-recording" maxLength="30" trim="do-not-trim" /> </Response> - 收尾处理:通话结束后,你可以通过Twilio API获取所有分段的录音文件URL,用工具(比如
ffmpeg)将它们拼接成完整的音频:ffmpeg -i "concat:recording1.mp3|recording2.mp3|recording3.mp3" -c copy full-recording.mp3
方案二:Media Streams实时混合(完全无缝无分段)
如果想要真正的实时无缝(不需要事后拼接片段),可以用Twilio的Media Streams功能,直接在音频流中插入提示音:
- 核心逻辑:建立WebSocket连接接收Twilio的实时音频流,每隔30秒将提示音的音频帧(和Twilio流同格式:PCMU 8kHz单声道)混合到输出流中,同时持续录制用户音频。
- 步骤概览:
- 在TwiML中启用Media Streams,指向你的WebSocket服务器:
<Response> <Start> <Stream url="wss://your-server.com/audio-stream" /> </Start> <Play>https://api.twilio.com/cowbell.mp3</Play> <Say>录音已启动,每30秒会播放提示音</Say> <Pause length="3600" /> <!-- 保持通话连接 --> </Response> - 你的WebSocket服务器监听连接,接收Twilio发送的音频帧(JSON格式,包含
media字段的base64编码音频数据)。 - 维护一个计时器,每隔30秒将提前转换好的提示音PCMU帧插入到输出流中,同时继续写入用户的音频帧。
- 将混合后的音频流实时保存为完整的音频文件。
- 在TwiML中启用Media Streams,指向你的WebSocket服务器:
关键注意事项
- 确保提示音的音频格式和Twilio的录音格式一致(默认是PCMU 8kHz单声道),否则混合或拼接时会出现杂音或兼容性问题。
- 用方案一的时候,记得在Twilio控制台或通过API跟踪所有录音片段,避免遗漏。
- 测试时要重点检查两段录音的衔接处,确认没有中断或内容缺失。
内容的提问来源于stack exchange,提问作者S Coder
相关产品推荐
相关产品推荐

