如何在Twilio Voice调用API时同步播放等待音乐(Flask Python)
实现方案:Twilio等待音乐+异步API调用
你当前的问题在于同步执行API调用时,Twilio会一直等待请求返回才播放语音,导致用户听不到等待音。正确的思路是先返回播放等待音乐的TwiML,再后台异步处理API请求,完成后更新通话内容。
以下是具体实现步骤:
核心思路
- 收到Twilio的语音请求时,立即返回循环播放等待音乐的TwiML,让用户听到等待音。
- 启动异步任务调用外部API,避免阻塞当前请求。
- API调用完成后,通过Twilio API更新通话的TwiML,播放结果并挂断。
具体代码实现
1. 依赖安装
先安装所需依赖:
pip install flask twilio requests celery redis
2. 完整代码
from flask import Flask, request from twilio.twiml.voice_response import VoiceResponse, Play from twilio.rest import Client import requests as pyreq from celery import Celery # 初始化Flask应用 app = Flask(__name__) # 配置Celery异步队列(用Redis作为消息中间件) app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0' app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0' celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL']) celery.conf.update(app.config) # 替换为你的Twilio账号信息 TWILIO_ACCOUNT_SID = '你的Twilio Account SID' TWILIO_AUTH_TOKEN = '你的Twilio Auth Token' twilio_client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN) # 异步任务:调用外部API并更新通话内容 @celery.task def fetch_and_update_call(call_sid): # 执行外部API调用 reply = pyreq.get("https://XXXXXXXXXXXXX") data = reply.json() # 生成结果TwiML result_twiml = VoiceResponse() result_twiml.say(data) result_twiml.say(' Goodbye!', voice='Polly.Olivia-Neural') result_twiml.hangup() # 更新Twilio通话,播放结果 twilio_client.calls(call_sid).update(twiml=str(result_twiml)) # 初始响应端点:返回等待音乐TwiML @app.route('/get_response', methods=['POST']) def get_response(): # 获取当前通话的CallSid(Twilio请求中自带) call_sid = request.form.get('CallSid') # 启动异步任务处理API调用 fetch_and_update_call.delay(call_sid) # 返回等待音乐TwiML(循环播放,可替换为自己的音频URL) response = VoiceResponse() response.play('http://com.twilio.sounds.music.s3.amazonaws.com/MARKOVICHAMP-Borghestral.mp3', loop=0) return str(response) if __name__ == '__main__': app.run(debug=True)
关键注意事项
- 异步任务选择:生产环境建议用Celery+Redis/RabbitMQ,避免使用Python原生线程(Flask的开发服务器不适合高并发多线程场景)。
- 等待音乐URL:可以用Twilio提供的内置音乐,也可以替换为你自己上传的音频文件(需是公开可访问的HTTP/HTTPS URL)。
- Twilio权限:确保你的Twilio账号有权限更新通话资源,且账号信息正确配置。
- 错误处理:建议在异步任务中添加异常捕获,比如API调用失败时给用户播放提示音。
内容的提问来源于stack exchange,提问作者BrainDead
相关产品推荐
相关产品推荐

