You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Twilio Voice调用API时同步播放等待音乐(Flask Python)

实现方案:Twilio等待音乐+异步API调用

你当前的问题在于同步执行API调用时,Twilio会一直等待请求返回才播放语音,导致用户听不到等待音。正确的思路是先返回播放等待音乐的TwiML,再后台异步处理API请求,完成后更新通话内容。

以下是具体实现步骤:

核心思路

  1. 收到Twilio的语音请求时,立即返回循环播放等待音乐的TwiML,让用户听到等待音。
  2. 启动异步任务调用外部API,避免阻塞当前请求。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:44:54