Голосовое оповещение с помощью Asterisk AGI.

Для создания вызова asterisk необходимо создать файл вызова /var/spool/asterisk/outgoing/ с разрешением .call и номером телефона в качестве имени.

Для упрощения присвоим номер телефона переменной

$value = '+375290000000';

тогда состав файла должен быть:

'Channel: local/'.$value.'@from-internal
MaxRetries:0
RetryTime:30
WaitTime:30
Callerid:'.$callerid_name.' <'.$callerid_num.'>
Context:'.$context.'
Extension:'.$param.'
Priority:1';

Где в

мы можем передать какой-нибудь параметр, а позже вытащить его в диалплане переменной

, например передадим с помощью нее id сообщения;

— имя вызывающего абонента, будет указан внутри asterisk(во внешних сетях по умолчанию не работает);
[crayon ]callerid_num[/crayon] — номер вызывающего абонента, будет указан внутри asterisk(во внешних сетях по умолчанию не работает);

— контекст, используемый при вызове.

Пример:

Далее необходимо добавить соответствующий контекст(для нашего примера mymessage) в диалплан(extension_custom.conf):

При выполнении

в

передается переменная

(наш текст сообщения).
Скрипты AGI должны находится в /var/lib/asterisk/agi-bin/. Соответственно, для исполнении скрипта на php должен быть установлен интерпретатор php.
Язык вы выбираете сами. На примере с php разберем работу скрипта:

Данные получаются с помощью

, формат данных(пример):

Соответственно последним пунктом(

) и есть переданное сообщение.

Вывод сообщения(воспроизведение) осуществляется по средствам

echo 'STREAM FILE "'.$filename.'" ""'."\n";
fgets(STDIN);

где

— путь к файлу.

И сам скрипт:

#!/usr/bin/php -q
<?php
$agivars = array();
while (!feof(STDIN)) {
    $agivar = trim(fgets(STDIN));
    if ($agivar === '')
        break;
    $agivar = explode(':', $agivar);
    $agivars[$agivar[0]] = trim($agivar[1]);
}
extract($agivars);
 
$text = $_SERVER["argv"][1];
if (isset($_SERVER["argv"][2])) $lang = $_SERVER["argv"][2];
else $lang = 'ru';
 
$md5 = md5($text);
$prefix = '/var/lib/asterisk/festivalcache/';
$filename = $prefix.$md5;
$key = '************************';
if (!file_exists($filename.'.alaw')) {
    $wget = 'wget -U "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5" ';
    $wget.= '"http://tts.voicetech.yandex.net/generate?format=mp3&lang=ru-RU&speaker=zahar&emotion=evil&key='.$key.'&text='.$text.'" -O '.$filename.'.mp3';
    $lame = 'lame --decode '.$filename.'.mp3 '.$filename.'.mp3.wav';
    $sox = 'sox -v 0.5 '.$filename.'.mp3.wav -t wav -2 -r 8000 -c 1 '.$filename.'.wav';
    $exec = $wget.' && '.$lame.' && '.$sox.' && rm '.$filename.'.mp3 '.$filename.'.mp3.wav';
    exec($exec);
}
 
echo 'STREAM FILE "'.$filename.'" ""'."\n";
fgets(STDIN);
 
exit(0);
?>

Для обеспечения работы скрипта, необходимо установить wget, lame:

Sox входит в стандартный дистрибутив elastix 4, его устанавливать не нужно.

При тестировании проверено, что воспроизводятся также и исходные mp3 файлы, однако качество речи значительно хуже.
Пример команды lame:

Пример команды sox:

Не забываем выставить права записи на папку(и создать ее при отсутствии) /var/lib/asterisk/festivalcache/.