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
相关产品推荐
相关产品推荐

