| Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
яндекс_голос [2015/08/28 09:59] 83.220.55.174 |
яндекс_голос [2015/08/28 12:59] (текущий) |
| скрипт php-agi. | #!/usr/bin/php -q |
| | <?php |
| | #Требуется пакет SOX |
| |
| ''#!/usr/bin/php -q\\ | |
| <?php\\ | |
| #Требуется пакет SOX \\ | |
| |
| | #Пример вызова из dialplan |
| | #;Voice Module |
| | #exten => _504,1,Answer |
| | #exten => _504,n,Record(/tmp/${UNIQUEID}.wav,3,20); |
| | #exten => _504,n,AGI(yandex-voice2.php,/tmp/${UNIQUEID}); |
| | #exten => _504,n,NoOp(${TEXT}); |
| | #exten => _504,n,Hangup |
| |
| #Пример вызова из dialplan\\ | |
| #;Voice Module\\ | |
| #exten => _504,1,Answer\\ | |
| #exten => _504,n,Record(/tmp/${UNIQUEID}.wav,3,20);\\ | |
| #exten => _504,n,AGI(yandex-voice2.php,/tmp/${UNIQUEID}); \\ | |
| #exten => _504,n,NoOp(${TEXT});\\ | |
| #exten => _504,n,Hangup\\ | |
| |
| |
| | #получаем переменные из AGI |
| | $agivars = array(); |
| | while (!feof(STDIN)) { |
| | $agivar = trim(fgets(STDIN)); |
| | if ($agivar === '') |
| | break; |
| |
| #получаем переменные из AGI \\ | $agivar = explode(':', $agivar); |
| $agivars = array();\\ | $agivars[$agivar[0]] = trim($agivar[1]); |
| while (!feof(STDIN)){ \\ | } |
| $agivar = trim(fgets(STDIN)); \\ | extract($agivars); |
| if ($agivar === '')\\ | |
| break;\\ | |
| |
| $agivar = explode(':', $agivar); \\ | $filename = $_SERVER["argv"][1]; |
| $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'; |
| |
| #ключ от yandex speech kit можно получить на:\\ | |
| #https://developer.tech.yandex.ru/\\ | |
| #требуется учётка яндекса\\ | |
| $key = '6be78e3c-6184-4f83-b18d-cf33c6727735';\\ | |
| |
| \\ | #$topic = 'maps' — тема для распознавания, возможны следующие варианты: |
| #$topic = 'maps' — тема для распознавания, возможны следующие варианты:\\ | #• freeform — произвольный текст, заметки и т.д. Вариант применения: переводим в текст сообщение голосовой почты и отправляем его на email или виде SMS. |
| #• freeform — произвольный текст, заметки и т.д. Вариант применения: переводим в текст сообщение голосовой почты и отправляем его на email или виде SMS.\\ | #• general — web поисковые запросы, не могу придумать к чему это можно применить в данном контексте; |
| #• general — web поисковые запросы, не могу придумать к чему это можно применить в данном контексте;\\ | #• maps — адреса, GEO-точки (название баров, автозаправочные станции, гостиницы и так далее), и т.д.; |
| #• maps — адреса, GEO-точки (название баров, автозаправочные станции, гостиницы и так далее), и т.д.;\\ | #• music — названия песен, музыкальных групп и т.д. |
| #• music — названия песен, музыкальных групп и т.д.\\ | $topic = "freeform"; |
| $topic = "freeform";\\ | |
| |
| #$lang = 'ru-RU' — язык на котором будет происходить распознавание, на данный момент поддерживается русский 'ru-RU' и турецкий 'tr-TR', причем турецкий поддерживается только для тем «general» и «maps»;\\ | #$lang = 'ru-RU' — язык на котором будет происходить распознавание, на данный момент поддерживается русский 'ru-RU' и турецкий 'tr-TR', причем турецкий поддерживается только для тем «general» и «maps»; |
| $lang = "ru-RU";\\ | $lang = "ru-RU"; |
| |
| #генерация рандомного ID \\ | #генерация рандомного ID |
| $randtoken=rand(1000);\\ | $randtoken=rand(1000); |
| $uuid=md5($randtoken);\\ | $uuid=md5($randtoken); |
| |
| #перекодируем файл в формат яндекса\\ | #перекодируем файл в формат яндекса |
| system('sox '.$filename.'.wav -r 16000 -b 16 -c 1 '.$filename.'-pcm.wav');\\ | system('sox '.$filename.'.wav -r 16000 -b 16 -c 1 '.$filename.'-pcm.wav'); |
| |
| #отсылаем файл и получаем в ответ xml\\ | #отсылаем файл и получаем в ответ 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); | $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); |
| |
| #дербаним регекспом ответ сервера, выдёргиваем первое значение как наиболее релевантное\\ | #дербаним регекспом ответ сервера, выдёргиваем первое значение как наиболее релевантное |
| $res_xml = implode($xml);\\ | $res_xml = implode($xml); |
| if (preg_match('!<variant .*?>(.*)</variant>!si', $res_xml, $arr)) $voice_text = $arr[1];\\ | if (preg_match('!<variant .*?>(.*)</variant>!si', $res_xml, $arr)) $voice_text = $arr[1]; |
| else $voice_text='';\\ | else $voice_text=''; |
| | |
| #передаём ответ от скрипта в поток ввода\\ | #передаём ответ от скрипта в поток ввода |
| echo 'SET VARIABLE TEXT "'.$voice_text.'"'."\n";\\ | echo 'SET VARIABLE TEXT "'.$voice_text.'"'."\n"; |
| fgets(STDIN);\\ | fgets(STDIN); |
| echo 'VERBOSE ("'.$voice_text.'")'."\n";\\ | echo 'VERBOSE ("'.$voice_text.'")'."\n"; |
| fgets(STDIN);\\ | fgets(STDIN); |
| exit(0);\\ | exit(0); |
| ?>\\ | ?> |
| '' | |