Код: Выделить всё
#!/usr/bin/php
-- генерация голоса из текста. Яндекс сильно удивил качеством.
<?php
require('/var/lib/asterisk/agi-bin/phpagi/phpagi.php');
$agi = new AGI();
$filename = $_SERVER["argv"][1];
$text=urlencode("Вы позвонили в компанию Рога-Копыта. Оставайтесь на линии. Вам ответит первый освободившийся оператор.");
$format="wav";
$lang="ru-RU";
$key="my-key-get-from-yandex";
#$speaker="zahar";
$speaker="ermil";
#$speaker="jane";
#$speaker="omazh";
$emotion="good";
#$emotion="neutral";
#$emotion="evil";
#$emotion="mixed";
$robot="false";
#$robot="true";
$url="https://tts.voicetech.yandex.net/generate?text=$text&format=$format&lang=$lang&speaker=$speaker&emotion=$emotion&key=$key&robot=$robot";
file_put_contents("/tmp/$filename.wav", file_get_contents("$url"));
exec("/usr/bin/sox /tmp/$filename.wav -A -t RAW -r 8000 -c 1 $filename.alaw");
unlink("/tmp/$filename.wav");
$agi->exec("playback","/tmp/$filename");
unlink("/tmp/$filename.alaw");
?>
---- распознование
Код: Выделить всё
#!/usr/bin/php
<?php
require('/var/lib/asterisk/agi-bin/phpagi/phpagi.php');
$agi = new AGI();
$filename = $_SERVER["argv"][1];
#$filename = '12345';
$fp = fopen('/tmp/counter.txt', 'w+');
# тут один хитрый маневр сделал, яндекс просит 32-значное 16-ричное число, а hash md5 нам именно такое число и дает, и вот что б не мучится не генерить, просто берем уникальный идентификатор звонка и хэшируем его черем мд5
$uuid=md5($filename);
$topic="queries";
$lang="ru-RU";
$key="my-key-get-from-yandex";
$agi->record_file("/tmp/$filename","wav","#","10000","4");
$agi->NoOp();
#$agi->exec("playback","/tmp/$filename");
exec("/usr/bin/sox /tmp/$filename.wav -r 16000 -b 16 -c 1 /tmp/$filename-pcm.wav");
$cmd = exec("curl --silent -F \"Content-Type=audio/x-pcm;bit=16;rate=16000\" -F \"audio=@/tmp/$filename-pcm.wav\" \"asr.yandex.net/asr_xml?key=$key&uuid=$uuid&topic=$topic&lang=$lang\"", $xml);
$test = fwrite($fp, "curl --silent -F \"Content-Type=audio/x-pcm;bit=16;rate=16000\" -F \"audio=@/tmp/$filename-pcm.wav\" asr.yandex.net/asr_xml?key=$key&uuid=$uuid&topic=$topic&lang=$lang");
$res_xml = implode($xml);
if (preg_match('!<variant .*?>(.*)</variant>!si', $res_xml, $arr)) $voice_text = $arr[1];
else $voice_text='';
echo 'SET VARIABLE TEXT "'.$voice_text.'"'."\n";
fgets(STDIN);
echo 'VERBOSE ("'.$voice_text.'")'."\n";
fgets(STDIN);
fclose($fp);
exit(0);
#unlink("/tmp/$filename.wav");
?>
скрипты сырые, но рабочие, на их базе можно много что интересного сделать.