Синтез речи и Asterisk
Ради эксперемента решил прикрутить 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) |
Когда найду время попробую фестивалить прямо их астериска.
One thought on “Синтез речи и Asterisk”