Фэндом

Man вики

Синтез и распознавание голоса в Asterisk

41статья на
этой вики
Добавить новую страницу
комментариев5 Поделиться

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}")

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.

Также на Фэндоме

Случайная вики