ФЭНДОМ


Google и AsteriskПравить

Взято тут: http://habrahabr.ru/post/133869/

Устанавливаем необходимые компонентыПравить

Нужные и/или полезные компоненты из репозитория Ubuntu 12.04

apt-get update
apt-get install libasterisk-agi-perl lamp-server^ ffmpeg flac php5-curl


(i) Обратите внимание, что Asterisk уже должен быть установлен и настроен, а сервер иметь быстрый и стабильный доступ в Интернет

Синтез голосаПравить

Создаём файл под скрипт

nano /usr/share/asterisk/agi-bin/say.php

Наполняем созданный файл данным содержанием

#!/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;
 
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://translate.google.com/translate_tts?q='.$text.'&tl='.$lang.'" -O '.$filename.'.mp3';
    $ffmpeg = 'ffmpeg -i '.$filename.'.mp3 -ar 8000 -ac 1 -ab 64 '.$filename.'.wav -ar 8000 -ac 1 -ab 64 -f alaw '.$filename.'.alaw -map 0:0 -map 0:0';
    $exec = $wget.' && '.$ffmpeg.' && rm '.$filename.'.mp3 '.$filename.'.wav';
    exec($exec);
}
 
echo 'STREAM FILE "'.$filename.'" ""'."\n";
fgets(STDIN);
exit(0);
?>

Создаем папку для кеша и назначаем права

mkdir /var/lib/asterisk/festivalcache/
chmod -R 777 /var/lib/asterisk/festivalcache/
chmod +x /usr/share/asterisk/agi-bin/say.php

Распознавание голосаПравить

Создаем файл

nano /usr/share/asterisk/agi-bin/voice.php

Наполняем созданный файл данным содержанием

#!/usr/bin/php -q
<?
$agivars = array();
while (!feof(STDIN)) {
    $agivar = trim(fgets(STDIN));
    if ($agivar === '')
        break;
 
    $agivar = explode(':', $agivar);
    $agivars[$agivar[0]] = trim($agivar[1]);
}
extract($agivars);
 
$filename = $_SERVER["argv"][1];
 
exec('flac -f -s '.$filename.'.wav -o '.$filename.'.flac');
 
$file_to_upload = array('myfile'=>'@'.$filename.'.flac');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU");
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: audio/x-flac; rate=8000"));
curl_setopt($ch, CURLOPT_POSTFIELDS, $file_to_upload);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$result=curl_exec ($ch);
curl_close ($ch);
 
$json_array = json_decode($result, true);
$voice_cmd = $json_array["hypotheses"][0]["utterance"];
 
unlink($filename.'.flac');
unlink($filename.'.wav');
 
echo 'SET VARIABLE VOICE "'.$voice_cmd.'"'."\n";
fgets(STDIN);
echo 'VERBOSE ("'.$voice_cmd.'")'."\n";
fgets(STDIN);
exit(0);
?>

Делаем созданный скрипт исполняемым

chmod +x /usr/share/asterisk/agi-bin/voice.php

Для задействования созданных AGI скриптов перезагрузим Asterisk

/etc/init.d/asterisk restart

ПримерыПравить

  • Простой пример для проверки синтеза голоса
nano /etc/asterisk/extensions.conf
exten => _.,1,Answer()
exten => _.,n,Wait(1)
exten => _.,n,AGI(say.php,"привет вам земляне‚!")
  • Пример совместного использования синтеза и распознавания голоса
nano /etc/asterisk/extensions.conf
exten => _.,1,Answer
exten => _.,n,Wait(1)
exten => _.,n,AGI(say.php,"Здравствуйте‚!")
exten => _.,n,AGI(say.php,"скажите имя сотрудника!") #Запись услышанного
exten => _.,n,Record(/tmp/${UNIQUEID}.wav,3,20)  #Запись услышанного
exten => _.,n,AGI(say.php,"!вы сказали")
exten => _.,n,Playback(/tmp/${UNIQUEID})
exten => _.,n,AGI(voice.php,/tmp/${UNIQUEID})
exten => _.,n,AGI(say.php,"я услышала")
exten => _.,n,AGI(say.php,"${VOICE}")