javascript

ИИ продает пиццу или как Voximplant дружит с Dialogflow

  • суббота, 9 июня 2018 г. в 00:16:45
https://habr.com/company/Voximplant/blog/412663/
  • Разработка мобильных приложений
  • Разработка веб-сайтов
  • Программирование
  • JavaScript
  • Блог компании Voximplant


Недавно мы презентовали решение для бизнеса, которое назвали Dialogflow Connector: связка из гугловского Dialogflow и нашего облака Voximplant. Коннектор может работать вместо оператора колл-центра и принимать сложные заказы. Это стало возможным, потому что Dialogflow позволяет уйти от сценария обычного IVR, где клиент вынужден называть слова из заданного набора, на который умеет реагировать интерактивное меню. Гугловская платформа может последовательно получать входные данные от клиента и собирать их воедино – например, чтобы сформировать заказ в интернет-магазине. Вероятно, вы уже слышали модное слово “slot filling”, так вот это он и есть. Под катом вас ждут подробности, как мы делали бота для заказа пиццы – по аналогии вы можете запилить нечто похожее и возрадоваться, что времена лифта и “eleven” давно прошли…

Номер телефона


Для начала следует арендовать виртуальный номер, на который будет “отвечать” бот. Для этого в админке Voximplant в меню “Номера” щелкните “Купить номер телефона”.


На новом экране щелкните поставьте переключатель в позицию “Тестовые номера” – это позволит арендовать виртуальный номер.


Виртуальные номера очень дешевы и позволяют полноценно протестировать любое решение на нашей платформе. Арендуйте номер и далее…

… создайте сценарий


Теперь нам нужен облачный сценарий, сердце нашего решения. Именно он будет принимать звонок, распознавать речь и передавать ее в Dialogflow. На вкладке Сценарии нажмите “Создать сценарий”, дайте ему имя – например, dialogflow – и нажмите “Создать”. Время писать код!

Подключим модуль AI – в нем лежат методы и события для Dialogflow – а также модуль распознавания речи и плеер. Объявим переменные и хитрую функцию wordend, которая принимает на вход количество (пицц) и массив со словами ('маргариту', 'маргариты', 'маргарит') и возвращает слово, подходящее цифре по падежу. Это нужно, чтобы бот не говорил “4 маргарита”, а грамотно выдавал “4 маргариты”.

require(Modules.AI);
require(Modules.ASR);
require(Modules.Player);

let mycall = null, 
    voice = Language.Premium.US_ENGLISH_FEMALE3,
    account_name = "",
    dialed_number = "",
    caller_id = "",
    flow,
    lastText = '',
    player

function wordend(num, words) {
    return words[ ((num=Math.abs(num%100)) > 10 && num < 15 || (num%=10) > 4 || num === 0) + (num !== 1) ];
}

Теперь добавим хендлер для входящего звонка и вспомогательную функцию startASR:

VoxEngine.addEventListener(AppEvents.CallAlerting, (e) => {

  mycall = e.call;
  mycall.addEventListener(CallEvents.Connected, handleCallConnected);
  
  account_name = e.toURI.substring(e.toURI.indexOf('.') + 1);
  account_name = account_name.substring(0, account_name.indexOf('.'));
  dialed_number = e.destination;
  caller_id = e.callerid;
  
  mycall.answer();

});

function startASR() {
  mycall.removeEventListener(CallEvents.PlaybackFinished, startASR);   
  mycall.sendMediaTo(flow);
}

Когда происходит событие Connected, вызывается функция handleCallConnected. Собственно в ней и происходит весь фарш:

  • создается объект Dialogflow;
  • синтезированный голос приветствует клиента и предлагает сделать заказ;
  • запускается распознавание, клиент делает заказ;
  • слова клиента передаются в Dialogflow, происходит слот филлинг;
  • синтезированный голос озвучивает заказ и адрес клиента;
  • бот кладет трубку, сессия закрывается.

Листинг функции:

handleCallConnected