img

Занимательная интеграция Asterisk и Yandex.SpeechKit

21 ноября
20:00
Бесплатный вебинар
Введение в Docker
Ведущий — Филипп Игнатенко.
Руководитель центра разработки
Записаться
img
img

Сегодня хотим рассказать про любопытный сценарий, которой наверняка может быть полезен в сфере E-commerce. Речь пойдет про автоматизацию клиентского обслуживания, а именно:

/p>
  1. Клиент звонит в интернет – магазин и ему предлагают ввести номер заказа;
  2. Введенные абонентом значения по DTMF передаются в AGI скрипт;
  3. По номеру заказа, мы формируем SQL – запрос к базе данных, где храним информацию о заказах. Из соответствующей таблицы мы получаем статус заказа и имя клиента;
  4. Мы формируем строку, которую необходимо озвучить клиенту и отправляем ее на аудио-генерацию в сторону API Yandex.SpeechKit (TTS технология – text to speech);
  5. Получаем аудио файл от Yandex, декодируем его в нужный нам формат (.wav, 8k) и воспроизводим клиенту;
  6. Удаляем воспроизведенный файл и завершаем звонок клиента;

На наш взгляд это любопытная автоматизация. Приступаем к настройке? :)


Получение API - токена Yandex.SpeechKit

Для знакомства с технологией Яндекс предоставляет бесплатный тестовый период в 1 месяц с момента отправки первого запроса. После этого, чтобы продолжить использование Yandex. SpeechKit Cloud нужно заключить договор. Подробности условия использования можно прочитать здесь.

Первым делом перейдите в кабинет разработчика по ссылке https://developer.tech.yandex.ru и нажмите Получить ключ:

 Получить API – ключ Yandex.SpeechKit Cloud
  • Имя ключа - введите имя для ключа. Например, Asterisk + TTS;
  • Подключение - выберите из списка SpeechKit Cloud;
 API  токен Yandex.SpeechKit Cloud

Запоминаем значение, которое выделено красным на скриншоте выше – это и есть ваш токен. Переходим к настройке AGI – скрипта.


Создаем таблицу с заказами

Создадим SQL – таблицу, в которой будем хранить данные о заказах. В лабораторных целях, мы развернем ее на том же хосте, что и IP – АТС Asterisk (+ это снизит задержку и процессинг по времени). Итак, вводим следующие команды в консоли сервера (предварительно подключитесь по SSH):

use asteriskcdrdb;
CREATE TABLE zakazy(name varchar(20),phone varchar(20),nomerzakaza varchar(20),status varchar(20));
INSERT INTO zakazy (name, phone, nomerzakaza, status) VALUES ("Александр", "79257777777", 300388, "Отправлен");
INSERT INTO zakazy (name, phone, nomerzakaza, status) VALUES ("Иван", "79251111111", 476656, "Оплачен");
INSERT INTO zakazy (name, phone, nomerzakaza, status) VALUES ("Сергей", "79252222222", 0089822, "Доставлен");

Мы создали и наполнили таблицу. Теперь необходимо создать пользователя, который сможет иметь SELECT – доступ к таблице:

CREATE USER 'логин_mysql'@'localhost' IDENTIFIED BY 'пароль_mysql';
GRANT SELECT ON asteriskcdrdb.zakazy TO 'логин_mysql';

Запомните ваш логин и пароль и переходите к следующему шагу – адаптации скрипта AGI. Традиционно, комментарии к коду после двойного слеша //:


AGI - скрипт

Ниже представлена структура скрипта:

