Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Создание диалогового интерфейса для Android с помощью Dialogflow

by
Difficulty:IntermediateLength:MediumLanguages:

Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)

Final product image
What You'll Be Creating

Рост искусственного интеллекта вызывает сдвиг парадигмы в области разработки пользовательского интерфейса. Благодаря распространению интеллектуальных помощников, активируемых голосом, таких как Google Home, Сири и Алекса, пользователи начинают чувствовать, что нажатие многочисленных кнопок на экране или заполнение вручную форм не только неэффективно и медленно, но и старомодно.

К счастью, сегодня доступно множество облачных сервисов, которые позволяют разработчикам добавлять диалоговые пользовательские интерфейсы в свои приложения. Одним из таких сервисов является Dialogflow Standard Edition от Google. Он бесплатный, очень мощный, многоязычный и поставляется с большим количеством хорошо продуманных шаблонов.

В этом уроке я покажу вам, как создать простой текстовый пользовательский интерфейс для Android с помощью Dialogflow.

Предпосылки

Прежде чем продолжить, убедитесь, что у вас есть доступ к:

  • последняя версия Android Studio
  • устройство или эмулятор под управлением Android 5.0 или более поздней версии

1. Создание агента

При использовании Dialogflow вы всегда будете работать с агентом, системой понимания естественного языка, подготовленной для обработки определенного набора пользовательских входов.

Чтобы создать свой первый агент, используйте учетную запись Google для входа в консоль Dialogflow и нажмите кнопку Создать агент.

DialogFlow welcome screen

В появившейся форме введите разумное имя агенту и нажмите кнопку «Создать».

Agent creation form

Через несколько секунд у вас появится новый агент.

2. Создание намерения

В то время как на визуальных интерфейсах есть кнопки, пользователи могут нажимать, чтобы выразить свои намерения, у разговорных интерфейсов есть намерения. Таким образом, в хорошо продуманном диалоговом интерфейсе все, что может сказать пользователь, сопоставляется с намерением. Задача агента заключается только в том, чтобы точно определить, какое намерение необходимо активировать, когда пользователь произносит или вводит фразу или предложение.

Чтобы все было просто, давайте создадим только одно намерение для нашего агента: намерение с именем WEIGHT, которое позволит пользователям конвертировать вес в килограммах в фунты и наоборот.

Чтобы создать намерение, нажмите кнопку Создать намерение в консоли.

На следующем экране введите имя намерения и нажмите кнопку Добавить обучающие фразы. Теперь вы сможете предоставить несколько фраз, которые агент может использовать для обучения. Например, предложение «что равно 32 килограммам в фунтах» было бы хорошей фразой обучения для намерения WEIGHT.

После ввода предложения и нажатия клавиши Enter вы увидите, что Dialogflow правильно угадывает, что фраза «32 килограмма» является переменной. Он также автоматически создаст для него программно доступный параметр с именем unit-weight и присвоит его типу @sys.unit-weight.

Creating a training phrase

Точно так же предполагается, что слово «фунты» тоже является переменной и создает для него параметр с именем unit-weight-name, тип которого - @sys.unit-weight-name.

Я предлагаю вам ввести еще несколько аналогичных тренировочных фраз, всегда проверяя правильность значений параметров unit-weight и unit-weight-name.

Multiple training phrases added

Затем нажмите кнопку Добавить ответы, чтобы ввести несколько общих ответов. Следует понимать, что они будут показаны пользователю дословно.

Multiple generic responses added

Когда вас будут устраивать подготовительные фразы и ответы, которые вы предоставили, продолжайте и нажмите кнопку «Сохранить», чтобы сохранить намерение и начать процесс обучения, который обычно выполняется менее минуты.

Как я уже говорил, хороший диалоговый интерфейс должен иметь возможность обрабатывать все, что говорит пользователь. Это означает, что наш агент также должен иметь возможность отображать любезности и предложения, которые он не понимает в реальные намерения. Поскольку это очень распространенное требование, Dialogflow автоматически генерирует такие намерения для нас, с такими названиями как Default Welcome Intent и Default Fallback Intent. Хотя последний не нуждается в каких-либо изменениях, первый можно поправить.

У Default Welcome Intent нет каких-либо учебных фраз, поэтому вы сами должны предоставить несколько. Кроме того, мы не будем работать с событиями в этом учебнике, поэтому вы можете удалить связанное с ним событие Welcome.

Configuring the default welcome intent

Нажмите кнопку Сохранить после внесения изменений.

3. Включение Small Talk

Большинство пользователей вряд ли ограничится созданием WEIGHT, которое вы создали. Хотя fallback намерение сможет обрабатывать все недопустимые запросы, всегда полезно обучать агента, чтобы он мог заниматься небольшими разговорами. Это сделает его более человечным.

В консоли Dialogflow можно очень просто добавить больше возможностей небольшого разговора для агента. Все, что вам нужно сделать, это открыть вкладку Small talk и нажать кнопку Включить.

Small talk configuration screen

На этом этапе агент сможет генерировать ответы по умолчанию для множества распространенных вопросов. При желании вы можете настроить эти ответы, чтобы придать ему уникальную индивидуальность. На данный момент я предлагаю вам ответить на несколько вопросов в разделе «О приложении» и нажать кнопку «Сохранить».

Small talk customization progress section

4. Получение токена доступа

