Twilio:在收到先前响应的笔录后响应呼叫者

时间:2020-02-01 22:45:00

标签: twilio twilio-api twilio-twiml

我正在尝试执行以下流程:

  1. 呼叫者拨打twilio#
  2. 我们问来电者一个问题,他们通过讲话做出回应
  3. 收到成绩单(不是音频文件)后,我们会向他们询问另一个问题...这将继续处理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响应该处理程序?来自/处理程序的第二次响应后,呼叫者被挂断。

关于如何实现此目标的任何想法?我认为我真的不能让用户在等待第二个/处理程序请求之前默默等待...

2 个答案:

答案 0 :(得分:0)

当您的/transcript handler受到点击时,您将在请求中获得callSidCAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)和其他参数。

使用此callSid,您可以修改“正在进行的呼叫” ,即我向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

答案 1 :(得分:0)

这里是Twilio开发人员的传播者。

虽然您似乎已经可以使用此版本的呼叫流程,但这并不是解决此问题的最佳方法,因为我们现在拥有<Gather input="speech">

<Gather>设置为“语音”的

input将实时转录用户,并将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>进行转录要好得多。