Несколько месяцев назад Яндекс запустил бету своего голосового помощника «Алиса», в которой открыл ее API. И вот совсем недавно выкатил все в паблик. Теперь миллионы пользователей могут запускать различные функции и сервисы голосом прямо из мобильного поиска, навигатора и из Яндекс браузера. Неудивительно, что голосовых навыков становится все больше. Но API диалогов предполагает, что вы должны уметь программировать, у вас должен быть свой сервер с HTTPS, и вдобавок вы должны уметь обрабатывать запросы на естественном языке…

Между тем уже давно существует бесплатный и довольно удобный конструктор диалогов от Google под названием Dialogflow. Он конечно же не поддерживает протокол Алисы из коробки, вот и пришла мысль исправить эту ситуацию, чтобы разработчики (и не только) быстро и без серверов создавали навыки для Алисы, которые умеют понимать естественную речь и контекст диалога.

Что такое Dialogflow


image

Dialogflow — это онлайн сервис от гугла, который позволяет создавать своих чат-ботов или функции для гугл ассистента (это называется agent). На хабре уже есть несколько неплохих статей, в которых рассматриваются основные инструменты этого продукта. Вот одна из них.

По сути, Dialogflow умеет сопоставить фразу пользователя на естественном языке (и на русском тоже) с некоторым «неязыковым» значением (называемым intent) и что-нибудь ответить. Вдобавок он еще и держит контекст диалога, чтобы на следующую фразу можно было среагировать в контексте предыдущих реплик.

Инструмент довольно прост в управлении, и еще хранит всю статистику запросов, чтобы можно было в один клик дообучать агента новыми интентами или пополнять существующие. Собственно так и происходит обучение — вы просто показываете примеры запросов, которые относятся к тому или иному интенту в вашем агенте, а Dialogflow автоматически строит модель и все лучше и лучше понимает пользователя. Также он может выделить из фразы какие-то сущности, например даты или города, если вам это необходимо для выполнения какой-то функции.

Зачем это Алисе


У Алисы есть API, сходный с API телеграма. Другими словами, чтобы создать навык для Алисы, вам нужно поднять сервер, который будет получать от Алисы текстовый запрос пользователя и отвечать данными в нужном формате. Все вроде просто, но чтобы создать даже самый простой навык, вам понадобится изучить протокол Алисы, поднять свой публичный сервер с HTTPS, написать код, который умеет понимать человеческий язык и поддерживать контекст беседы.

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

Dialogflower


image

Только вот Dialogflow не поддерживает протокол Алисы, поэтому нельзя так вот просто превратить агента в навык. Для этого и был сделан сервис dialogflower.com который по сути представляет собой адаптер — он с одной стороны реализует протокол Алисы, а с другой подключается к вашему агенту на Dialogflow. И таким образом превращает агента в навык. Без всяких серверов и кода.

image

Создаем агента


image

Итак, теперь мы можем сосредоточиться только на логике самого диалога в нашем агенте. Для начала нужно создать этого самого агента на сайте dialogflow.com

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

После этого можно добавлять интенты — темы, который будет понимать наш агент и как-то на них реагировать.

Default welcome intent


Этот интент существует по умолчанию в каждом агенте. Он срабатывает не на какую-то фразу пользователя, а на событие welcome. То есть когда пользователь запускает ваш навык в Алисе фразой типа «Запусти навык мой самыйнужныйнавык». Тогда от пользователя еще нет никакой команды, и агент в ответ как правило должен просто рассказать, что же дальше можно делать.

Если кликнуть на Default welcome intent в списке интентов, то внизу страницы можно добавить Responses — ответы, из которых агент каждый раз случайно выберет какой-нибудь и отправит Алисе.

Алиса еще умеет показывать кнопки и ссылки, далее мы покажем как их добавить в ответ

Жмем Add response — Text response и добавляем варианты текстовых ответов.

Default Fallback Intent


image

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

Реагируем на реплики


Если нажать на плюсик рядом со словом Intents в левом меню, то можно добавить новый интент и указать для него список фраз, на которые нужно что-то ответить. В списке Training phrases добавьте те фразы, которые скорее всего будет произносить пользователь. Чем их больше, тем лучше.

