План этой ветки:
- Постоянно слушаем микрофон в поисках ключевого слова.
Распознавание должно быть локально. - При срабатывании пишем звук в файл до тишины и отправляем на распознавание.
Пока что кроме гугла ничего не приходит на ум. Локальных приемлемых вариантов я пока что не нашел. - Полученный текст отправляем в метод commandReceived
При таком варианте голосовой сервис будет не отдельной игрушкой, а винтиком в системе.
Нам требуется решить три задачи:
1. Локальное распознавание ключевого слова.
2. Запись FLAC с требуемыми параметрами.
3. Распознавание файла.
Сегодня мне удалось собрать материал для отправки звукового файла в гугл и получения текста. Надо сказать, что результатами я доволен. Дальнейшая битва за качество пойдет уже на уровне железа.Подобного добра полно в Интернете, но весной этого года гугл закрыл доступ к своему API V1, и включил V2. Код немного изменился.А пока что предлагаю ознакомится с рабочим примером распознавани…SPOILER_SHOWКод: Выделить всё
<? // Используем cURL для формирования HTTP POST-запроса к Google API // AIzaSyAqk7vE0vQDR3JItUPgFp6bcPqgJz8h8tI // AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw /* Если возникает ошибка URL error number:60 URL error:SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed Можно либо подсунуть найденный в просторах Интернета давно устаревший сертификат curl-ca-bundle.crt, либо просто отключить проверку */ /* Format *.flac Channels : 2 Sample Rate : 44100 Precision : 32-bit Sample Encoding: 32-bit Float */ $file_to_upload = array('myfile'=>'@'.'D:\Server\www\majordomo\current.flac'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.google.com/speech-api/v2/recognize?output=json&lang=ru-RU&key=AIzaSyAqk7vE0vQDR3JItUPgFp6bcPqgJz8h8tI'); // curl_setopt($ch, CURLOPT_CAINFO, 'd:\server\apps\curl-ca-bundle.crt'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Отключить ошибку "SSL certificate problem, verify that the CA cert is OK" //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // Отключить ошибку "SSL: certificate subject name 'hostname.ru' does not match target host name '123.123.123.123'" curl_setopt($ch, CURLOPT_POST,1); //curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: audio/l16; rate=16000;')); // для wav файлов, но по слухам ни у кого не работает curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: audio/x-flac; rate=44100;')); curl_setopt($ch, CURLOPT_POSTFIELDS, $file_to_upload); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); $result=curl_exec ($ch); // показать инфу и ошибки print_r(curl_getinfo($ch)); echo '<br>URL error number:' . curl_errno($ch); echo '<br>URL error:' . curl_error($ch); echo '<br>'; curl_close ($ch); // Покачать весь ответ гугла echo '<br>result='.$result; echo "<br>"; // По не выясненным пока причинам, в версии V2 первый ответ всегда пустой. Берем второй. $result_arr = split("\n", $result); $result = $result_arr[1]; // Google возвращает JSON, поэтому парсим стандартной функцией. Доступна в PHP 5.2 $json_array = json_decode($result, true); $voice_cmd = $json_array['result'][0]['alternative'][0]['transcript']; $confidence = $json_array['result'][0]['alternative'][0]['confidence']; echo('<br>voice_cmd='.$voice_cmd); echo('<br>confidence='.$confidence); ?>
1. Теперь для этого потребуется ключ. Его можно свободно получить, прочитав эту полезную статью http://tuarisa.ru/2014/08/google-speech ... chajnikov/. Я получил себе такой ключик на свой адрес в Gmail.com В примере есть парочка пока что работающих ключиков для пробы. Как получить свой, подробно расписано в статье. Если будут трудности - помогу.
2. Изменился формат для записываемого файла.- Расширение : flac
Channels : 2
Sample Rate : 44100
Precision : 32-bit
Sample Encoding: 32-bit Float
- Расширение : flac
Обязательно надо поправить пути на свои!!! в строке
$file_to_upload = array('myfile'=>'@'.'D:\Server\www\majordomo\current.flac');
собачку не трогайте, а то покусает )) Я точно не знаю для чего она. Где то вычитал, что отключает проверки и curl будет выполняться дальше. Бред какой то, но без @ действительно не работает.
Строка
// curl_setopt($ch, CURLOPT_CAINFO, 'd:\server\apps\curl-ca-bundle.crt');
закоментирована. Можно указать путь к сертификату, который есть во вложении, и убрать эту строку отключения проверки
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Отключить ошибку "SSL certificate problem, verify that the CA cert is OK"
Вообщем можно поэкспериментировать. Но пока что работает и так и сяк.
Теперь надо решить оставшиеся две задачи. Локальное распознавание ключевого слова какой либо программой и запись flac файла до тишины или предела по времени. Вероятно тут должна помочь http://sox.sourceforge.net/ Надо разобраться, как записывать файлы этой утилиткой на виндовс.
