#!/usr/bin/php -q 999,1,Answer #exten => 999,n,Record(/tmp/${UNIQUEID}.wav,3,20); #exten => 999,n,AGI(yandex.php,/tmp/${UNIQUEID}); #exten => 999,n,NoOp(${TEXT}); #exten => 999,n,Dial(sip/${DB(firma/${TEXT})}). #exten => 999,n,Hangup #получаем переменные из AGI $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]; #ключ от yandex speech kit можно получить на: #https://developer.tech.yandex.ru/ #требуется учётка яндекса $key = '6be78e3c-6184-4f83-b18d-cf33c6727735'; #$topic = 'maps' — тема для распознавания, возможны следующие варианты: #• freeform — произвольный текст, заметки и т.д. Вариант применения: переводим в текст сообщение голосовой почты и отправляем его на email или виде SMS. #• general — web поисковые запросы, не могу придумать к чему это можно применить в данном контексте; #• maps — адреса, GEO-точки (название баров, автозаправочные станции, гостиницы и так далее), и т.д.; #• music — названия песен, музыкальных групп и т.д. $topic = "freeform"; #$lang = 'ru-RU' — язык на котором будет происходить распознавание, на данный момент поддерживается русский 'ru-RU' и турецкий 'tr-TR', причем турецкий поддерживается только для тем «general» и «maps»; $lang = "ru-RU"; #генерация рандомного ID $randtoken=rand(1000); $uuid=md5($randtoken); #перекодируем файл в формат яндекса system('sox '.$filename.'.wav -r 16000 -b 16 -c 1 '.$filename.'-pcm.wav'); #отсылаем файл и получаем в ответ xml $cmd = exec('curl -F "Content-Type=audio/x-pcm;bit=16;rate=16000" -F "audio=@'.$filename.'-pcm.wav" asr.yandex.net/asr_xml\?key='.$key.'\&uuid='.$uuid .'\&topic='.$topic.'\&lang='.$lang, $xml); #дербаним регекспом ответ сервера, выдёргиваем первое значение как наиболее релевантное $asr_res = implode($xml); if (preg_match('!(.*)!si', $asr_res, $arr)) $voice_text = $arr[1]; else $voice_text=''; if (intval(substr_count($asr_res, 'оператор')) > 0) { $ress = 1; #если в результатах есть слово "оператор", то в диалплан возвращаем 1; } elseif (intval(substr_count($asr_res, 'заказ')) > 0) { $ress = 2; #если в результатах есть слово "заказ", то в диалплан возвращаем 2; } elseif (intval(substr_count($asr_res, 'секретарь')) > 0) { $ress = 3; #если в результатах есть слово "секретарь", то в диалплан возвращаем 3; } else { $ress = 0; #если совпадения не найдено, то 0; } #передаём ответ от скрипта в поток ввода echo 'SET VARIABLE TEXT "'.$ress.'"'."\n"; fgets(STDIN); echo 'VERBOSE ("'.$ress.'")'."\n"; fgets(STDIN); exit(0);