基于Twilio的电话GPT助手:如何在通话流中播放本地音频文件?
解决方案:Twilio通话中播放静态音频文件
针对你遇到的无法用send_static_audio播放tts_output4.wav的问题,下面是具体的代码修正方案和排查要点:
1. 核心问题分析
Twilio通话中播放音频依赖TwiML的<Play>标签,而非直接发送文件内容。你的send_static_audio函数可能未正确生成符合要求的TwiML响应,或者音频文件本身不符合Twilio的格式/访问要求。
2. 修正server.py代码(以Flask为例)
假设你用Flask处理Twilio webhook,以下是转写完成后触发音频播放的关键代码:
from twilio.twiml.voice_response import VoiceResponse, Play from flask import Flask, request, Response app = Flask(__name__) # 转写完成后的回调路由,负责播放音频 @app.route("/post_transcription", methods=["POST"]) def post_transcription(): # 获取Google Cloud Speech的转写结果(根据你的实际逻辑调整) transcription = request.form.get("transcript") # 生成TwiML响应,播放音频 resp = VoiceResponse() # 注意:音频文件必须满足两个条件: # - 格式为Twilio支持的WAV(PCM 8kHz/16kHz,16-bit单声道)或MP3 # - 能被公网访问(本地开发用ngrok暴露端口,替换为ngrok提供的URL) resp.play("https://your-ngrok-domain.com/static/tts_output4.wav") return Response(str(resp), mimetype="application/xml") # 流媒体转写处理路由(对应streams.xml的Stream URL) @app.route("/stream_handler", methods=["POST"]) def stream_handler(): # 这里处理Google Cloud Speech的实时转写逻辑 # 转写完成后,重定向到音频播放路由 resp = VoiceResponse() resp.redirect("/post_transcription") return Response(str(resp), mimetype="application/xml") if __name__ == "__main__": app.run(port=5000, debug=True)
3. 修正streams.xml配置
确保流媒体转写结束后触发正确的回调:
<Response> <Start> <!-- 替换为你的公网可访问的流媒体处理URL --> <Stream url="wss://your-ngrok-domain.com/stream_handler" /> </Start> <!-- 转写结束后自动跳转到音频播放路由 --> <Redirect method="POST">https://your-ngrok-domain.com/post_transcription</Redirect> </Response>
4. 关键排查要点
- 音频格式校验:Twilio不支持所有WAV格式,用ffmpeg转换为兼容格式:
ffmpeg -i tts_output4.wav -ar 8000 -ac 1 -acodec pcm_s16le twilio_compatible.wav - 文件可访问性:本地开发时用ngrok暴露Flask服务,确保音频文件的URL能被Twilio服务器访问到(放在Flask的
static目录下即可)。 - Twilio日志调试:登录Twilio控制台,查看通话的调试日志,检查是否有音频URL访问失败、格式不支持等错误提示。
- 自定义函数修正:如果你的
send_static_audio是自定义函数,确保它返回的是包含<Play>标签的XML响应,而非直接输出文件二进制内容。
内容的提问来源于stack exchange,提问作者Siddharth Pilli
相关产品推荐
相关产品推荐