Конечно, Dialogflow лучше понимает английский, чем русский. Поэтому не ожидайте, что он поймет все синонимичные фразы, подходящие по смыслу. В этом плане лучше работает наш аналог Aimylogic, о котором я еще скажу ниже.

Не забудьте добавить ответы к вашему интенту и нажмите на кнопку Save. Без нее ничего не заработает.
Потестировать можно прямо тут — в правой части экрана. Напишите вашу тестовую фразу в поле Try it now и посмотрите, что ответил ваш агент.

Создаем навык


Теперь все готово, чтобы прикрутить нашего созданного агента к Алисе и потестить его в консоли Яндекс Диалогов. Для этого зайдите на dialogflower.com и нажмите на Создать навык. В появившемся окне нужно указать Client access token от вашего агента. Его можно найти на странице настроек агента в Dialogflow. Жмите Готово и через секунду у вас будет Webhook URL с которым мы отправимся на Яндекс Диалоги.

image

Тут создайте новый навык для Алисы и в его настройках укажите этот Webhook URL. Кроме него для тестов нужно только придумать называние навыка, все остальные поля заполнять пока не обязательно. Жмите Сохранить и переходите на вкладку Тестирование. Тут можно написать что-нибудь и проверить, что ваш навык работает как ожидается.

Наращиваем функционал


Теперь наш навык готов, и все изменения будут касаться только агента на Dialogflow. Просто добавляйте и изменяйте интенты, не забывайте нажимать кнопку Save и тестируйте результат в консоли Яндекс Диалогов.

Как понимать контекст


Dialogflow может выстраивать интенты в цепочки, чтобы ваш навык мог реагировать правильным образом на фразы, сказанные в контексте беседы. Чтобы это сделать, просто добавьте интент к другому интенту. Для этого перейдите на список интентов и наведите мышь на один из них. Справа появится еле заметная надпись Add follow up intent. Нажмите на нее и добавьте интент, который будет работать в контексте предыдущего.

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

Как добавить кнопки в ответ Алисы


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

Чтобы добавить кнопки в ответ, нужно написать кусочек JSON в формате, который понимает Алиса. Для этого зайдите в нужный интент, там перейдите к ответам и нажмите Add Responses — Custom Payload. Тут можно указать кусочек ответа из API Алисы. Например, чтобы добавить кнопки, напишите

{"buttons": [ 
  {"title": "Текст запроса", "hide": true} 
]}


Тут добавляется одна кнопка, которая пошлет Алисе запрос «Текст запроса» при нажатии и автоматически скроется после этого из истории чата. А вот другой пример

{"buttons": [ 
  {"title": "Текст запроса", "hide": true},
  {"title": "Ссылка на сайт", "url": "https://dialogflower.com"}
]}


Тут добавится две кнопки, одна из которых ссылка на сайт dialogflower.com

Вообще, в Payload можно написать любой JSON в формате поля «response» из протокола Алисы.

Где логика?


Конечно не всегда нужно отвечать пусть и рандомными, но статичными фразами. Для того чтобы добавить какую-то логику, нужно будет написать немножко кода. Ну или множко, зависит от вас. Зато Dialogflow позволяет это сделать без аренды серверов.

Перейдите на вкладку Fulfillment и включите переключатель Disabled. Тут вы можете написать код на Javascript, который будет нужным образом реагировать на сработавший интент и выполнять какую-то логику, прежде чем ответ отправится пользователю. Собственно сам ответ можно тут же и переопределить в коде.

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

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

В итоге


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

У Алисы есть API и каждый день для нее появляется все больше голосовых навыков.

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

Dialogflower связывает агента на Dialogflow с Алисой, чтобы можно было быстро создавать навыки и экспериментировать.

Так за чем же дело встало? Тем более что Dialogflower такой же бесплатный, как и Dialogflow с Алисой.

Ложка дегтя


