Twilio:在收到先前响应的记录后响应呼叫者
Twilio: Responding to a caller after transcript for previous response is received
我正在尝试让以下流程正常工作:
- 来电拨打 twilio #
- 我们问来电者一个问题,他们通过说话来回答
- 收到成绩单(不是音频文件)后,我们会通过问他们另一个问题来回应......这会持续 2-3 个问题
我遇到的问题是对主 webhook 处理程序和转录处理程序的调用的分离。
我让主要呼叫处理程序回答第一个问题,如下所示:
<!-- [/ handler] initial response, with the first question -->
<Response>
<Say voice="alice">What is your favorite color? Press any key when done.</Say>
<Record transcribe="true" transcribeCallback="/transcript" maxLength="60"/>
</Response>
然后,当录制完成时,我们会收到对主要呼叫处理程序的第二个请求。我还不能回答另一个问题(业务需求),所以我们回复一个模糊的确认:
<!-- [/ handler] vague confirmation response
<Response>
<Say voice="alice">Got it. Give me a couple seconds to write that down.</Say>
</Response>
然后我在 /transcript
处理程序上收到了一个带有成绩单的命中,我对此做出回应:
<!-- [/transcript handler] Second question -->
<Response>
<Say voice="alice">What is the air-speed velocity of an unladen swallow? Press any key when done.</Say>
<Record transcribe="true" transcribeCallback="/transcription" maxLength="60"/>
</Response>
但显然您无法使用 TWiML 响应该处理程序? /
处理程序第二次响应后,呼叫者挂断。
关于如何实现这个的任何想法?我不认为我真的可以让用户在响应第二个 /
处理程序请求之前静默等待...
当您在 /transcript handler
上收到点击时,您在请求中有 callSid
(CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
) 以及其他参数。
有了这个 callSid
你可以修改 "in progress call" 我向 Twilio 发出请求并传递一个新的 TwiML。
不确定您在服务器端使用的是什么语言,但在 Node.js 中看起来像这样:
const accountSid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const authToken = 'your_auth_token';
const client = require('twilio')(accountSid, authToken);
client.calls('CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
.update({twiml: '<Response>
<Say voice="alice">What is the air-speed velocity of an unladen swallow? Press any key when done.</Say>
<Record transcribe="true" transcribeCallback="/transcription" maxLength="60"/>
</Response>'})
.then(call => console.log(call.to));
文档:(https://www.twilio.com/docs/voice/tutorials/how-to-modify-calls-in-progress-node-js)
这里是 Twilio 开发人员布道者。
虽然您似乎已经让这个版本的呼叫流程正常工作,但这并不是解决这个问题的最佳方式,因为我们现在有 <Gather input="speech">
。
<Gather>
将 input
设置为 "speech" 将实时转录用户,将 SpeechResult
传送到您的下一个 webhook URL( action
属性)。这样您就无需等待异步执行转录,并且可以立即使用 TwiML 进行响应。
像这样使用 <Gather>
可以让您构建如下呼叫流程:
<!-- [/ handler] initial response, with the first question -->
<Response>
<Gather action="/question2" input="speech">
<Say voice="alice">What is your favorite color?</Say>
<Gather>
</Response>
然后在 /question2
中,您可以立即动态读取响应。以下是使用 Ruby 和 Sinatra 作为示例服务器端语言的响应方式:
post "/question2" do
favorite_color = params["SpeechResult"]
response = "Great, I love the color #{favorite_color} too. Now, what's your favorite pet?"
return "<Response>
<Gather action="/question3" input="speech">
<Say>#{response}</Say>
</Gather>
</Response>"
end
等等。您应该会发现它比使用 <Record>
转录要好得多。
我正在尝试让以下流程正常工作:
- 来电拨打 twilio #
- 我们问来电者一个问题,他们通过说话来回答
- 收到成绩单(不是音频文件)后,我们会通过问他们另一个问题来回应......这会持续 2-3 个问题
我遇到的问题是对主 webhook 处理程序和转录处理程序的调用的分离。
我让主要呼叫处理程序回答第一个问题,如下所示:
<!-- [/ handler] initial response, with the first question -->
<Response>
<Say voice="alice">What is your favorite color? Press any key when done.</Say>
<Record transcribe="true" transcribeCallback="/transcript" maxLength="60"/>
</Response>
然后,当录制完成时,我们会收到对主要呼叫处理程序的第二个请求。我还不能回答另一个问题(业务需求),所以我们回复一个模糊的确认:
<!-- [/ handler] vague confirmation response
<Response>
<Say voice="alice">Got it. Give me a couple seconds to write that down.</Say>
</Response>
然后我在 /transcript
处理程序上收到了一个带有成绩单的命中,我对此做出回应:
<!-- [/transcript handler] Second question -->
<Response>
<Say voice="alice">What is the air-speed velocity of an unladen swallow? Press any key when done.</Say>
<Record transcribe="true" transcribeCallback="/transcription" maxLength="60"/>
</Response>
但显然您无法使用 TWiML 响应该处理程序? /
处理程序第二次响应后,呼叫者挂断。
关于如何实现这个的任何想法?我不认为我真的可以让用户在响应第二个 /
处理程序请求之前静默等待...
当您在 /transcript handler
上收到点击时,您在请求中有 callSid
(CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
) 以及其他参数。
有了这个 callSid
你可以修改 "in progress call" 我向 Twilio 发出请求并传递一个新的 TwiML。
不确定您在服务器端使用的是什么语言,但在 Node.js 中看起来像这样:
const accountSid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const authToken = 'your_auth_token';
const client = require('twilio')(accountSid, authToken);
client.calls('CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
.update({twiml: '<Response>
<Say voice="alice">What is the air-speed velocity of an unladen swallow? Press any key when done.</Say>
<Record transcribe="true" transcribeCallback="/transcription" maxLength="60"/>
</Response>'})
.then(call => console.log(call.to));
文档:(https://www.twilio.com/docs/voice/tutorials/how-to-modify-calls-in-progress-node-js)
这里是 Twilio 开发人员布道者。
虽然您似乎已经让这个版本的呼叫流程正常工作,但这并不是解决这个问题的最佳方式,因为我们现在有 <Gather input="speech">
。
<Gather>
将 input
设置为 "speech" 将实时转录用户,将 SpeechResult
传送到您的下一个 webhook URL( action
属性)。这样您就无需等待异步执行转录,并且可以立即使用 TwiML 进行响应。
像这样使用 <Gather>
可以让您构建如下呼叫流程:
<!-- [/ handler] initial response, with the first question -->
<Response>
<Gather action="/question2" input="speech">
<Say voice="alice">What is your favorite color?</Say>
<Gather>
</Response>
然后在 /question2
中,您可以立即动态读取响应。以下是使用 Ruby 和 Sinatra 作为示例服务器端语言的响应方式:
post "/question2" do
favorite_color = params["SpeechResult"]
response = "Great, I love the color #{favorite_color} too. Now, what's your favorite pet?"
return "<Response>
<Gather action="/question3" input="speech">
<Say>#{response}</Say>
</Gather>
</Response>"
end
等等。您应该会发现它比使用 <Record>
转录要好得多。