Пользователь
0,0
рейтинг
11 апреля 2011 в 18:30

Используем 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». Скачать архив исходных кодов можно отсюда.

Наслаждаемся технологией, пока не прикрыли она доступна без ограничений!
Яхнев Александр @Yakhnev
карма
61,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (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
      думаю, это не очень хорошо и лучше воспользоваться платными сервисами.
      • 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
          Уже разобрались давно. Да, не прикрыли. Ограничили конкретно. Проблема заключалась в левом профиле. зашли под новым и функции не было доступно пока не подписались на группу. Потом вспомнили.

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