Данная статья приводит пример интеграции ip атс asterisk и SpeechKit Cloud от Yandex . Мы расскажем как автоматизировать процесс получения информации о заказе, сделанном в интернет магазине.
Первым делом получаем тестовый api-key, в кабинете разработчика яндекс.
Переходим к созданию файла order_info.php и его наполнению:
1 2 |
touch /var/lib/asterisk/agi-bin/tts.php nano /var/lib/asterisk/agi-bin/tts.php |
Пишем в только что созданный файл php код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
#!/usr/bin/php -q <?php /*Ловим ошибки*/ ini_set('display_errors',1); error_reporting(E_ALL); /*Включаем файл phpagi.php*/ require('phpagi.php'); $agi = new AGI(); /*Установка временной зоны*/ date_default_timezone_set('UTC'); /*Получение номера звонящего*/ $callid = $argv[1]; /*Формируем набор данных */ $dsn = 'mysql:dbname=info_orders;host=127.0.0.1;charset=utf8'; /*Пользователь БД*/ $user = 'ПОЛЬЗОВАТЕЛЬ_БД'; /*Пароль БД*/ $password = 'ПАРОЛЬ_БД'; /* Подключение к БД */ try { $dbh = new PDO($dsn, $user, $password); } catch (PDOException $e) { echo 'Подключение не удалось: ' . $e->getMessage(); }; /* Парсим таблицу для подстановки имени звонящего и узнаем статус его заказа*/ $sql = $dbh->query("SELECT * FROM orders WHERE phone = ".$callid); while ($row = $sql->fetch()) { $status = $row['status']; $name = $row['name']; $nomerzakaza = $row['nomerzakaza']; }; /* Определение времени суток для приветсвия звонящего*/ $morning = "Доброе утро!"; $day = "Добрый день!"; $evening = "Добрый вечер!"; $night = "Доброй ночи!"; $minyt = date("i"); $chasov = date("H"); if($chasov >= 04) {$hello = $morning;} if($chasov >= 10) {$hello = $day;} if($chasov >= 16) {$hello = $evening;} if($chasov >= 22 or $chasov < 04) {$hello = $night;} /*Формируем строку, для передачи ее в YANDEX.SPEECHKIT и синтезирования речи*/ $str = "'$hello' .'$name'. .Статус вашего заказа. '".tochka($nomerzakaza)."' '.$status.'"; $qs = http_build_query(array("format" => "wav","lang" => "ru-RU","speaker" => "jane","key" => "API-КЛЮЧ","emotion" => "good", "text" => $str)); /* Передача строки в YANDEX.SPEECHKIT */ $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); /* Преобразование звукового файла в нужный формат */ 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/custom/output1.wav'); /* Меняем владельца файла */ shell_exec('chown asterisk:asterisk /var/lib/asterisk/sounds/custom/output1.wav'); /* Даем нужные права*/ shell_exec('chmod 775 /var/lib/asterisk/sounds/custom/output1.wav'); /*Выполняем команду для проигрывания полученного файла*/ $agi->exec('Playback',"custom/output1"); /* Удаляем оба файла */ shell_exec('rm -f /var/lib/asterisk/sounds/custom/output1.wav'); shell_exec('rm -f file1.wav'); /*Ставим точки после каждой цифры, для синтеза номера заказа*/ function tochka($int){ $str = (string) $int; $nstr = ''; for ($i = 0, $j = strlen($str); $i < $j; $i++) { if ($i == 0) $nstr.=$str[$i]; else $nstr.=' .'.$str[$i]; } return (string)$nstr; } ?> |
После редактирования файла даем ему нужные права:
1 2 |
chown asterisk:asterisk /var/lib/asterisk/agi-bin/tts.php chmod 775 /var/lib/asterisk/agi-bin/tts.php |
Далее открываем файл extensions_custom.conf (особые внутренние номера) :
1 |
nano /etc/asterisk/extensions_custom.conf |
И вписываем в него:
1 2 3 4 |
[tts_menu] exten => s,1,Answer() exten => s,n,SET(VAR1=${CALLERID(num)}) exten => s,n,AGI(tts.php,${VAR1}) |
Далее заходим в веб интерфейс freepbx и переходим в дополнительные назначения (custom destination). Добавляем вызов для только что созданного контекста.
Переходим в редактирование основного IVR и добавляем пункт интерактивного меню, где в назначении выбираем особое назначение (custom destination) и выбираем наше созданное назначение.
На данном этапе внедрение синтезатора речи завершено.
Мы научили asterisk взаимодействовать с базой данных, с помощью AGI скриптов.
Основой написания статьи послужил мануал http://wiki.merionet.ru
1 комментарий
Комментарии закрыты.