Розпізнавання та генерація мови в Android

Насправді працювати з розпізнаванням та синтезом мови в Android дуже просто. Всі складні обчислення приховані від нас до досить елегантної бібліотеки з простим API. Ви можете подолати цей урок, навіть якщо маєте дуже поверхові знання про програмування для Android.

Давайте створимо новий проект у Eclipse. Для наших потреб знадобиться версія SDK не менше 8. Опишемо загалом створювану програму. При запуску програми користувачеві буде показано кнопку, після натискання на яку користувачеві буде запропоновано надиктувати фразу. Потім буде здійснено розпізнавання та буде показано список можливих варіантів. Оскільки технології розпізнавання мови далекі від досконалості, програма не може ручатися за точність результату, тому буде запропоновано кілька варіантів. Після того, як користувач вибере один із них, буде запущено генератор голосу, який відтворить вибрану фразу.

Нам знадобиться кілька текстових рядків, оголосимо їх у фалі "res/values/strings.xml"

Додамо в Linear Layout елемент Text View

Зверніть увагу, TextView посилається на рядок intro, який ми задали у файлі strings.xml.

Після Text View додамо кнопку

Користувач натискатиме цю кнопку, щоб почати говорити. Кнопка має параметр id, через який можна викликати з Java коду. Після натискання на кнопку користувачеві відображається повідомлення. Нам також знадобиться TextView для виведення слів із пропозиціями

TextView використовуватиме рядковий ресурс. Нам також знадобиться список варіантів слів

ListView буде заповнюватися даними в процесі роботи програми, тому для доступу до цього компонента також потрібно ID. Зверніть увагу на наявність ресурсу drawable. Ви повинні зберегти файлwords_bg.xml у папці res

Таким чином, кожен елемент списку є просто Text View.

Якщо Ви все зробили правильно, то при запуску має вийти наступне

android

Програмуємо розпізнавання мови в Android

Після того, як шаблон майбутньої програми створено, можна перейти до кодування. Відкрийте java файл головної Activity та додайте на початок файлу

Змінимо трохи декларацію головного класу

Всередині методу onCreate автоматично згенерований код, що викликає метод батьківського класу та встановлює головний контекст виведення.

Створимо змінні для роботи з кнопкою та списком розпізнаних слів

Ми просимо середу, чи підтримується Recognizer Intent. Якщо підтримується, ми говоримо додатку, що потрібно відстежувати клацання користувача кнопкою. Якщо інтент не підтримується, ми блокуємо кнопку та виводимо відповідне повідомлення користувачу.

Напишемо код, який обробляє натискання на кнопку. Усередині класу після методу OnCreate додамо метод OnClick.

Як бачите, при натисканні на кнопку ми викликаємо метод listenToSpeech().

Більшість наведеного коду стандартна для програм, які використовують розпізнавання голосу. Зверніть увагу на параметр EXTRA_PROMPT. Він задає рядок-запрошення для користувача. Параметр EXTRA_MAX_RESULTS визначає максимальну кількість варіантів розпізнавання. Зрештою, ми викликаємо startActivityForResult. Результат його роботи буде передано в метод надіяльностірезультату.

На наступному скріншоті показаний екран у момент розпізнавання мовлення.

android

Визначимо метод onActivityResult

Зверніть увагу, при перевірці результату ми порівнюємо змінну requestCode із константою VR_REQUEST, яку використовувалираніше під час виклику методу startActivityForResult. Таким чином, ми розглядаємо лише результати від нашого запиту. До методу повертається 10 варіантів розпізнаних слів, які ми записуємо до списку ArrayList. Цей список ми використовуємо в ArrayAdapter компонента List View.

Якщо програма впоралася із завданням і змогла щось розпізнати, ви побачите схожий н показаний на лівому скріншоті результат. Якщо програмі не вдалося розпізнати фразу, буде показано повідомлення, як на правому скріншоті

генерація
мови

Ось, власне, і все. Розпізнавання голосу в Android - досить просте завдання. Ми викликаємо інтент RecognizerIntent з потрібними нами параметрами. Результат повертається в наActivityResult.

Генерація мови в Android

Ми використовуємо метод setOnItemClickListener для встановлення відстеження клацань для кожного рядка. Всередині нового об'єкта OnItemClickListener ми описали метод onItemClick, який викликається у відповідь на клацання по рядку списку. Вибраний рядок передається як View в цей метод. Оскільки при проектуванні шаблону програми ми вказали, що наш список складається з TextView, ми перетворимо отримане значення на об'єкт TextView і дістаємо рядкове значення. Ми записуємо це слово в лог та показуємо користувачеві Toast повідомлення.

Якщо Вас не цікавить процес створення мови, Ви можете зупинитися і протестувати програму.

Для створення мови потрібно налаштувати двигун TTS. Додамо код у кінець методу onCreate

Як і в разі розпізнавання, результат інтенту повертається в метод надіяльностіРезультат. У цьому методі перед рядком super.onActivityResult(requestCode, resultCode, data); додайте

Таким чином, ми перевіряємо наявність TTS движка, і якщо він не встановлений – пропонуємоКористувачеві встановити відповідну програму.

Щоб завершити налаштування TTS, додамо метод onInit, який викликається при успішній ініціалізації TTS.

Тут ми встановлюємо мову генератора мови.

Для того, щоб змусити двигун проговорити рядок, необхідно викликати спосіб repeatTTS.speak. Повернемося до методу onCreate. Всередині методу onItemClick після рядка Toast.makeText(SpeechRepeatActivity.this, "You said: "+wordChosen, Toast.LENGTH_SHORT).show(); додайте наступний код