Вашему Android-приложению будет нужен токен доступа клиента при общении с агентом Dialogflow. Чтобы получить его, нажмите на значок шестеренки рядом с именем агента и откройте вкладку «Общие». При прокрутке вниз до раздела API-ключей вы сможете увидеть токен. Обратите внимание, что вы можете использовать его позже.

API keys section

5. Добавление зависимостей проекта

Мы будем использовать библиотеку Fuel при взаимодействии с веб-службой Dialogflow, поэтому добавьте следующую implementation зависимость в файле build.gradle модуля app:

Dialogflow может обрабатывать как текст, так и аудио. Однако в этом учебнике мы будем работать только с текстом. Следовательно, наше приложение будет иметь пользовательский интерфейс, похожий на чат. Поэтому добавьте библиотеку ChatMessageView в другую зависимость.

Наконец, убедитесь, что ваше приложение может подключиться к Интернету, запросив следующее разрешение в файле AndroidManifest.xml:

6. Определение макета

Виджет ChatView предлагает полноценный пользовательский интерфейс чата, способный отображать сообщения чата и принимать ввод пользователя. Используя его в нашем макете, мы можем сэкономить много времени и усилий. Поэтому разместите виджет внутри виджета FrameLayout и добавьте его в XML-файл макета.

Если у вас есть Kotlin Android Extensions в вашем проекте, ссылка на виджет будет доступна как свойство расширения внутри вашей деятельности.

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

Chat app-like interface

7. Настройка Fuel

Вы можете сделать свой код взаимодействия с сетью намного более кратким, настроив клиент Fuel специально для использования веб-службы Dialogflow. Однако перед тем, как вы это сделаете, добавьте токен доступа клиента, который вы получили ранее, в качестве константы времени компиляции.

Все HTTP-запросы, которые вы делаете в веб-службе Dialogflow, должны иметь заголовок Authorization на основе токена. Чтобы избежать ручного создания заголовка каждый раз, когда вы делаете запрос, используйте свойство baseHeaders класса FuelManager.

Затем задайте свойство basePath класса FuelManager базовому URL-адресу веб-службы Dialogflow.

Наконец, все ваши HTTP-запросы всегда должны иметь следующие параметры конфигурации: v параметр, определяющий версию протокола, которую вы хотите использовать, параметр lang, определяющий язык, на который вы хотите включить ответы агента, и параметр sessionId, значение которого может быть любым случайным строка.

В следующем коде показано, как использовать свойство baseParams для установки всех параметров:

8. Настройка интерфейса чата

Виджет ChatView нуждается в двух объектах ChatUser: один для пользователя и один для агента. Эти объекты предназначены для хранения деталей, таких как имена и изображения профиля, которые должны отображаться вместе с сообщениями чата. Кроме того, каждый объект ChatUser должен иметь уникальный идентификатор, связанный с ним.

Следующий код показывает, как создавать объекты:

Обратите внимание, что код использует встроенный ресурс с именем ic_account_circle как аватар для обоих объектов. Не стесняйтесь использовать любой другой ресурс, если хотите.

9. Отправка и получение сообщений

Всякий раз, когда пользователи нажимают кнопку отправки виджета ChatView, вы должны создавать объекты Message на основе введенного текста. Для этого вы можете использовать класс Message.Builder. При создании объекта вам нужно будет убедиться, что он принадлежит реальному пользователю, вызвав метод setUser().

Когда объект Message готов, вы можете передать его методу send() виджета ChatView для его отображения. Следующий код показывает вам, как это сделать внутри метода setOnClickSendButtonListener() виджета ChatView.

Чтобы на самом деле отправить сообщение пользователю вашему агенту, вы должны теперь выполнить HTTP-запрос GET в конечную точку /query веб-службы Dialogflow. В качестве ввода он ожидает параметр query, значением которого может быть любая фраза или предложение, введенное пользователем.

В качестве ответа HTTP вы получите документ JSON, значение result/fulfillment/speech которого содержит ответ агента.

Чтобы отобразить ответ внутри виджета ChatView, вы должны снова создать другой объект Message. На этот раз, однако, его владельцем должен быть агент. Кроме того, чтобы отобразить сообщение с правой стороны, вы должны передать true его методу setRight().

Если вы запустите приложение сейчас, вы сможете пообщаться с агентом.

Small talk responses

Однако, если вы попросите приложение преобразовать вес в килограммах в фунты, он даст общий ответ. Чтобы иметь возможность фактически выполнить преобразование, вы должны сначала определить, было ли запущено намерение WEIGHT. Для этого вы можете проверить значение ключа result/metadata/intentName.

После того, как вы уверены, что намерение WEIGHT было вызвано, вы можете определить значения параметров unit-weight-name и unit-weight, которые будут присутствовать внутри объекта result/parameters.

С приведенными выше значениями все, что требуется, это простая математика и инструкция if-else для выполнения преобразования. Чтобы отобразить результат, вам понадобится другой объект Message. Его владельцем тоже должен быть агент.

Наше приложение готово. Теперь вы сможете запустить его, чтобы убедиться, что оно выполняет все преобразования правильно.

Completed app running

Заключение

Теперь вы знаете, как создать дружественного и полезного агента, используя Google Dialogflow. В этом уроке вы также узнали, как создать привлекательный интерфейс, который люди могут использовать при общении с агентом.

Чтобы узнать больше о Dialogflow, обратитесь к его официальной документации.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.