¬аш вопрос св€зан с хэштэгами #“елефони€, #FreePBX и Asterisk, #ѕолезные советы? —просите в Telegram!

ћерион Ќетворкс

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

  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: \r\n")));
$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

√отово. ≈сли что Ц либо не получилось, напишите нам в комментари€х, постараемс€ помочь :)


ѕолезна ли ¬ам эта стать€?

–аз в неделю мы отправл€ем дайджест с самыми интересными стать€ми.

P.S. ≈сли укажите свою дату рождени€, то мы об€зательно ¬ас поздравим и подарим небольшой подарок :)

Ќажима€ на кнопку "ѕодписатьс€", вы даете согласие на обработку своих персональных данных