Неправильно, правильно будет "Das ist fantastisch".:)
Вид для печати
По началу, когда читал статью о распознавании и синтеза голоса не придал этому значения. И тут я какой-то фильм фантастический смотрю, где ИИ корабля объявляет "Через 30 секунд произойдет ..... и т.д.". И тут меня осенило! А почему я не использую голосовой интерфейс для управления? Еще жена подлила масла.... Решила в ванную сходить в 2 часа ночи (как детишек уложила спать), а тут дом перешел в дежурный режим и после 100 литров расхода воды назвал это событие "Подозрительным расходом воды" и перекрыл подачу воды в дом :) После этого я много узнал о себе нового :)
Объяснять ей, что надо было кнопку нажать или на телефоне кнопку жмакнуть - не смог. Вот и подумал.... ну пусть побеседуют и придут к компромиссному варианту :D
Получаю данные с контроллера по modbus tcp на openhab. Openhab по ssh выполняет на удаленном оповещаетеле (RPi) скрипт синтеза речи на основе сервиса гугла.
Два эксперимента.
http://youtu.be/gkgJD_u0h64?list=UUn...dXdmq2RZO5LnYg
http://youtu.be/L_8_F-Z8sPk
Прошло больше года как начал использовать синтезированную речь.
Сообщений не много. Одна группа сообщений связана с безопасностью. Вторая с авариями в инженерных сетях дома.
От синтезатора гугла отказался и перешел на яндекс.
Синтез происходит следующим образом:
При появлении события, которое необходимо озвучить ПЛК передает информацию на OpenHAB (по modbus TCP).
OH в свою очередь формирует текстовую строку в зависимости от кода события и вызывает php скрипт.
php формирует запрос к Яндексу на синтез. Полученный синтезированный речевой файл передает на asterisk, который воспроизводит его используя функцию интеркома на групповой номер. В группу номеров подключены все имеющиеся телефоны.
Код:<!--?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);
}
?>