Синтез речи и 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)

Когда найду время попробую фестивалить прямо их астериска.

Синтез речи и Asterisk: 1 комментарий

Добавить комментарий