«

»

Мар
16

Распознавание речи в Андроид

Учим Андроид слушать…

Распознавание речи — процесс преобразования речевого сигнала в текстовый поток. Первое устройство для распознавания речи появилось в 1952 году, оно могло распознавать произнесённые человеком цифры. Современные телефоны могут намного больше. В этой статье  я расскажу о том, как с помощью Голосового поиска Google Inc. научить ваши приложения слушать.

Немого теории. Андроид сам по себе не умеет распознавать речь. Поэтому, если у вас “голое” устройство с Андроидом на борту, то распознавать на нем ничего не получится. Как же тогда быть? Можно поискать стороннюю библиотеку для этих целей и добавить ее в проект (тернистый путь) или попросить другое приложение распознавать для нас речь (простой пусть). Мы пойдем по простому пути, следовательно, у нас на устройстве должно быть установлено хотя бы одно приложение способное обрабатывать специально созданный для такой задачи Intent с действием RecognizerIntent.ACTION_RECOGNIZE_SPEECH.

Одним из таких приложений является Голосовой поиск Google Inc. Работает оно просто замечательно, поддерживает различные языки. Для успешной работы требуется выход в интернет, так как сам процесс распознавания происходит где-то на серверах Google. При запуске приложения появляется Activity с парой управляющих кнопок (представлена на рисунке ниже), которая информирует пользователя о том, что надо говорить. Как только пользователь заканчивает говорить, диалог закрывается, а нам в приложение возвращается массив текстовых строк – распознанная речь.

Блок-схемы еще никто никто не отменял. Учитывая вышеизложенное, напрашивается следующая логика работы, представленная на схеме ниже.

Приступаем к реализации. Напишем программный код, который позволит максимально просто интегрировать голосовой поиск в наше приложение. Согласно представленной выше схеме, код должен делать следующее:

  • принимать запрос на распознавание речи
  • проверять наличие приложения способного распознавать речь.
  • если распознавание доступно, то вызвать стороннее приложение для распознавания речи, получать результат
  • если распознавание не доступно, то показать диалог запроса установки Голосового поиска Google и отправлять пользователя в маркет, если он захочет

Создадим класс, в котором реализуем логику для распознавания речи. Назовем этот класс SpeechRecognitionHelper. В классе объявим статичную, публичную функцию run, которая будет принимать запрос на запуск распознавания.

Кроме функции run нам необходимо реализовать еще три функции:

  • isSpeechRecognitionActivityPresented – проверяет установлено ли приложение способное распознавать речь
  • startRecognition – формирует правильный Intent и запускает распознавание
  • installGoogleVoiceSearch – инициирует процесс установки Голосового Поиска Google

Проверить установлено ли на устройстве приложение для распознавания речи можно с помощью метода queryIntentActivities класса PackageManager. Данный метод выдает список Activity, которые могут обработать указанный Intent. Получить экземпляр класса PackageManager можно с помощью функции getPackageManager. Вот что получилось:

Приступаем к реализации функции startRecognition. Данная функция должна сформировать правильный Intent для запуска Activity  распознавания речи. О том как это сделать изучаем на страничке документации. Получаем следующую реализацию:

При настройке параметров Intent’а мы указали: строку-подсказку для пользователя, которая отобразиться в диалоге запроса голосового ввода; модель распознавания – поисковый запрос; количество результатов – 1 (самый релевантный, другие нам в данном случае не нужны).

Переходим к реализации функции installGoogleVoiceSearch. Данная функция будет отображать диалог, в котором спросит у пользователя хотел ли они установить Голосовой Поиск Google и отправить его в маркет устанавливать его, если он захочет.

В принципе все готово. У нас есть механизм проверки наличия требуемой нам Activity для распознавания речи, мы можем запустить эту Activity, можем запросить у пользователя разрешения на установку Голосового Поиска и при положительно ответе отправить его в маркет. Единственное что мы еще не умеем – это получать результаты распознавания голоса.

Отправка запроса на распознавание речи была неспроста реализована с помощью функции startActivityForResult, указывающий на то, что мы хотим получить результат запущенной нами ативити. Чтобы его получить требуется в нашей основной ативити, из которой мы отправили запрос на распознавание речи, переопределить метод OnActivityResult и получить в нем результаты распознавания голоса. Делается это следующим образом:

Вот теперь действительно все готово. Созданный класс SpeechRecognitionHelper позволяет вызовом всего лишь одной функции run выполнить запрос на распознавание речи, обработав ситуации отсутствия соответствующей Activity и установку Голосового Поиска из маркета. Все что вам нужно для реализации распознавания – это добавить в ваш проект созданный класс, вызвать в нужном месте функцию run и реализовать логику обработки результатов, правильно переопределив метод onActivityResult Activity, которая инициировала процесс.

Дополнительную информацию по теме можно получить на сайте разработчиков Андроид. Есть полезный пример, в котором показано, как реализовать распознавание речи, и что важно – в нем рассказано, как получить список доступных языков. Данный список понадобиться вам, если вы хотите распознать язык отличный от языка выбранной локали пользователя. Чтобы быстро интегрировать речевой ввод в ваше приложение можете скачать и свободно использовать код класса SpeechRecognitionHelper.

Если статья оказалась вам полезной или почему на сайте есть реклама

4 комментариев

  1. ZipovUA Сообщает:

    Доброго времени суток.

    1) Есть уточняющий вопрос: как настроить распознавание речи на конкретный язык (английский / украинский / русский)
    2) Возможно ли каким нибудь образом увеличить словарный запас гугла нужным словарем? (например слово FireBall у меня не распознаётся :) )

    1. PandaСoder Сообщает:

      1) по умолчанию используется язык локали, если нужен другое – передайте параметр EXTRA_LANGUAGE
      2) нельзя, научитесь правильно говорить фаербол )

  2. анатолий Сообщает:

    распознование речи фаербол

  3. Михаил Сообщает:

    1) Вопрос – если хочется воспользоваться не гугловским распознавателем а сторонним, например Голосовой поиск Плюс, то как явно указать на это. Потому что я так понял программа ищет наличие люого распознавателя и ессно выбирает гугловский.
    2) Также хотелось бы в связи с предыдущим вопросом поинтересоваться – реально ли программу распознавать не слова а наборы букв на заданном языке (например отдельные слоги) – а то как то совсем не хочется реализовывать такую программу самому

Добавить комментарий

Мы сохраним Ваш e-mail в тайне.