Twilio: Ответ вызывающему абоненту после получения стенограммы предыдущего ответа - PullRequest
1 голос
/ 02 февраля 2020

Я пытаюсь заставить работать следующий поток:

  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 голосов
/ 05 февраля 2020

Разработчик Twilio здесь.

Хотя у вас, похоже, работает эта версия вашего потока вызовов, это не лучший способ решения этой проблемы, поскольку у нас теперь <Gather input="speech">.

<Gather> с input, установленным на «речь», транскрибирует пользователя в режиме реального времени, доставляя SpeechResult на ваш следующий URL-адрес webhook (атрибут 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> с транскрипцией.

0 голосов
/ 02 февраля 2020

Когда вы получаете удар по вашему /transcript handler, у вас есть в запросе callSid (CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX) среди других параметров.

С помощью этого 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)

...