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

Python中Twilio通话WebSocket流无法调用Response.Say问题

问题解决:Twilio WebSocket流处理中动态播放语音无响应

问题原因

你当前的写法里,只是在循环外创建了VoiceResponse对象并调用say方法,但没有把生成的TwiML指令发送给Twilio。Twilio在WebSocket流模式下,不会自动监听你本地VoiceResponse对象的变化,必须主动通过WebSocket发送特定格式的指令,才能触发语音播放。而通话开始时的Response.Say能正常工作,是因为它包含在初始返回给Twilio的TwiML响应里,Twilio能直接解析执行。

解决方案

修改代码,在需要播放语音的分支里,动态创建VoiceResponse生成TwiML,然后打包成Twilio要求的格式发送到WebSocket:

def stream(ws):
    rec = KaldiRecognizer(model, 16000)
    while True:
        message = ws.receive()
        packet = json.loads(message)
        if packet['event'] == 'start':
            print('Streaming is starting')
        elif packet['event'] == 'stop':
            print('\nStreaming has stopped')
        elif packet['event'] == 'media':
            audio = base64.b64decode(packet['media']['payload'])
            audio = audioop.ulaw2lin(audio, 2)
            audio = audioop.ratecv(audio, 2, 1, 8000, 16000, None)[0]
            if rec.AcceptWaveform(audio):
                r = json.loads(rec.Result())
                print(CL + r['text'] + '\n', end='', flush=True)
                # 生成播放语音的TwiML并发送给Twilio
                response = VoiceResponse()
                response.say('Sample response message')
                ws.send(json.dumps({
                    'event': 'command',
                    'command': 'play',
                    'twiml': str(response)
                }))
            else:
                r = json.loads(rec.PartialResult())
                print(CL + r['partial'] + BS * len(r['partial']), end='', flush=True)

关键说明

  • 每次需要播放语音时,都要创建新的VoiceResponse实例,生成对应的TwiML字符串。
  • 通过WebSocket发送的消息必须包含event: 'command'和command: 'play'字段,同时把TwiML字符串放在twiml字段里,Twilio收到后才会执行播放操作。

内容的提问来源于stack exchange,提问作者Rohan Choudhary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:06:11