Ради эксперемента решил прикрутить Festival к Asterisk, но что-то он не завелся.
Пока-что у меня это дело работает через несколько костылей.
Вот что получилось.
Устанавливаем фестиваль
emerge -av app-accessibility/festival-ru
простая конфигурация
cat server.scm
(set! server_max_clients 10)
(set! server_port 1314)
(set! server_log_file "/var/log/festival/festival.log")
(set! server_access_list '("[^.]+" "127.0.0.1" "localhost" ))
(set! server_deny_list nil)
Просто проигрывать фразу “Привет” не интересно, интереснее слушать прогноз погоды 🙂
С помощью спонсора программы – gismeteo, будем генерировать файл прогноза на 2 дня.
Для это используем xml, который распарсиваем с помощью php
Скрипт на PHP
cat weather.php
$source = 'http://informer.gismeteo.ru/xml/33345_1.xml';
$weekday = array('','В воскресенье','В понедельник','Во вторник','В среду','В чертверг','В пятницу','В субботу');
$tod = array(' ночью ',' утром ',' днём ',' вечером ');
$cloudiness = array(' ясно ', ' малооблачно ', ' облачно ', ' пасмурно ');
$precipitation = array(4=>'дождь', 5=>'ливень', 6=>'снег', 7=>'снег', 8=>'гроза', 9=>'нет данных', 10=>'без осадков');
$xmlstr = '';
$fp = fopen($source, 'r');
if ( $fp ) {
while (!feof($fp)) $xmlstr.= fread($fp, 8192);
$xml = new SimpleXMLElement($xmlstr);
$town = $xml->REPORT->TOWN[0];
foreach ($xml->REPORT->TOWN->FORECAST as $f) {
echo $weekday[intval($f['weekday'])]." ". $tod[intval($f['tod'])]."\n";
echo 'Температура воздуха '.$f->TEMPERATURE['min'].' '.$f->TEMPERATURE['max']." градусов цельсия\n";
echo $cloudiness[intval($f->PHENOMENA['cloudiness'])]."\n";
echo $precipitation[intval($f->PHENOMENA['precipitation'])]."\n\n\n\n\n";
}
}
?>
На выходе будем получать такой ответ в STDOUT :
В субботу днём
Температура воздуха 27 29 градусов цельсия
ясно
без осадков
В субботу вечером
Температура воздуха 20 22 градусов цельсия
ясно
без осадков
В воскресенье ночью
Температура воздуха 13 15 градусов цельсия
ясно
без осадков
В воскресенье утром
Температура воздуха 21 23 градусов цельсия
ясно
без осадков
Теперь наша задача скормить эту фразу в Festival:
cat weather.sh
#!/bin/bash
php /etc/asterisk/script/weather.php | /usr/bin/text2wave -F 8000 -o /var/lib/asterisk/sounds/ru/weather_kyiv.wav -eval "(voice_msu_ru_nsh_clunits)"
После отрабатывания скрипта у нас появится аудио-файл с прогнозом.
Осталось его проиграть 🙂
Вариант №1
extensions.conf
exten => 1000,1,Answer()
exten => 1000,n,Wait(1)
exten => 1000,n,System(/etc/asterisk/script/weather.sh)
exten => 1000,n,Playback(weather)
Плохой вариант, так как для каждого звонка будет заново генерироваться прогноз, что нагружает сервер.
Вариант №2
Скрипт /etc/asterisk/script/weather.sh ставим в crontab с нужной периодичностью и прогрываем файл
extensions.conf
exten => 1000,1,Answer()
exten => 1000,n,Wait(1)
exten => 1000,n,Playback(weather)
Когда найду время попробую фестивалить прямо их астериска.
Сповіщення: Блог системного администратора » Прогноз погоды от робота