Небольшая заметка о том, как можно проигрывать голос Алисы на терминалах без MajorDroid API.
Из своего скрипта мы заставляем заговорить Алису и тем самым закешировать необходимый нам файл. Например:
$weather = "Погода такая погодная.";
say($weather,1);
В переменной $weather хранится информация о погоде в текстовом виде. Этот текст можно получить как угодно, например из какого либо погодного модуля.
Система проговаривает эту инфу на сервере и тем самым кеширует аудио файл в папку cms/cached/voice/. Теперь для того чтобы узнать имя файла, нам достаточно выполнить функцию:
$md5hash = md5($weather);
То есть в переменной $md5hash будет хранится md5 хеш нашего текста о погоде.
Теперь для того чтобы сформировать ссылку на mp3 файл достаточно такой строки:
$link_on_mp3_file = "http://domain.com/cms/cached/voice/".$md5hash."_yandex.mp3";
Прошу заметить что у меня Яндекс TTS, потому в конце "_yandex.mp3". Как там для других TTS, смотрите у себя в папке cms/cached/voice/.
Теперь имея ссылку на файл с нашим продиктованым текстом, мы можем эту ссылку отправить на проигрывание на нужном нам терминале. Например так:
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$url = "http://domain.com/popup/app_player.html?ajax=1&play_terminal=$terminal&command=refresh&play=".urlencode($link_on_mp3_file);
curl_setopt($ch, CURLOPT_URL, $url);
curl_exec($ch);
curl_close($ch);
В переменной $terminal хранится имя терминала на котором необходимо воспроизвести файл. Можно задать ранее, можно передавать в скрипт как параметр, можно просто вместо имени переменной вручную вписать имя терминала или задать переменную перед запросом:
$terminal = "phone";
Так же можно использовать внутреннюю функцию MajorDomo: getURLBackground и тем самым сократить код. Ниже представлю полный код сценария в двух видах. Какой использовать, решаете Вы сами.
Полный код скрипта с getURLBackground:
$weather = "Погода такая погодная.";
say($weather,1);
$md5hash = md5($weather);
$link_on_mp3_file = "http://domain.com/cms/cached/voice/".$md5hash."_yandex.mp3";
$terminal = "phone";
$url = "http://domain.com/popup/app_player.html?ajax=1&play_terminal=$terminal&command=refresh&play=".urlencode($link_on_mp3_file);
getURLBackground($url);
Полный код скрипта с curl:
$weather = "Погода такая погодная.";
say($weather,1);
$md5hash = md5($weather);
$link_on_mp3_file = "http://domain.com/cms/cached/voice/".$md5hash."_yandex.mp3";
$terminal = "phone";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$url = "http://domain.com/popup/app_player.html?ajax=1&play_terminal=$terminal&command=refresh&play=".urlencode($link_on_mp3_file);
curl_setopt($ch, CURLOPT_URL, $url);
curl_exec($ch);
curl_close($ch);
Ну и если уж совсем хочется сократить код, то можно сделать так:
$weather = "Погода такая погодная.";
say($weather,1);
$md5hash = md5($weather);
$url = "http://domain.com/popup/app_player.html?ajax=1&play_terminal=phone&command=refresh&play=".urlencode("http://domain.com/cms/cached/voice/".$md5hash."_yandex.mp3");
getURLBackground($url);
Ссылка на оригинальный пост с форума: Orange Pi Zero в качестве терминала?