Концепция приложения: создать упрощенный аналог голосовых помощников, таких как Алиса, Siri, Салют.
Состав приложения:
- Кнопка ,
- Распознаватель речи ,
- Текст в речь ,
- Часы,
- Проигрыватель,
- Сенсор местоположения,
- Надпись,
- Список
Дизайн-макет
Предварительно нужно найти картинку, которая будет обозначать вашего голосового помощника, и какой-нибудь звук в формате mp3 или другом распространенном аудио-формате. Загрузим найденное в проект.
У меня картинка — это смайлик, а звук — мяуканье котенка.
Настроим приложение. В обновленной версии настройки приложения вынесены отдельно, в Project Properties:
- Название приложения “Голосовой помощник”.
- Можно поставить иконку приложения.
В приложении будет 2 экрана — экран с самим помощником и вспомогательный, с командами, которые можно давать.
Первый экран
Настроим Screen1:
- Отключаем показ заголовка и статус бара.
- Выравнивание по горизонтали и вертикали — по центру.
Добавляем на экран кнопку — это будет кнопка голосового помощника. Компонент переименовываем в «Помощник». Из всех настроек кнопки нам потребуется установить фоновое изображение (то, которое мы скачали и загрузили ранее). Обратите внимание, что размер кнопки подстраивается под размер изображения, поэтому слишком большое изображение нежелательно загружать.
Ниже добавляем вторую кнопку — она будет открывать другой экран. Оформление кнопки можно сделать на свой вкус. Компонент переименовать в «Команды», текст кнопки тоже «Команды».
Далее добавляем:
- Распознаватель речи — чтобы приложение нас понимало.
- Текст в речь — чтобы помощник мог говорить.
- Часы — чтобы мог сказать, сколько времени.
- Проигрыватель — чтобы проиграл загруженный нами звук.
- Сенсор местоположения — чтобы определил, где мы находимся.
Все компоненты добавляем в макет без дополнительных настроек. Первые два являются обязательными, т.к. это основа работы голосового помощника, остальные — чтобы показать, как можно использовать различные компоненты.
Итого должно получится примерно следующее:
С такими компонентами:
Второй экран
Чтобы создать второй экран, нужно нажать кнопку “Добавить экран” в строке под меню:
Появится окно названия экрана. Название экрана можно изменить или оставить предложенное. Как правило, если экранов много, желательно называть их так, чтобы было понятно, за что они отвечают. Но будьте внимательны — переименовать экран уже не получится! После того, как экран добавлен, автоматически откроется макет нового экрана. Переключаться между экранами можно через выпадающий список в строке под меню:
Сам экран настраивать необязательно, это сейчас не требуется. Разве что отключить показ статус-бара и заголовка экрана, чтобы место не занимали.
Добавляем надпись. Она будет являться заголовком экрана, поэтому шрифт можно сделать крупнее.
- Текст надписи — «Команды».
- Ширина блока — «Наполнить родительский».
- Высота блока — автоматически.
- Выравнивание текста — центр.
- Шрифт можно 20, можно больше/меньше, зависит от ваших предпочтений.
Далее добавляем компонент Список. Почему его? Для простоты — в противном случае нам бы пришлось добавлять несколько надписей, а это увеличивает время на разработку.
Компонент Список находится на вкладке «Интерфейс пользователя». У него довольно много настроек — можно изменять шрифт, отображение картинки, расположение. Нам понадобятся только:
- Высота и ширина блока — «Наполнить родительский».
- Шрифт — размер, начертание по вашему усмотрению.
- Самое важное в списке — содержимое.
Чтобы наполнить список, нужно кликнуть по кнопке «Click to add/delete Data».
В открывшемся окне можно добавлять или удалять элементы. каждый элемент списка — новая строка. Удалить — нажать кнопку DELETE напротив строки, добавить — нажать кнопку «Click to add row data».
Нам нужно добавить в список следующие слова-команды:
- Время
- Спасибо
- Дата
- Дань недели
- Анекдот
- Как дела
- Спой песню
- Заказать пиццу
- Сколько планет
- Привет
- Ты кто
- Выключись
- Где я
Список кажется каким-то неполным, так люди не общаются. Но это основные паттерны команд, которые наш голосовой помощник будет выуживать из наших фраз. Ему можно сказать: «Время» — и он скажет, сколько сейчас времени, а можно сказать: «Скажи, пожалуйста, время» — и он снова скажет время.
Собственно, на этом настройка дизайна заканчивается, пора переходить к программированию.
Программирование
Первый экран
Пусть голосовой помощник с нами поздоровается при включении. Для этого при инициализации экрана запустим Текст в Речь со словами «Здравствуйте».
Теперь нам нужно, чтобы помощник нас слушал. Для этого запрограммируем нажатие кнопки «Помощник», чтобы включался распознаватель речи.
Теперь помощник сможет нас слушать, но нам этого мало. Как сказали в одном очень хорошем фильме
Счастье — это когда тебя понимают
И нам нужно, чтобы помощник нас понял. А для этого нужно соотнести то, что мы сказали, с тем функционалом, которым обладает программа.
Добавляем блок «когда Распознаватель Речи После Получения текста» — именно в этом блоке мы будем задавать программе, что делать с текстом, который она получила.
Внутрь этого блока добавим блок условия ЕСЛИ, но нужно его доработать: добавить 12 ИНАЧЕ ЕСЛИ и в конце ИНАЧЕ. Добавить дополнительные условия можно, щелкнув на шестеренку настроек:
Научим нашего помощника вежливости: когда он услышит «Спасибо», пусть ответит «Пожалуйста».
Переменную «результат» можно взять в самом же блоке «когда Распознаватель Речи После Получения текста» — под названием блока есть эта локальная переменная. Локальная — потому что работает только внутри данного блока. Если вы попытаетесь вытащить ее за пределы, она сразу перестанет работать.
Блок с фрагментом важен, об этом писалось выше — не важно, насколько длинное предложение вы скажете, программа будет искать в нем ключевые фразы, чтобы выполнить команду. В данном случае она найдет «Спасибо» и ответит «Пожалуйста».
Далее научим помощник определять время. Для этого нам нужен компонент Часы.
Если в сказанном нам тексте будет слово «время», компонент «Текст в Речь» вызовет компонент часы и затребует у него показания времени. Pattern — маска, по которой будет сообщаться время.
- hh — часы,
- mm — минуты,
- ss — секунды.
Пусть наш помощник не только время говорит, но и день недели:
Здесь также задействован компонент «Часы», но уже с вызовом дня недели.
Пусть помощник еще и дату скажет:
Тут тоже самое, что и со временем, только паттерн другой:
- dd — день,
- MM — месяц (прописные буквы),
- yy — год.
Что это мы все про какие-то обыденные вещи. Пусть помощник чуть нас повеселит, расскажет анекдот:
Здесь мы хотим немного разнообразия, чтобы помощник не рассказывал нам один и тот же анекдот каждый раз. Пусть будет выбор хотя бы из трех. Для этого мы используем список тестовых фрагментов:
- Ведь почти у всех комнаты с прямоугольными углами, тогда почему роботы-пылесосы круглые?
- Марс — единственная планета, полностью населенная роботами
- Почему яблоко из Apple надкусанное? — Это робот из Android откусил его.
Вы можете сделать любое количество любых анекдотов.
Теперь будем сами вежливыми и поинтересуемся, как дела:
Тут аналогия с анекдотами: список из трех текстовых фрагментов, только они короче предыдущего варианта.
Теперь можно и спеть:
Помощник запускает не «Текст в Речь», а проигрыватель, которому для воспроизведения присваивается наш ранее загруженный файл cat.wav.
Можно спросить, как заказать пиццу:
Спросить, сколько всего планет в Солнечной системе:
Замечание. Когда будете использовать приложение, не обязательно произносить фразы именно в том порядке, в каком программируем блоки сейчас. Они независимы друг от друга: вы можете спросить в начале, можно ли заказать пиццу, а потом уже здороваться.
Кстати о приветствии. Пусть помощник здоровается нам не только при включении приложения, но и когда мы ему шлем привет:
Тут снова выбор из списка текстовых фрагментов.
Добавим помощнику немного самосознания:
И возможности поиска местоположения:
Здесь используется Сенсор Местоположения. Работает в том случае, если в телефоне включен GPS.
Ну и попросим выключить приложение.
Хотя стоит заметить, что приложение всего лишь сворачивается, а не закрывается полностью.
Итак, все ЕСЛИ мы обработали. Осталось заполнить ИНАЧЕ, т.е. что делать, если помощник не нашел в нашей фразу ничего знакомого:
Собственно, все команды, какие мы хотели, мы написали. Если вы хотите добавить что-то еще, не забудьте добавить еще ИНАЧЕ ЕСЛИ в блок условия.
Но на этом программирование еще не закончено. У нас же есть второй экран и надо как-то его открыть, для этого мы сделали кнопку «Команды». Вот её и запрограммируем:
Второй экран
Второй экран у нас справочный, на нем делать ничего не нужно, разве что вернуться на предыдущий:
Особо ничего изобретать не нужно — просто кликаем стандартную кнопку «Назад» в телефоне.
Ваше приложение готово. Можно формировать .apk файл и загружать на телефон. Не забудьте предварительно проверить!
Самостоятельная работа
Подумайте, какие еще компоненты можно добавить для взаимодействия с голосовым помощником, и попробуйте добавить их.