[英]Twilio media stream used simultaneously with Speech to Text (Twilio Say)
我正在开发一个使用 twilio 媒体 stream(Google STT)的语音机器人,处理文本并使用 TwiML Say Object 将响应返回给用户。我使用的端点在用户开始呼叫时触发(状态呼叫是铃声):
@app.route("/twilio_call", methods=['POST'])
def voice(request):
"""Respond to incoming phone calls with a greet message"""
call_status = request.form.get("CallStatus")
if call_status == "ringing":
voice_respond = VoiceResponse()
voice_respond.say("hello! how can I help!", voice='women')
return response.text(str(voice_response), content_type="text/xml")
将此消息传递给用户后,我想用媒体 stream 直接触发 websocket 服务器。
@app.websockets('/media')
def transcribe_media(request, ws):
while True:
message = ws.recv()
if message is None:
continue
data = json.loads(message)
if data['event'] == "media":
....
#here I'm sending data to google and getting the transcription back
我无法像文档中的此处那样修改正在进行的呼叫: https://www.twilio.com/docs/voice/tutorials/how-to-modify-calls-in-progress-python
我已经尝试过:
client = Client(ACCOUNT_SID, AUTH_TOKEN)
call = client.calls(conversation_id).update(
twiml='<Response><Say voice="woman" language="de-DE">' + msg_text + '</Say></Response>')
但是我收到一个错误,状态调用未在进行中(它正在“响铃”)。
我还尝试使用 TwiML“STREAM”Object,但是当它与 TwiML“Say”object 一起使用时它没有启动服务器(当我仅通过 STREAM 时它触发服务器):
voice_response = VoiceResponse()
start = Start()
start.stream(url='wss://<NGROK_IP>.ngrok.io/webhooks/twilio_voice/media')
voice_response.say("Hello, how can I help?", language="en-GB")
voice_response.append(start)
response.text(str(voice_response), content_type="text/xml")
有谁知道我该如何解决这个问题? 在 Twiml"Say" object 传递给用户后,如何触发 websocket 服务器?
Twilio 开发者布道师在这里。
实现此目的的正确方法是通过Stream TwiML 元素。 我建议将 stream 放在 TwiML 响应的开头,以便它可以及时建立,以便您开始接收用户的语音。 另外,一旦TwiML完成,Twilio就会挂断电话,即使有stream在线。所以你应该暂停等待用户的语音响应。
因此,我会将您的 webhook 端点更改为:
@app.route("/twilio_call", methods=['POST'])
def voice(request):
"""Respond to incoming phone calls with a greet message"""
call_status = request.form.get("CallStatus")
voice_respond = VoiceResponse()
start = Start()
start.stream(url='wss://<NGROK_IP>.ngrok.io/webhooks/twilio_voice/media')
voice_respond.append(start)
voice_respond.say("hello! how can I help!", voice='women')
voice_respond.pause(length=60)
return response.text(str(voice_response), content_type="text/xml")
现在您的 stream 应该连接到您的 websocket 端点,您的用户将听到问候语。 通话不会挂断,因为有 60 秒的暂停,当用户说话时,您可以使用 websocket 端点将语音发送到 STT 服务,当您收到响应时,重定向呼叫并使用<Say>
说话结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.