如何在Twilio的stream函数中使用voice response的say方法?
问题分析与解决方案
你的问题核心是对Twilio Voice Response和WebSocket Stream的工作逻辑理解有误:
call()里的response是生成初始TwiML的对象,当Twilio收到这份TwiML并建立通话后,该对象的生命周期就结束了,后续修改它不会对正在进行的通话产生任何影响。- WebSocket Stream连接建立后,要向通话中注入语音或执行其他动作,必须通过WebSocket连接发送Twilio Stream协议的指令,而非操作原来的
response对象。
修正后的代码示例
修改stream函数,通过WebSocket发送包含Say动作的指令:
import json def stream(ws): # 先接收Twilio发送的初始连接事件(可选,但建议处理) initial_event = ws.receive() # 发送Say指令到当前通话 ws.send(json.dumps({ "event": "execute", "command": "say", "parameters": { "text": "Hi", "voice": "alice" # 可选参数,指定语音类型 } }))
同时修正call()函数,确保生成正确的TwiML并返回给Twilio:
from twilio.twiml.voice_response import VoiceResponse, Start from flask import request def call(): """Accept a phone call.""" response = VoiceResponse() start = Start() start.stream(url=f'wss://{request.host}/stream') response.append(start) response.say('Please leave a message') response.pause(length=60) return str(response) # 必须返回生成的TwiML字符串
关键说明
- 实时通话中的动态动作,必须通过WebSocket发送符合Twilio Stream协议的JSON消息实现。
- 初始TwiML发送后,原
response对象不再与当前通话关联,不要依赖它处理后续动作。 - WebSocket连接建立后,Twilio会先发送
start事件,可基于该事件触发后续指令发送逻辑。
内容的提问来源于stack exchange,提问作者Rayyan Reda
相关产品推荐
相关产品推荐

