Для создания вызова 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';
Где в
1 |
$param |
мы можем передать какой-нибудь параметр, а позже вытащить его в диалплане переменной
1 |
${EXTEN} |
, например передадим с помощью нее id сообщения;
1 |
$callerid_name |
— имя вызывающего абонента, будет указан внутри asterisk(во внешних сетях по умолчанию не работает);
[crayon ]callerid_num[/crayon] — номер вызывающего абонента, будет указан внутри asterisk(во внешних сетях по умолчанию не работает);
1 |
$context |
— контекст, используемый при вызове.
Пример:
1 2 3 4 5 6 7 8 |
Channel: local/+375290000000@from-internal MaxRetries:0 RetryTime:30 WaitTime:30 Callerid:Name Surname <+375290000000> Context:mymessage Extension:12 Priority:1 |
Далее необходимо добавить соответствующий контекст(для нашего примера mymessage) в диалплан(extension_custom.conf):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[mymessage] ;вывод сообщения в консоль exten => _.,1,NoOp(Выполняю поиск сообщения) ;подключение к БД exten => _.,n,MYSQL(Connect connid *IP* *user* *password* *database* utf8) ;выбираем наше сообщение по указанному id exten => _.,n,MYSQL(Query resultid ${connid} SELECT id,message from `ats.call_message` where id like '${EXTEN}') ;получаем в переменную ${message} текст из ячейки message таблицы ats.call_message, где id строки соответствует Extension из файла .call exten => _.,n,MYSQL(Fetch fetchid ${resultid} id message) ;увеличиваем звук exten => _.,n,Set(VOLUME(TX)=7) ;говорим приветствие, с помощью скрипта AGI exten => _.,n,AGI(say.php,"Сообщение от Сергей Дудко") ;ждем 1 сек exten => _.,n,Wait(1) ;говорим сообщение, с помощью скрипта AGI exten => _.,n,AGI(say.php,"${message}") ;вешаем трубку exten => h,1,Hangup() |
При выполнении
1 |
AGI(say.php,"${message}") |
в
1 |
say.php |
передается переменная
1 |
${message} |
(наш текст сообщения).
Скрипты AGI должны находится в /var/lib/asterisk/agi-bin/. Соответственно, для исполнении скрипта на php должен быть установлен интерпретатор php.
Язык вы выбираете сами. На примере с php разберем работу скрипта:
Данные получаются с помощью
1 |
STDIN |
, формат данных(пример):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
agi_request: say.php agi_channel: IAX2/GSMOUT_NeoGate-898 agi_language: ru agi_type: IAX2 agi_uniqueid: 1508227379.792 agi_version: 11.25.0 agi_callerid: +375290000000 agi_calleridname: Name Surname agi_callingpres: 0 agi_callingani2: 0 agi_callington: 0 agi_callingtns: 0 agi_dnid: unknown agi_rdnis: unknown agi_context: mymessage agi_extension: 8 agi_priority: 8 agi_enhanced: 0.0 agi_accountcode: agi_threadid: 140369217062656 agi_arg_1: тестовое уведомление |
Соответственно последним пунктом(
1 |
agi_arg_1 |
) и есть переданное сообщение.
Вывод сообщения(воспроизведение) осуществляется по средствам
echo 'STREAM FILE "'.$filename.'" ""'."\n"; fgets(STDIN);
где
1 |
$filename |
— путь к файлу.
И сам скрипт:
#!/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:
1 |
yum install wget lame -y |
Sox входит в стандартный дистрибутив elastix 4, его устанавливать не нужно.
При тестировании проверено, что воспроизводятся также и исходные mp3 файлы, однако качество речи значительно хуже.
Пример команды lame:
1 |
lame --decode /var/lib/asterisk/festivalcache/name.mp3 /var/lib/asterisk/festivalcache/name.mp3.wav |
Пример команды sox:
1 |
sox -v 0.5 /var/lib/asterisk/festivalcache/name.mp3.wav -t alaw -2 -r 8000 -c 1 /var/lib/asterisk/festivalcache/name.wav |
Не забываем выставить права записи на папку(и создать ее при отсутствии) /var/lib/asterisk/festivalcache/.