Страница 1 из 4

Голосовое управление. Микрофоны сервера.

Добавлено: Пн окт 13, 2014 10:44 pm
Bagir
Голосовое управление с микрофонов сервера. Давайте продолжим в этой теме обсуждение именно этого способа и доведем его до рабочего варианта.
План этой ветки:
  • Постоянно слушаем микрофон в поисках ключевого слова.
    Распознавание должно быть локально.
  • При срабатывании пишем звук в файл до тишины и отправляем на распознавание.
    Пока что кроме гугла ничего не приходит на ум. Локальных приемлемых вариантов я пока что не нашел.
  • Полученный текст отправляем в метод commandReceived
    При таком варианте голосовой сервис будет не отдельной игрушкой, а винтиком в системе.

    Нам требуется решить три задачи:
    1. Локальное распознавание ключевого слова.
    2. Запись FLAC с требуемыми параметрами.
    3. Распознавание файла.

    Сегодня мне удалось собрать материал для отправки звукового файла в гугл и получения текста. Надо сказать, что результатами я доволен. Дальнейшая битва за качество пойдет уже на уровне железа.
    А пока что предлагаю ознакомится с рабочим примером распознавани…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);
    
    ?>
    Подобного добра полно в Интернете, но весной этого года гугл закрыл доступ к своему API V1, и включил V2. Код немного изменился.
    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
    3. На винде столкнулся с проблемой сертификата для curl. Пришлось отключить проверку. В коде эта строчка есть. Так же я нашел и сам сертификат. Работает и с ним тоже. Для чего он нужен curl я пока что не вникал.
Код из спойлера пока что никак не завязан на МД. Его можно просто скопировать в пустой php файл, и запустить его из браузера например вот так http://localhost/voice_recognition.php Или просто скачать php файл с этим кодом из вложения и положить его в папку с файлами сайта. Также во вложении я добавил свой звуковой файлик с записью голоса для примера.
Обязательно надо поправить пути на свои!!! в строке
$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/ Надо разобраться, как записывать файлы этой утилиткой на виндовс.

Re: Голосовое управление. Микрофоны сервера.

Добавлено: Вт окт 14, 2014 10:18 am
sergejey
А нельзя ли как-то использовать встроенное в Windows распознание речи для активации ключевой фразы?

Re: Голосовое управление. Микрофоны сервера.

Добавлено: Вт окт 14, 2014 10:33 am
Bagir
Может быть разве на W7 и выше, но на хрюшке я такого не встречал. Конечно надо почитать, может что и получится. Но как то я больше смотрю в строну более-менее приемлемой программы, которую можно будет заточить под одну только команду. Может быть даже обучаемый вариант.
Сейчас кручу верчу http://sox.sourceforge.net/ Вагон параметров и возможностей, но что есть что и за что, полностью понять пока не удается. Путные хелпы нашел только на буржуйском, но с моим переводом сильно обстановку не проясняет. Пока что пробую как то так:
sox -d -c 1 -r 16000 -b 16 d:\zzz.wav silence 1 0.1 1% 2 0.9 1%

Re: Голосовое управление. Микрофоны сервера.

Добавлено: Пн ноя 03, 2014 1:25 am
Bagir
Снова занялся этой темой. Получить игрушку конечно хочется, но сильно не нравится необходимость использования стороннего софта за бессилием сделать все самому. Чтож, пока что я смерился с этим и решил смотать все скотчем, чтобы хоть как то запустить идею. Дальше будет видно. Возможно что то получится до точить в будущем.
Сейчас "на коленках" у меня есть все компоненты для работы системы в режиме: событие - вопрос системы - ответ человека - действие системы. Оффлайн распознавание ключевого слова для этого не требуется. Но это все равно уже кое что.
Долго думал как все устроить, и где все разместить. В итоге пришел к выводу, что нагружать МД не стоит вообще никакими стадиями этого процесса.
Для чтения сообщений и проигрывания звуковых файлов я использую свое приложение, которое ставит все это добро в очередь. В него и решил добавить распознавание.
Идея в следующем: МД озадачивает отдельное приложение, которое запишет звук, сохранит в необходимом формате, отправит в гугл, получит ответ и передаст его обратно в МД.
1. Записать файл. Это как бы просто, но вся фишка в том, чтобы записать до установленной тишины. Это я пока не умею. Но умеет sox. Запускаем так: "sox -d -c 2 -r 44100 -b 16 current.wav silence 1 0.1 1% 2 0.9 1%"
2. Нужно переконвертировать. Тут поможет flac. С параметром -f который позволяет перезаписывать имеющийся файл. "flac -f current.wav"
3. Отправить в гугл. Есть рабочий код в ранее выложенном voice_recognition.php Но у меня пока что не получилось переиначить его под VB. Планирую пока оставить его в php до лучших времен.

