Код:
<!--?php
###################################################
# Ubuntu 16.04/ PHP7
#
# Скрипт получает на входе текстовую строку,
# синтезирует из нее речевой аудиофайл,
# копирует полученный файл на сервер asterisk
# подключается к asterisk ami и воспроизводит файл/
#
# Для работы скрипта требуется установить php-ssh2
#
# sudo apt-get update
# sudo apt-get install php-ssh2
# Сервер на котором запускается php и сервер
# asterisk - на разных ip
###################################################
# --- Входные переменные ---
$speaker = $_REQUEST['speaker']; // Голоса: Женские - jane, oksana, alyss omazh, Мужские - zahar, ermil
$emotion = $_REQUEST['emotion']; // Эмоциональная окраска голоса. Возможные значения:
// good — радостный, доброжелательный
// evil — раздраженный
// neutral — нейтральный (используется по умолчанию)
$speech = $_REQUEST['speech']; // имя файла синтезированного текста (file.mp3)
$text = $_REQUEST['text']; // Синтезируемый текст
# --- настройка Asterisk ---
$strhost = "192.168.1.11"; // Адрес сервера FreePBX
$strport = "5038"; // Порт AMI
$timeout = "100";
$ami_user = "openhab\r\n"; // Пользователь AMI интерфейса FreePBX
$ami_password = "password\r\n";// Пароль AMI
$ssh_user = "user";
$ssh_password = "password";
$errno=0 ;
$errstr=0 ;
# ------ Настройки Yandex.Speech ---------------
$KeyCode="2a4c42ce-b445-43d8-b5a7-88f6cee9c1221a"; // API Key Yandex.Speech
if (empty($speaker)) { $speaker = "omazh"; }; // значения по умолчанию
if (empty($emotion)) { $emotion = "evil"; }; // значения по умолчанию
if (empty($speech)) { $speech = "speech.mp3"; }; // значения по умолчанию
if (empty($text)) { $text = "Внимание! Обнаружено нарушение периметра безопасности!"; }; // значения по умолчанию
$SpeechFile="/tmp/$speech"; // Путь/Имя файла в который будет записана синтезируемая речь
echo "$SpeechFile \r\n";
$qs = http_build_query(array("format" => "mp3","lang" => "ru-RU","speaker" => $speaker,"key" =>$KeyCode,"emotion" => $emotion, "text" => $text));
$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);
$i=file_put_contents($SpeechFile, $soundfile);
echo("i=$i \r\n");
// Если синтезировали речь - копируем полученный файл на FreePBX
if ( $i > 0 ) {
// Подключаемся к серверу по ssh
if ($connection = ssh2_connect($strhost, 22)) {
echo "Connection Successful!\r\n";
} else {
die("Connection Failed...\r\n");
};
// авторизуемся на сервере
if (ssh2_auth_password($connection, $ssh_user, $ssh_password)) {
echo "Authentication Successful!\r\n";
} else {
die("Authentication Failed...\r\n");
}
// Копируем файл на FreePBX
ssh2_scp_send($connection, $SpeechFile, "/tmp/$speech", 0644); // /tmp/$speech - каталог должен совпадать с каталогом из контекста
// /etc.asterisk/extention_custom.conf -> pa-custom -> Playback(/tmp/${var1})
if (!$connection) die('Send failed');
};
#-------------- вызываем asterisk AMI и воспроизводим синтезированный аудиофайл---------------------
$var1 = basename($speech, '.mp3') + "\r\n\r\n"; // для asterisk требуется имя без расширения
$sconn = fsockopen ($strhost, $strport, $$errno, $$errstr, $timeout) or die("Connection to $strhost:$strport failed");
if (!$sconn) { echo "$errstr ($errno)
\n"; }
else {
fputs ($sconn, "Action: login\r\n");
fputs ($sconn, "Username: $ami_user");
fputs ($sconn, "Secret: $ami_password");
fputs ($sconn, "Events: off\r\n\r\n");
usleep(500);
fputs ($sconn, "Action: Originate\r\n");
fputs ($sconn, "Channel: Local/590@from-internal\r\n");
fputs ($sconn, "Callerid: OpenHAB\r\n");
fputs ($sconn, "Timeout: 15000\r\n");
fputs ($sconn, "Context: pa-custom\r\n");
fputs ($sconn, "Exten: 577\r\n");
fputs ($sconn, "Priority: 1\r\n\r\n");
fputs ($sconn, "Async: yes\r\n\r\n" );
fputs ($sconn, "Variable: var1=$var1" );
fputs ($sconn, "Action: Logoff\r\n\r\n");
usleep (500);
fclose ($sconn);
}
?>