Это все были диалоговые цветочки, но не все так прекрасно в реальном мире. Конечно, Dialoglfow — это классный инструмент, но на русском он работает не так хорошо, как на английском. Пока он не понимает многих синонимов, и их придется забивать вручную при создании интента.

Еще одним минусом является то, что в Dialogflow довольно сложно управлять хоть сколько нибудь сложным диалогом. Вы просто не сможете его обозреть, так как интенты — это просто плоский список.

Буквально пару дней назад на Хабре был представлен инструмент со схожим функционалом, который тоже умеет понимать естественную русскую речь, но делает это гораздо лучше, понимает синонимы, даже если вы обучили бота только на паре фраз. Там пока нет многих фишек Dialogflow, как например извлечение сущностей или статистика. Но зато есть классный визуальный редактор, на котором сразу виден весь ход диалога с пользователем. И еще можно без написания кода добавить логику.

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

Комментарии (8)


  1. alexey-m-ukolov
    01.06.2018 11:00
    +1

    Здорово, как раз собирался писать такой адаптер. Спасибо за сэкономленное время :)


  1. iMisanthrope
    01.06.2018 13:14

    Звучит интересно, вообще развитие Алисы впечатляет, особенно на фоне стагнации Siri. А какие ещё есть альтернативы Dialogflow? Упомянутый Aimylogic интересен по возможностям, но, как я понял, проприетарен. Сам я знаю о Mycroft.ai (там полный цикл, распознавание речи, вычленение интентов, формирование ответа), но хоть и опенсорс, без сервера жить не может. Ещё есть snips.ai, тоже с полным циклом, но вся цепочка работает оффлайн на железе пользователя. Хотелось бы побольше примеров подобных проектов.
    В идеале мне видится модульная структура из трёх больших блоков:


    1. Речь-в-текст, тут основная проблема в поддержке девайсов. Запилить умную колонку своими руками с уверенным распознаванием из любой точки комнаты мне видится проблематичным. А ещё неплохо бы поддержка часов, смартфона, наушников (т.к этот набор почти всегда при себе). Для яблочной экосистемы тут безальтернативно Siri, т.к вызвать что-то другое с часов или наушников, да и по ключевой фразе — невозможно. Для андроида все более радужно, есть Ассистент, есть Алиса. Ещё есть Pebble Voice, например (он кстати работает после продажи компании?).
    2. Обработка текста, поиск интентов. Тут все проще, есть Dialogflow и, наверняка, немало альтернатив, о которых, собственно, и был мой вопрос. В идеале, это должен быть опенсорс, независимый от серверов и работающий на локальном железе пользователя. Желательна поддержка любого языка.
    3. Формирование ответа. Это может быть дерганье API домашней автоматизации, различных серверов (погода, тв-программа и тд). Та же Алиса с этим неплохо справляется.
      Также необходимо формирование текстового и/или голосового ответа, соответственно, нужен text-to-speech движок. Мне известны гугловский и яндексовский, надеюсь, что есть и self-hosted альтернативы.
      Ну а если мечтать дальше, то не ограничиваться речью. Меня впечатлила способность Алисы распознавать изображения, было бы очень интересно использовать подобное по упомянутой выше схеме. И если каталогизация фото по ключевым словам стало уже обыденной вещью, то в контексте умного дома есть ещё куча возможностей для применения, например если человек взял в руки бритву — сделать свет над зеркалом поярче и т.д.


    1. morfeusys Автор
      01.06.2018 13:31

      Я вот особо «развития Алисы» не вижу пока. Сейчас у нее меньше возможностей чем у главного конкурента в лице гугла. Да и переключение между «навыками» в «голосовом ассистенте» — это странная тенденция.

      Что касается Aimylogic — что вы имеете в виду под «проприетарен»? Это визуальный конструктор с NLP движком.

      snips.ai предназначен для разработки говорящих девайсов. У нас есть похожая разработка aimybox.com — там неважно, где распознается речь.

      По вашим пунктам
      1. Алиса хоть на ведроиде и есть, но это просто стороннее приложение. Пока вы его руками не запустите — от него мало толку. Гугл ассистент — это часть ОС, поэтому он безальтернативно удобнее. Для андроида уже давно есть Дуся ассистент — гораздо гибче в плане настроек под свои нужды и со своей экосистемой. Правда она не повернута в сторону бизнеса.

      2. Альтернатив на русском языке нет, кроме упомянутого Aimylogic. NLP сравнивать с распознаванием невозможно, это совершенно разные вещи. И в NLP проблемы другого рода, многие из которых вам просто не позволят «на локальном железе пользователя» и «Желательна поддержка любого языка». Хотя есть проект art.dusi.mobi — NLP на локальном железе.

      3. Нет, та же Алиса с этим плохо справляется, потому что чтобы «дергать API домашней автоматизации» вам нужно как-то аутентифицировать пользователя и прокидывать его запросы именно к его «домашней автоматизации». А с учетом того, что перед этим нужно сказать волшебную фразу типа «запусти навык домашняя автоматизация», а только потом говорить что-то «домашней автоматизации»… Короче это не про голосовых ассистентов.


      1. iMisanthrope
        01.06.2018 14:03

        Я мало знаком с решением от Гугла, на фоне Siri, которая русскому-то научилась спустя несколько лет, темп развития и возможности Алисы впечатляют. Siri не умеет практически ничего, кроме стандартных вещей вроде погоды, ответа на смс, простейшего управления девайсами в доме. Ну а главный ее минус — закрытость и вендорлок. Недавно выкатили SiriKit, но из приложений, которыми я пользуюсь, поддержка Siri появилась только в двух. Вообщем, печально с ней все.
        Слабая интеграция Алисы в железо удручает, но, вроде на Андроид уже есть лаунчер с ней. Ну а в идеале компоненты системы должны заменяться, не теряя степени интеграции в ОС.

        Aimylogic — что вы имеете в виду под «проприетарен»?

        Ну, что нет self-hosted решения и код закрыт. Возможно, я ошибаюсь, пока успел лишь бегло ознакомиться с сайтом.
        просто не позволят «на локальном железе пользователя»

        В snips.ai, например, обучение происходит в облаке, после чего результаты загружаются на локальное устройство и вся дальнейшая работа по преобразованию речи в текст, распознаванию интентов и ответу выполняется оффлайн.
        Нет, та же Алиса с этим плохо справляется, потому что чтобы «дергать API домашней автоматизации»

        Я имел ввиду, что Алиса неплохо справляется с вопросами о погоде, курсе валют и тд. Самому пилить привязки с запросами к серверам погоды и прочему довольно накладно. А к домашней автоматизации прикрутить лучше как раз самому, все таки это более индивидуальный вопрос. И не слишком проблематичный, если API у автоматизации нормальный. Опять же, есть готовые привязки к Home Assistant у Dialogflow, Google Assistant, Amazon Alexa и тд.
        нужно сказать волшебную фразу типа «запусти навык домашняя автоматизация»

        Согласен, не очень удобно. У Alex'ы (при схожей архитектуре с базовым функционалом и навыками от сторонних сервисов) ничего такого нет, насколько я знаю.


        1. morfeusys Автор
          01.06.2018 14:34

          По поводу snips — немного не так. Распознавание там может быть и через облако — тот же гугул например.

          А к домашней автоматизации прикрутить лучше как раз самому, все таки это более индивидуальный вопрос.

          Без публикации навыка вы ничего не сделаете в личных целях — такое уж представление яндекса об удобстве

          У Alex'ы (при схожей архитектуре с базовым функционалом и навыками от сторонних сервисов) ничего такого нет, насколько я знаю.

          Вы имеете в виду что нет скилов для домашней автоматизации? Ошибаетесь — там их полно.


          1. iMisanthrope
            01.06.2018 18:14

            У Alex'ы нет необходимости предварительно "включать" скилл специальной фразой.


            1. morfeusys Автор
              01.06.2018 19:36

              Еще как есть. Причем голос в запускаемом скиле может быть совершенно другим — хоть мужским


  1. alexhott
    01.06.2018 21:13

    надо заставить Алису говорить с Siri и понаблюдать как пойдет