#!/usr/bin/php -q
<?php
error_reporting(0);
require('phpagi.php');
$agi = new AGI();
$result = $agi->get_data('custom/generate', 6000, 10); //принимаем DTMF от клиента;
$number= $result['result']; //записываем в переменную введенный клиентом номер заказа;
$hostname = "localhost"; // у нас localhost. У вас может быть IP адрес сервера, на котором хранится БД с заказами (настройте предварительно pg_hba.conf на удаленном хосте);
$username = "логин_mysql"; // логин, который вы создали этапом ранее;
$password = "пароль_mysql"; // пароль, который вы создали этапом ранее;
$dbName = "asteriskcdrdb"; 
mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение ");
mysql_select_db($dbName) or die(mysql_error());
$query = "SELECT * FROM zakazy WHERE `nomerzakaza`='$number';"; // подключаемся и парсим данные по номеру заказа;
$res=mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_assoc($res)) {
$status = $row['status'];
$name = $row['name']; // имя и статус, полученные из SQL пишем в переменные;
};
$str = 'Дорогой '.$name.'!    Статус вашего заказа    '.$status.'     Спасибо за обращение, всего доброго!'; // формируем строку, которую необходимо синтезировать;
$qs = http_build_query(array("format" => "wav","lang" => "ru-RU","speaker" => "jane","key" => "ваш_токен","emotion" => "good", "text" => $str)); //описываем переменные, которые будем отправлять в сторону API Яндекса. Вы можете регулировать формат файла, локаль, спикера (мужской или женский голоса) и эмоциональный окрас. Заменить "ваш_токен" на ключ, полученный от API Yandex. SpeechKit Cloud;
$ctx = stream_context_create(array("http"=>array("method"=>"GET","header"=>"Referer: 
")));
$soundfile = file_get_contents("https://tts.voicetech.yandex.net/generate?".$qs, false, $ctx);
$file = fopen("file1.wav", "w");
fwrite($file, $soundfile);
fclose($file); // получаем аудио файл (сохраняем его как file1.wav);
shell_exec('sox -t raw -r 48k -e signed-integer -b 16 -c 1 file1.wav -t wav -r 8k -c 1 /var/lib/asterisk/sounds/ru/custom/output1.wav'); // выполняем преобразование аудио в нужный  для Asterisk аудио-формат и копируем его в директорию /var/lib/asterisk/sounds/ru/custom/;
shell_exec('chown asterisk:asterisk /var/lib/asterisk/sounds/ru/custom/output1.wav');
shell_exec('chmod 775 /var/lib/asterisk/sounds/ru/custom/output1.wav'); // даем файлу нужные пермишны;
$agi->exec('Playback',"custom/output1");  // передаем в AGI команду проиграть полученный аудио – файл;
shell_exec('rm -f /var/lib/asterisk/sounds/ru/custom/output1.wav'); 
shell_exec('rm -f file1.wav'); // удаляем оба файла;

Скачать скрипт AGI
После загрузки файла, сохраните его с расширением .php

Сохраните скрипт под именем tts.php в директории /var/lib/asterisk/agi-bin и дайте следующие команды в консоль сервера:

dos2unix /var/lib/asterisk/agi-bin/tts.php 
chown asterisk:asterisk /var/lib/asterisk/agi-bin/tts.php 
chmod 775 /var/lib/asterisk/agi-bin/tts.php

Адаптируем функционал в «продакшн»

Итак, первым делом, открываем файл /etc/asterisk/extensions_custom.conf для редактирования и добавляем в него следующую запись:

[tts_menu]
exten => s,1,Answer()
exten => s,2,AGI(tts.php)

Очень хорошо. Сделаем вызов кастомного контекста из FreePBX. Для этого воспользуемся модулем Custom Destinations. Переходим по пути AdminCustom Destinations и нажимаем Add Destination:

 Custom Destination для SpeechKit

Нажимаем Submit и Apply Config. Мы хотим чтобы из главного IVR – меню клиент при нажатии 4 мог бы узнать статус своего заказа. Переходим в главный IVR и в секции IVR Entries добавляем следующее:

 TTS в IVR FreePBX

Готово. Если что – либо не получилось, напишите нам в комментариях, постараемся помочь :)

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
DevOps
Скидка 25%
DevOps-инженер с нуля
Научитесь использовать инструменты и методы DevOps для автоматизации тестирования, сборки и развертывания кода, управления инфраструктурой и ускорения процесса доставки продуктов в продакшн. Станьте желанным специалистом в IT-индустрии и претендуйте на работу с высокой заработной платой.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Привет, дорогой читатель! В повседневной работе зачастую не хватает автоматизации. Поэтому, мы решили создать калькулятор инстал
img
Мы подумали, а почему бы не консолидировать все знания по Cisco VoIP продуктам и их настройке в единый документ? Добавить в них
img
Привет! Для удобства, мы структурировали все материалы по графическому интерфейсу FreePBX в нашей базе знаний в единый файл. Сам
img
Вам, как сетевому инженеру, крайне важно разбираться в том, каким образом вызовы VoIP влияют на пропускную способность канала в
img
В этой статье расскажем как отправлять различные СМС сообщения пользователям, позвонившим в контакт-центр Октелл и запросившим т
img
Всем современным кампаниям, производящим товары и оказывающим услуги, необходимо иметь специалистов, работающих с потенциальными
21 ноября
20:00
Бесплатный вебинар
Введение в Docker