Re: Голосовое управление. Микрофоны сервера.

Добавлено: Сб дек 27, 2014 5:40 pm
jeks0n
звуковой файл он распознал и выдал:
SPOILERSPOILER_SHOW
Array ( [url] => https://www.google.com/speech-api/v2/re ... PqgJz8h8tI [content_type] => application/json; charset=utf-8 [http_code] => 200 [header_size] => 360 [request_size] => 282 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 4.633 [namelookup_time] => 0 [connect_time] => 0.187 [pretransfer_time] => 0.577 [size_upload] => 138231 [size_download] => 251 [speed_download] => 54 [speed_upload] => 29836 [download_content_length] => -1 [upload_content_length] => 138231 [starttransfer_time] => 1.591 [redirect_time] => 0 [certinfo] => Array ( ) [primary_ip] => 64.233.163.103 [primary_port] => 443 [local_ip] => 192.168.0.104 [local_port] => 54020 [redirect_url] => )
URL error number:0
URL error:

result={"result":[]} {"result":[{"alternative":[{"transcript":"найди мне что нибудь интересное","confidence":0.92292166},{"transcript":"найди мне что-нибудь интересное"}],"final":true}],"result_index":0}

voice_cmd=найди мне что нибудь интересное
confidence=0.92292166
а как заставить все работать ума не приложу ))) подскажите, в какую сторону копать?

Re: Голосовое управление. Микрофоны сервера.

Добавлено: Сб дек 27, 2014 5:51 pm
Bagir
Парой предложений тут конечно не отделаешься. Я постараюсь подготовить небольшой обзор этой темы. Если файл распознается, то уже хорошо. В php файлике был забит гугловский ключик из просторов Интернета. Значит еще жив курилка )) Это тоже хорошо.
Вообще я хотел перенести весь код из php файла в свою прогу, и крутить распознавание в ней. Не хочется загружать апачи сервер этой задачей, и уж тем более циклы МД.
Сегодня не обещаю. Прикручиваю Мегу на шит в гараже. Но завтра займусь этой темой. Надо бы выложить хоть какой то работающий пример, чтобы был интерес к теме.

Re: Голосовое управление. Микрофоны сервера.

Добавлено: Сб дек 27, 2014 6:01 pm
jeks0n
будем с нетерпением ждать )

Re: Голосовое управление. Микрофоны сервера.

Добавлено: Вт дек 30, 2014 11:27 pm
electric
Есть новости с полей?
Тоже решил заняться этой темой, ищу микрофон.
Работа встроенного в планшеты (планшеты) меня не устраивает, ищу альтернативу для cubietruck.

Re: Голосовое управление. Микрофоны сервера.

Добавлено: Вт дек 30, 2014 11:33 pm
triada13
electric, в свое время баловался прослушкой, микрофон использовал А1В2 Сосна, улавливал звук падающей спички в комнате.
Но как его привязать в Мажордом?

UPD
вот ссылка:

Re: Голосовое управление. Микрофоны сервера.

Добавлено: Ср дек 31, 2014 1:00 am
Bagir
Новости скоро будут, честно )) Рабочий пример есть. Но надо написать к нему инструкцию. Слишком много запчастей в нем используется. Да и надо сделать простенький пример связи с МД с учетом того, что диалоги может начинать только сервер. Например, в режиме "никого нет дома" при обнаружении первого движения, Алиса здоровается и спрашивает хотим ли мы услышать отчет о событиях пока никого не было. После этого ожидает ответ и действует исходя из него.
Праздники закрутили, вот только до компа добрался, да уж спать пора. А вчера весь вечер просидел в гараже с переделкой автоматики для подъемных ворот. Все получилось вполне красиво. Так что тоже будет небольшой обзорчик со схемой.
Микрофон я пока что использую от звукового ресивера ямаха, который был для его калибровки.
Изображение
Воткнут во встроенную звуковую карту сервера. Из всех микрофонов для ПК этот дает самое наилучшее качество. К тому же он не направленный. Не обязательно говорить прямо в него. Так же использую его и для скайпа. Тут главное послушать что получается в записи. И если уж не совсем плохо, то можно пробовать распознавать.
А1В2 Сосна возможно интересная штуковина. Было бы здорово послушать запись с нее, или даже хотя бы в скайпе. Возможно надо сразу задумывать большое усиление, и размещать микрофон так, чтобы прямо в него нельзя было говорить.
Были мысли про IP микрофоны. Хочу попробовать IP камеру KaiCong со встроенным микрофоном и спикером. От сервера далеко микрофон не утянуть. Опасаюсь, что сильно пострадает качество. Пока что даже представления не имею о возможностях KaiCong. Но иногда, дешевые простые решения могут удивлять. Так то есть же еще и IP камеры с выносным микрофоном. Вообщем будущий опыт с KaiCong покажет смысл этой идеи.