Искусственный интеллект под Android с открытым API

от автора


Только ленивый не знает сегодня о том, что такое голосовой помощник Siri. Когда два года назад этот продукт был показан на презентации нового iPhone 4S, многие посмотрели на развитие IT-индустрии по-новому. Действительно, искусственный интеллект в кармане, понимающий естественную речь, еще не показывал никто.

Многие в то время начали говорить о том, что Apple может уже на следующем WWDC предоставить всем программистам под iOS возможность использовать открытое API ассистента Siri для своих собственных программ. Картина вырисовывалась радужной — любое приложение смогло бы реагировать на пользовательские фразы, исполняя различные команды. Действительно, если в магазине AppStore так много разных полезных приложений, почему бы им не дать возможность управления голосом? Тем более что такой вид коммуникации с пользователем, как речь, быстро стал трендовым после выхода iPhone 4s.

О том, удалось ли это сделать Apple, и что удалось сделать нам, читайте далее.

Время шло, а API у Siri не появлялось


Надо отметить, что большинство путает просто распознавание речи и собственно возможности ассистента как искусственного интеллекта. Между этими двумя понятиями огромная разница — решения по распознаванию речи (speech-to-text) присутствуют на рынке уже давно (к примеру, в ОС Android она доступна всем желающим), а вот создать открытую технологию диалоговой системы (с поддержанием контекста, извлечением смысла и т.д.) не удавалось еще никому. Многие также не задумывались о том количестве проблем, которые возникнут при общем доступе множества программ к единому мозговому центру AI в лице Siri. А также о том числе совершенно новых технологий, с которым программистам пришлось бы иметь дело.

Идея создать голосового ассистента с открытым и доступным для всех API “искусственного интеллекта” уже витала на тот момент в наших головах, и мы решили ее осуществить.

Ассистент на русском


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

Стоит заметить, что создание подобной голосовой платформы предполагает наличие знаний в таких специализированных областях как технологии распознавания (ASR) и синтеза речи (TTS), а также NLP, позволяющего извлекать смысл из пользовательской речи и управлять контекстом диалога. Именно этот компонент является связующим для любой системы искусственного интеллекта и позволяет не просто превратить речь в текст, но и понять, чего хочет пользователь. Это и отличает технологию распознавания речи от технологии искусственного интеллекта.

Нашей целью было сделать доступный инструмент для использования этих технологий.

К моменту запуска приложение умело решать повседневные задачи пользователя с помощью речи. А пользователи Android версии JellyBean могли выполнять голосовые команды без подключения к интернету.

Открытое API искусственного интеллекта

С первого дня каждый сервис “Ассистента на русском” создавался на основе той же платформы, которую мы планировали открывать для всех в будущем. Этот принцип по-английски называется “Eating your own dog food”. Таким образом мы могли параллельно проектировать голосовую архитектуру и функциональность самого ассистента.

Результатом нашей работы стало приложение с открытым API и “гибридной” технологией NLP, которая, с одной стороны, дает возможность программировать голосовой интерфейс без всяких серверов, с использованием только вашего девайса и Android SDK, а с другой стороны, переносить часть решений в облако по необходимости. Например, ваши контакты не отправляются ни на какие серверы (привет, Siri), а список всех городов, с которыми работает, скажем, сервис “Погода”, не хранится на клиенте.

Все сервисы ассистента создавались разными программистами, часть которых не имеют специальных знаний в области ASR, TTS или NLP. При этом особых сложностей в использовании API нашего “Ассистента” не было, так как мы ставили себе задачу сделать открытую, доступную и понятную всем платформу.

“Ассистент на русском” использует возможность межпроцессного взаимодействия (IPC) в ОС Android, так что сам ассистент выступает в роли голосового интерфейса между пользователем и вашим собственным приложением. При этом ваше приложение может отображать свой GUI в интерфейсе ассистента — для этого используются RemoteViews и другие похожие техники.

Что умеет API

За счет API “Ассистента на русском” можно создавать и гораздо более интересные варианты, где функциональность ассистента выходит за пределы устройства, на котором он работает. Например, стороннее приложение “АссистентКоннект”, используя API нашего ассистента, дает возможность управлять голосом различными устройствами “умного” дома и домашним кинотеатром.

При этом “АссистентКоннект” является обычным андроид-приложением, которое умеет отправлять запросы по HTTP-протоколу кинотеатру XBMC и ZWave контроллеру умного дома Vera.

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

Как получить API

Попробовать API в своих собственных проектах можно уже сейчас, скачав его с нашего сайта. Сейчас мы даем только краткое описание того, как можно его использовать. В следующих статьях мы более детально опишем технические подробности реализации всей платформы “Ассистента на русском”, а также расскажем о нюансах использования самого API.

