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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:02:42