[Из песочницы] Распознавание речи в Asterisk с использованием Yandex SpeechKit HTTP API

3be3b61b00a69318b930d0b4124ec0f4.jpgСтатья написана по мотивам Синтез и распознавание речи от Google для Asterisk, с не большими изменениями. Для распознавания речи используется платформа Yandex SpeechKit HTTP API.В диалплане все без изменений (пример для extensions.ael, по моему AEL белее удобен чем extensions.conf):

s => { Answer (); Wait (1); Record (/tmp/${UNIQUEID}.wav,3,20); AGI (yandex_voice.php,/tmp/${UNIQUEID}); NoOp (${TEXT}); Hangup (); }; Пример очень примитивен: отвечаем на звонок, ждем 1с., записываем речь, распознаем сказанное, выводим в консоль Asterisk-а распознанный текст, но принцип работы понятен.

Теперь что касается непосредственно самого скрипта.

Для начала немного об используемых переменных:

$key = 'my_secret_key' — это ваш ключ от API, получить его можно написав письмо на speechkit@yandex-team.ru;

$topic = 'maps' — тема для распознавания, возможны следующие варианты:

• freeform — произвольный текст, заметки и т.д. Вариант применения: переводим в текст сообщение голосовой почты и отправляем его на email или виде SMS.• general — web поисковые запросы, не могу придумать к чему это можно применить в данном контексте; • maps — адреса, GEO-точки (название баров, автозаправочные станции, гостиницы и так далее), и т.д.; • music — названия песен, музыкальных групп и т.д.

$lang = 'ru-RU' — язык на котором будет происходить распознавание, на данный момент поддерживается русский 'ru-RU' и турецкий 'tr-TR', причем турецкий поддерживается только для тем «general» и «maps»;

$uuid = '12345678123456781234567812345678' — 32-x цифирная строка, должна быть уникальна для каждого запроса.

Более детально API описано в файле Yandex_SpeechKit_HTTP_API_May[5].pdf который будет отправлен вам вместе с ключом, хотя более короткого мануала по API читать не доводилось, но это и к лучшему.

В моем варианте настройки Asterisk-а файл скрипта находятся в папке: /usr/share/asterisk/agi-bin/

И собственно сам код yandex_voice.php:

#!/usr/bin/php -q

$agivar = explode (':', $agivar); $agivars[$agivar[0]] = trim ($agivar[1]); } extract ($agivars);

$filename = $_SERVER[«argv»][1]; $key = 'my_secret_key'; $topic = «maps»; $lang = «ru-RU»; $uuid = »12345678123456781234567812345678»;

system ('sox '.$filename.'.wav -r 16000 -b 16 -c 1 '.$filename.'-pcm.wav'); $cmd = exec ('curl --silent -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); if (preg_match ('! (.*)! 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); exit (0); ?> Да, код не идеален, его можно и нужно улучшить. Как вариант сделать более универсальным передавая ему большую часть переменных аргументами или использовать его как функцию в другом AGI или ARI скрипте. Как он сейчас у меня и используется, для распознания города в котором находится абонент.

© Habrahabr.ru