Данная статья — самый первый шаг по публикации API ассистента. В ближайшем будущем многое будет меняться, мы планируем предоставить больше возможностей, в том числе каталог дополнений, с помощью которого пользователь сможет находить в PlayStore все приложения с поддержкой функции голосового управления, а также коммерческое SDK для создания собственных голосовых ассистентов.

Основы

Для внедрения библиотеки с API ассистента в свое приложение вам не понадобится изучать никаких новых языков программирования или технологий. Все, что вам нужно — это Android SDK и IDE для разработки. Мы предлагаем использовать Android Studio. Подключение библиотек осуществляется просто указанием зависимостей в файле build.gradle

repositories {     maven {         url 'http://voiceassistant.mobi/m2/repository'     } }  dependencies {     compile 'mobi.voiceassistant:base:0.1.0-SNAPSHOT'     compile 'mobi.voiceassistant:client:0.1.0-SNAPSHOT' } 

API позволяет установить связь между вашим приложением и “Ассистентом на русском” таким образом, что все фразы пользователя, по смыслу подходящие вашему приложению, будут перенаправлены специальному сервису, который вы должны реализовать. Мы называем такие сервисы Агентами.

Агенты и модули

Ассистент заранее извлечет все необходимые данные из текста фразы и предоставит их агенту в виде семантического дерева разбора — Токена. Это происходит благодаря специальным грамматикам (Модулям), которые вам нужно сформировать для вашего сервиса.

Модуль — это набор команд с шаблонами (Паттернами) фраз, на которые должен реагировать ваш агент (синтаксис паттернов детально описан в документации к API). Агент в любой момент может ограничить набор таких модулей, доступных пользователю, тем самым сформировав контекст диалога. Вот пример простейшего модуля:

<?xml version="1.0" encoding="utf-8"?> <module xmlns:android="http://schemas.android.com/apk/res/android">      <pattern name="UserName" value="*" />      <command android:id="@+id/cmd_hello">         <pattern value="привет* *"/>     </command>      <command android:id="@+id/cmd_name">         <pattern value="* меня зовут $UserName"/>     </command>  </module> 

Модуль — это просто xml-файл, который нужно хранить в ресурсной директории xml вашего приложения. Здесь приведен пример простейшего модуля с двумя командами и очень простыми паттернами.
Как видите, модуль не содержит никакого управляющего кода, так как весь код будет описан в классе вашего агента. Это отражает основной принцип нашего подхода к голосовому API — декларативная часть, описывающая грамматику диалога, отделена от управляющего кода, который реализует логику обработки и полностью независим от языка.

Агент — это, по сути, надстройка над обычными Android-сервисами. Он реализует интерфейс между ассистентом и логикой вашего приложения.

public class HelloAgent extends AssistantAgent {     @Override     protected void onCommand(Request request) {         switch (request.getDispatchId()) {             case R.id.cmd_hello:                 onHello(request);                 break;             case R.id.cmd_name:                 onName(request);                 break;         }     }     ... } 

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

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

request.addQuickResponse(“Привет!”);

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

Response response = request.createResponse(); response.setContent(getString(R.string.hello_say_name)); response.enterModalQuestionScope(R.xml.name); request.addResponse(response); 

Здесь ответ кроме контента в виде строки (можно передавать и другие виды контента, например GUI) содержит еще и информацию об изменении контекста диалога. Теперь пользователю будут доступны команды только из модуля R.xml.name, и после озвучки ассистентом ответа от агента автоматически включится микрофон — это называется “модальный режим”.

Каждый агент — это сервис, и поэтому его надо описать в манифесте приложения — AndroidManifest.xml

<service android:name=".HelloAgent">  <intent-filter>        	<action android:name="mobi.voiceassistant.intent.action.COMMAND"/>              <data android:scheme="assist" android:host="mobi.voiceassistant.ru"/>        </intent-filter>         <meta-data android:name="mobi.voiceassistant.MODULE" android:resource="@xml/hello"/>  </service>  

Здесь указывается основной модуль агента и пакет того “Ассистента на русском”, с которым агент может работать.

После сборки вашего приложения и установки на девайс “Ассистент на русском” подхватит информацию из вашего манифеста и загрузит модуль. А затем будет перенаправлять все подходящие запросы от пользователя к вашему агенту, если NLP-движок ассистента посчитает, что фраза подходит лучше всего под паттерны команд модуля.

Продолжение следует

В этом посте мы очень кратко привели основы использования нашего API, описав базовые принципы работы с ним. Конечно, библиотека ассистента предоставляет множество более сложных функций: удаленные и нечеткие паттерны, RemoteViews, динамическое изменение контента ответа, извлечение данных из фраз и многое другое. Все это описано в документации, которую мы будем дополнять по ходу доработок в самой библиотеке.

Мы предлагаем вам попробовать голосовое управление в ваших собственных проектах, вступить в сообщество разработчиков и помочь в улучшении этого инструмента.

ссылка на оригинал статьи http://habrahabr.ru/company/ifree/blog/202132/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *