Используем Google Voice Search в своем приложении .NET



    Функция распознавания речи с некоторого времени доступна в браузере Google Chrome. Посмотреть как это выглядит можно, например, здесь.

    Так как исходный Chromium открыт, возникает закономерное желание подсмотреть, можно ли использовать технологию в своих корыстных целях наступления мира на земле.

    Как это часто бывает, все уже сделано за нас в этой статье. Все оказывается очень просто, необходимо сделать POST запрос на адрес www.google.com/speech-api/v1/recognize со звуковыми данными в формате FLAC или Speex. Реализуем демонстрацию распознавания WAVE-файлов с помощью C#.


    Как и автор оригинального топика мы не будем связываться со Speex. Для конвертирования звука из формата Wave во FLAC я воспользовался библиотекой Cuetools . В ее коде почему-то выдавалось исключение при попытке сохранения FLAC с любым количеством каналов кроме двух, однако простым закомментированием этой проверки благополучно сохраняются моно-файлы, прекрасно понимаемые гуглом.

            /// <summary> Конвертирование wav-файла во flac </summary>        
            /// <returns>Частота дискретизации</returns>
            public static int Wav2Flac(String wavName, string flacName)
            {
                int sampleRate = 0;
    
                IAudioSource audioSource = new WAVReader(wavName, null);
                AudioBuffer buff = new AudioBuffer(audioSource, 0x10000);
                
                FlakeWriter flakewriter = new FlakeWriter(flacName, audioSource.PCM);
                sampleRate = audioSource.PCM.SampleRate;            
    
                FlakeWriter audioDest = flakewriter;
                while (audioSource.Read(buff, -1) != 0)
                {
                    audioDest.Write(buff);                
                }
                audioDest.Close();
    
                audioDest.Close();
    
                return sampleRate;
            }
    


    Если у кого-то есть желание, думаю нет проблем реализовать без сохранения во временный FLAC-файл, не будем усложнять пример. Замечу только, что на файлы с высокой частотой дискретизации (44100) Гугл реагировал ошибкой 400. Максимально возможную частоту не определял, 8 и 16 кГц работает без проблем.

    Основной метод запроса к Google Voice:
     public static String GoogleSpeechRequest(String flacName, int sampleRate)
          {
            
            WebRequest request = WebRequest.Create("https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU");
    
            request.Method = "POST";
            
            byte[] byteArray = File.ReadAllBytes(flacName);
    
            // Set the ContentType property of the WebRequest.
            request.ContentType = "audio/x-flac; rate=" + sampleRate; //"16000";        
            request.ContentLength = byteArray.Length;
    
            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            
            dataStream.Close();
    
            // Get the response.
            WebResponse response = request.GetResponse();
    
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();
    
            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();
    
            return responseFromServer;
          }
    


    Десериализацию JSON-ответа сделаем через DataContractJsonSerializer, здесь, признаюсь честно, я не силен, к тому же результаты от гугла всегда приходили в виде:

    {"status":0,"id":"4531050901df65542082eacfebf3bb1b-1","hypotheses":[{"utterance":"купить велосипед","confidence":0.89697623}]}

    Поэтому следующей простой десериализации вполне хватило, буду рад выслушать замечания.

    [DataContract]
            public class RecognizedItem
            {
                [DataMember]
                public string utterance;
    
                [DataMember]
                public float confidence;
            }
    
            [DataContract]
            public  class RecognitionResult
            {
                [DataMember]
                 public string status;
    
                [DataMember]
                public string id;
    
                [DataMember]
                public RecognizedItem[] hypotheses;
            }
    
            public static RecognitionResult Parse(String toParse)
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(RecognitionResult));
    
                MemoryStream stream1 = new MemoryStream(ASCIIEncoding.UTF8.GetBytes(toParse));
                
                RecognitionResult result= (RecognitionResult)ser.ReadObject(stream1);
                return result;
            }
    




    «Купить велосипед» на скриншоте распозналось абсолютно верно, «один два раз» распозналось как «1 2 rus». Скачать архив исходных кодов можно отсюда.

    Наслаждаемся технологией, пока не прикрыли она доступна без ограничений!
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 25
    • +2
      Эх, а как хочется надиктовать что нибудь порой, а не печатать руками, а потом убрать лишнего и добавить куда необходимо. Быстрей бы распознавание голоса уже хоть как-то заработало.
      • +1
        А вы тренируйте дикцию и учите английский. С ним почти безошибочно работает.
        • 0
          А потом переводить Google translate!
          • 0
            Качество распознавания русского языка вполне себе высокое. Или через API доступен только английский?
      • 0
        автору поста громадный респект
        • 0
          Автор молодец! Меня давно интересует вопрос: Google развивает какой-то алгоритм или просто обучает свою систему на основании базы полученных голосовых запросов?
          • +2
            Он не только Вас интересует… Распознавание речи пока еще совсем не тривиальная вещь, одним количеством решить задачу не получится. Или может, подскажете алгоритм «простого обучения» по базе?
            • 0
              «просто обучает» и «простого обучения», к чему эта гипербола?
            • 0
              все сразу, а голосовые заметки с большим количеством ошибок дослушивает куча индусов и исправляет :-)
              • +1
                Они пользуются SVOX
                • +1
                  Не могли бы Вы рассказать об этом поподробнее? Откуда эта информация? На странице википедии по ссылке говорится только о тексте в речь, все мои поисковые запросы тоже выдают только TTS и ни слова о распознавании
            • 0
              Спасибо, занятно.
              Сделать версии для наиболее распространенных платформ, и получится рай студента (лекции писать вручную не нужно, разве что самые основные тезисы для восприятия зрительной памятью).
              • +1
                Судя по:
                эх тройка птица тройка кто тебя выдумал нотебург наруто манга укради цитозин любашевский роль в оренбурге можно после приступа считать енвд доводчик стихи про здоровье наряд для мужской цветок на скорую с одним топором домов с 920 ярославская что может

                Распознается по поисковым словам.
                • 0
                  По поводу лекций:
                  Мы на первом курсе, говорили преподу: я не могу придти, но я диктофон оставлю, а потом перепишу.
                  Он приводил на это очень смешную историю, о том, как он однажды пришел и оставил студентам вместо себя магнитофон.
                • 0
                  Забавно, нам только сегодня на работе поставили задачу попытаться использовать распознаватель голоса от Google. Спасибо!
                  • 0
                    думаю, это не очень хорошо и лучше воспользоваться платными сервисами.
                • +1
                  Мда, что-то окромя «эх тройка птица тройка кто тебя выдумал» я сходств с оригиналом мало нашел.
                  Дедушка Гоголь был бы недоволен такой интерпретацией.

                  Если по поисковым, то печально. Я уж было подумал, что все без обмана. Сейчас повнимательнее потестирую.
                • +1
                  Очень полезная штука. Давно искал метод использования распознавания от Google — везде пусто было.
                  • 0
                    Примеры не работают. Сменили АПИ, возможно. Как узнать, что нужно исправить для работы?
                    • 0
                      Гугловский сервис прикрыли
                      • 0
                        Ничего его не прикрыли. Теперь нужен свой api-key, и стоит ограничение в 50 запросов в день.
                        Подробнее про получение api-key здесь – stackoverflow.com/questions/26485531/google-speech-api-v2
                        Чтобы заработали примеры, надо исправить url на
                        https://www.google.com/speech-api/v2/recognize?output=json&lang=ru-RU&key=APIKEY
                        и изменить класс десериализации.
                        • 0
                          Уже разобрались давно. Да, не прикрыли. Ограничили конкретно. Проблема заключалась в левом профиле. зашли под новым и функции не было доступно пока не подписались на группу. Потом вспомнили.

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.