Разработка мобильного программного агента с голосовым управлением для PC-совместимых компьютеров

Библиографическое описание статьи для цитирования:
Дроздова Е. Н., Шавкунов В. С. Разработка мобильного программного агента с голосовым управлением для PC-совместимых компьютеров // Научно-методический электронный журнал «Концепт». – 2017. – Т. 31. – С. 821–825. – URL: http://e-koncept.ru/2017/970179.htm.
Аннотация. В статье рассматривается разработка русскоязычного голосового интеллектуального ассистента для управления OС Windows и взаимодействия с интернет-сервисами. Рассмотрена реализация обращения к устройствам аудиозаписи. Исследуется анализ речевых команд на основе наивного байевского классификатора. Рассмотрена реализация синтеза речи с помощью системы Ivona. Показана реализация взаимодействия разработанной интеллектуальной системы с внешними API.
Комментарии
Нет комментариев
Оставить комментарий
Войдите или зарегистрируйтесь, чтобы комментировать.
Текст статьи
Дроздова Елена Николаевна,кандидат технических наук, доцент кафедры Информационных и управляющих систем, Санкт–Петербургский государственный университет промышленныхтехнологий и дизайна, г. СанктПетербургendrozdova2@list.ru

Шавкунов Виктор Сергеевич,медиакомпанияSaber Interactive, должностьQuality Assurance Specialist, г.СанктПетербургvshavkunov@gmail.com, vshavkunov@saber3d.ru

Разработка мобильного программного агента с голосовым управлением для PCсовместимых компьютеров

Аннотация.В статье рассматривается разработка русскоязычного голосового интеллектуального ассистента для управления OС Windows и взаимодействия с интернетсервисами.Рассмотрена реализация обращения к устройствам аудиозаписи. Исследуется анализ речевых команд на основе наивного байевского классификатора. Рассмотрена реализация синтеза речи с помощью системы Ivona. Показана реализация взаимодействия разработанной интеллектуальной системы с внешними API.Ключевые слова:голосовой интеллектуальный ассистент, искусственный интеллект, управление голосом, взаимодействие с ПК, интерфейсы взаимодействия, синтез голоса, классификация речи, работа с API.

ВведениеВ СПбГУПТД на кафедре информационных и управляющих систем разработан рабочий прототип русскоязычного интеллектуального ассистента с голосовым управлением для PCсовместимых компьютеров [1]. Новизна разработки по сравнению с аналогами заключается в ее поддержке русского языка, ПКсовместимых платформ, поддержке расширяемости, а также акцентена взаимодействиис интернетсервисами и операционной системой, в отличие от аппаратных средств, делающих акцент на взаимодействие с умным домом. Также, формируется образ некого "дворецкого", личного помощника, в отличие от аналогичных программных средств, делающих упор более на справочную систему.В качестве инструментальных средств разработки выбраны: среда программирования Delphi 10 Seattle, система распознавания речи Google Cloud Platform, система синтеза голоса Ivona Voice Synthesis. В качестве перспективы развития проекта предполагается перевести разработку в среду C#.Далее рассмотримособенностиосновныхэтаповработы над проектом.1.Планирование ScrumспринтовДля эффективной и гибкой разработки ПО, лучше всего организовывать процесс посредством коротких шагов (спринтов). В конце каждого спринта происходит оценка достигнутых результатов и план разработки корректируется в соответствии с требованиями. Каждый спринт длится одну или две недели. За более короткие сроки сложно решить поставленные задачи, а за более долгий срок забываются цели и размывается видимость. На первых этапах планирования спринта происходит планирование процесс, в котором из беклога берутсянаиболее приоритетные задачи, которые позволяют достичь результата. Каждая задача оценивается в часах. Важной частью продвижения по спринту является решение задач, поставленных только в конкретный спринт. Решение задач из следующих спринтов должно быть обоснованным и сопряжено с исключением других задач из текущего спринта [2].Так, в рамках данного исследования были обусловлены спринты A1, A2, Backlog.Краткий список задач, поставленных в первый спринт представлен в таблице 1.

Таблица 1–Спринт А1№п/пТип задачиПриоритетзадачиНаименование задачиПланируемое время для решения конкретной задачи1TaskBlockerПодключить Speech API2h2TaskBlockerПодключить синтезатор голоса8h3TaskBlockerНастроить классификатор запросов5h4BugCriticalКлассификатор выдает вероятность –inf для некоторых запросов2h5TaskCriticalОбучить базуклассификатора5h6TaskMajorНастроить пользовательский интерфейс10h7BugCriticalУстранить 403/Forbidden в idHTTP2h8TaskCriticalПодключить пробный API2h9TaskCriticalНастроить парсер JSON1h10TaskMajorИзучить возможность подключения многослойной нейронной сети10h11TaskBlockerРеализовать работу с аудио через системные устройства3h12TaskMinorПодготовить список API сервисов5h13BugCriticalУстранить ложные срабатывания анализатора4h

Тип задачи может быть как Bug (Баг, ошибка), так и Task (Задача).Приоритет задачи определяется по шкале:Trivial, Minor, Major, Critical, Blocker, гдеBlocker –задача блокирует дальнейшую разработку; Critical –критическая задача, нарушающая работу некоторой части системы; Major –важная задача, необходимая для дальнейшего продвижения; Minor –задача, не влияющая на остальные процессы; Trivial –задача, не влияющая на общее качество продукта, малозаметная ошибка.На рисунке 1 представлено распределение задач, поставленных в первый спринт, по приоритету.

Рис. 1.Подготовка спринтов разработки2.Обращение к устройствам аудиозаписиСуществует множество способов записи аудио с микрофона в среде программирования Delphi:TCaptureDeviceManager, Bass.dll, Windows API, сторонние компоненты. Для записи аудионаиболее оптимальным с точки зрения поддержки и перфоманса, является использование Windows API, поскольку он поддерживается нативно операционной системой, а также обеспечивает управление аудиопотоком на низком уровне.Для воспроизведения аудиотакой метод не подходит, поскольку, в силу особенностей работы сервиса синтеза речи, Windows API плохо работает с нестандартными аудиоформатами, поэтому удачным решением будет являться использование сторонних компонентов по типу New Audio Components, поскольку он обеспечивает большую гибкость, поддерживает работу с потоками памяти, а также прост в обращении.

На рисунке 2 представленаблок схема и соответствующий ей фрагмент программы, реализующийчасть необходимого функционала.

Рис.2. Блок схема и фрагмент программы, реализующий воспроизведение аудио

3.Подготовка условий для работы со Speech APIЭкспериментальным методом было выявлено, что Google Speech API воспринимает речь из WAV файлов с гораздо большим процентом ошибок, нежели из файлов во FLAC формате.Так как Windows API не позволяет записывать аудиопоток напрямую во FLAC файл, то перед намивстает задача конвертации форматов. С этим легко справляется свободно распространяемый модуль flac.exe, способный принимать на вход имя файла и требуемые параметры для конвертации.3.1.Использование flac.exeВ данной работе для гибкой настройки конвертатора используется заранее подготовленный Batch скрипт, выполняемый непосредственно OC Windows. Команда на исполнение подается непосредственно из интеллектуальной системы с помощью использования метода RunApp, исходный код которого представлен на рисунке 3.

function RunApp(my_app : string; my_wait : bool) : bool; var si : TStartupInfo; pi : TProcessInformation; begin Result := false; try ZeroMemory(@si,SizeOf(si)); si.cb := SizeOf(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := SW_HIDE; if CreateProcess(nil,PChar(my_app),nil,nil,False,0,nil,nil,si,pi)=true then Result := true; try CloseHandle(pi.hThread); except ; end; if my_wait = true then WaitForSingleObject(pi.hProcess, INFINITE); try CloseHandle(pi.hProcess); except ; end; except Result := false;; end; end;Рис.3. Исходный код метода RunApp

Сам Batchскрипт encode.batпредставляет из себя следующую строку:

flac.exe0 frecord.wav. В дальнейшем предполагается отказ от использования Batch файла и вызов конвертации напрямую из кода.3.2.Подклюение библиотек для работы с сетьюДля реализации работы с сетью используются как стандартные компоненты Delphi –Indy 10, таки сторонние библиотеки, такие как Synapse.В связи с необходимостью устанавливать защищенное соединение посредством https, в проект были импортированы dll библиотеки libeay32.dll и ssleay32.dll.Данные библиотеки представляют из себя криптографический пакет с исходным кодом OpenSSL, позволяющий производить работу с SSL/TLS. OpenSLL основана на SSLeay, написанной Эриком Янгом и Тимом Хадсоном. Для работы с речевыми сервисами необходимо использование хеширование типа SHA256 и HMACSHA256. Данный вид хеширования предназначен для создания «отпечатков» сообщений произвольной байтовой длины и предназначен для защиты информации.Поскольку OpenSSL предоставляет множество видов хеширования и шифрования, но не поддерживает SHA2, то решение вопроса хеширования делегировано стандартной библиотеке Delphi System.Hash. Следует учесть, что наличие данной библиотеки реализовано только в новейших версиях среды Embarcadero Delphi.Так, библиотека Synapse используется для передачи голосового файла в Google Speech API, поскольку обладает более гибкими настройками и отличается большей стабильностью, нежели Indy.Пример блок схемы и соответствующего ей фрагментапрограммыпередачи файла представлен на рисунке 4.

Рис.4.Блок схема и фрагмент программыпередачи файла

4. Разработка интерфейсаОсновная подложка интеллектуального ассистента выполнена в пакете Adobe Photoshop и представляет из себя черный экран, обрамленный металлическим корпусом с потертостями.Итоговый вид приложения можно видеть на рисунке 5.

Рис. 5.Интерфейс интеллектуального ассистента

Для создания анимаций было решено использовать зарекомендовавший себя пакет Adobe After Effects, позволяющий достаточно тонко контролировать поведение каждого объекта, расположенного в кадре.Результатом работы в данной программной среде стал ряд aviвидеофайлов, символизирующих различные состояния интеллектуальной системы: состояние простоя, прослушивания, выполнения фоновой работы, нотификации пользователя о событии, нотификации об ошибке.Для достижения удовлетворяющего визуального стиля были применены такие эффекты как Blur, Glow, Color overlay. Основная форма индикации была нарисована в программном пакете Adobe Photoshop.Вывод отрендеренных видеороликов, полученных ранее, производится посредством компонента TMediaPlayer, оперирующим mci сообщениями, аналогичными тем, что были использованы в системе записи аудио. В качестве экрана используется компонент TPanel, в котором были удалены все рамки путем редактирования параметров компонента.Поддержка смены анимацийв интерфейсе программы осуществляется путем своевременной загрузки в компонент TMediaPlayer необходимого видеофайла и его последующего воспроизведения.

В коде объявлен пользовательский тип TStateSystem типа TObject, имеющий следующий набор свойств и методов: currentState (integer), isReplayNeeded (Boolean), nextStage (integer), NextStateController (procedure), ChangeState (function).

На рис. 6 представленачасть исходного кода, контролирующего смену состояний.

function TStateSystem.changestate(id:integer):boolean;var anim_name:string;begincase id of 0: begin anim_name:='idle.avi'; isreplayneeded:=true; end; 1: begin anim_name:='idle2error.avi'; isreplayneeded:=false; end; 2: begin anim_name:='idle2work.avi'; isreplayneeded:=false; end; 22: begin anim_name:='work.avi'; isreplayneeded:=true; end; 23: begin anim_name:='work2idle.avi'; isreplayneeded:=false; end; 3: begin anim_name:='notification.avi'; isreplayneeded:=false; end; 4: begin anim_name:='scilentwork.avi'; isreplayneeded:=true; end;end;currentstate:=id;with Form1 do beginMP.FileName:=AppPath+'\ui\vid\'+anim_name;MP.AutoRewind:=isreplayneeded;MP.Open; MP.Play;end;end;

Рис.6.Исходный код, контролирующий смену состоянийинтеллектуальной системы

5. Анализ речевых команд

Для анализа речевых команд на данном этапе разработки используется “наивный байевский классификатор” [3]. В дальнейшем планируется использование нескольких уровней байевских классификаторови подключение нейронной сети.Внутри приложения данный метод реализован посредством работы с iniфайлами, использующимися в качестве обученной базы.Основная функция анализа запроса методом байевской классификации представлена на рис. 7.

Рис.7.Работаклассификатора

6. Синтез речиОпределив тематику и детали запроса, интеллектуальной системе необходимо прокомментировать событие, реализовать обратную связь с пользователем. Именно голосовое сопровождение является наиболее естественным и простым для восприятия видом нотификации.Хорошоподходитдля синтеза речи система Ivona, разработанная корпорацией Amazon. В рамках данной работы были протестированы различные голосовые синтезаторы от различных разработчиков: Yandex, Google, AcapellaGroup, Vokalizer, RHVoice, ESpeak, Festival. Но именно Ivona показал субъективно лучшее звучание голоса, максимально приближенного к натуральному.Сервис Ivona предоставляет бесплатно до 50000 запросов на синтез голоса в месяц, что полностью покрывает потребности интеллектуальной среды. Так, на одни сутки приходится более полутора тысяч запросов в день, что равнозначно семидесяти запросов в час. Взаимодействие с сервисом реализуется посредством открытого API, к которому представлена богатая техническая документация.На рис. 8представлена блок схема ифрагментисходного кода программы, реализующего запрос к системе Ivona.

Рис.8.Блок схема и фрагмент программы, реализующейзапрос к системе Ivona

7. Взаимодействие с внешними APIКак правило, большинство интернетсервисов позволяет взаимодействовать со своим API посредством отправки REST запросов, возвращая при этом JSON или XML объект, хранящий необходимые для разработчика данные. Целью разработчика является чтение данного объекта, а в частности его конкретных параметров, необходимых для реализации того или иного функционала внутри приложения.В интеллектуальной системе реализовано взаимодействие с погодным сервисом OpenWeatherMap. Отправляя GET запрос с необходимыми параметрами (таких как ширина, долгота, требование метрической системы, уникальный идентификатор разработчика), мы получаем JSON объект типа, представленного на рис. 9.

{"coord":{"lon":30.32,"lat":60.08},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}],"base":"stations","main":{"temp":3.53,"pressure":1000,"humidity":64,"temp_min":2.22,"temp_max":6.11},"wind":{"speed":2.66,"deg":281.5},"rain":{},"clouds":{"all":56},"dt":1465518061,"sys":{"type":3,"id":77040,"message":0.0285,"country":"RU","sunrise":1465519000,"sunset":1465586433},"id":873882,"name":"Torfyanoye","cod":200}

Рис.9. JSON объект

Так, мы видим такие параметры, как: координаты, уникальный идентификатор погодного состояния, его описание, температура воздуха, давление, влажность воздуха, минимальная и максимальная температуры, скорость и направление ветра и другие.С помощью кода, представленного на рис. 10, интеллектуальная система взаимодействует с погодным сервисом:

idhttp1.Get('http://api.openweathermap.org/data/2.5/weather?lat=60.07&lon=30.33&APPID=SECRET_ID_NOT_FOR_PUBLIC_LISTINGS&units=metric',stream); stream.Position:=0;

memo1.Lines.LoadFromStream(stream); stream.Position:=0; FJSONObject:=TJSONObject.ParseJSONValue(stream.ReadString(stream.Size)) as TJSONObject; JsonArray:=FJSONObject.GetValue('main'); if Assigned(FJSONObject) then ss:=TJSONObject(JsonArray).Get('temp').JsonValue.Value; ss2:=TJSONObject(JsonArray).Get('pressure').JsonValue.Value; ss3:=TJSONObject(JsonArray).Get('humidity').JsonValue.Value; JsonArray:=FJSONObject.GetValue('weather'); if Assigned(FJSONObject) then //ss4:=TJSONObject(JsonArray).Get('main').JsonValue.Value; ss4:=caseweatherid(strtoint(TJSONObject(TJSONObject(JsonArray).Get(0)).Get('id').JsonValue.Value)); JsonArray:=FJSONObject.GetValue('wind'); if Assigned(FJSONObject) then //ss4:=TJSONObject(JsonArray).Get('main').JsonValue.Value; ss5:=TJSONObject(JsonArray).Get('speed').JsonValue.Value; ss6:=casewinddir(strtofloat(TJSONObject(JsonArray).Get('deg').JsonValue.Value)); result:=inttostr((round(strtofloat(ss))))+' градусовпоцельсию, давление'+ss2+' гектопаскалей, влажность'+ss3+ 'процентов, ветер'+ss6+', '+inttostr((round(strtofloat(ss5))))+'метроввсекунду, '+ss4; stream.Free; idhttp1.Free;end;Рис. 10. Программный код, реализующий взаимодействие интеллектуальной системы с погодным сервисом

Анализируя код, можно заметить, что алгоритм выглядит так:Создание объекта типа TIdHTTP;Отправка GET запроса посредством IdHTTP и последующее получение JSON объекта в переменную типа TStringStream;Чтение данных из строкового потока в объект типа TJSONObject;Парсинг данных из JSON;Генерация ответа.Данный пример показывает метод взаимодействовия с внешними сервисами посредством API. Общая методология подключения других API аналогична.

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

Рис.11.Алгоритм работы интеллектуального компьютерного ассистента

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

Ссылки на источники1.Дроздова Е.Н., Шавкунов В.С. Разработка голосового интеллектуального ассистента для управления OS Windows и взаимодействия с интернетсервисами. – Вестник молодых ученых, № 2, 2016, с. 4043.2.Sahota, M. An Agile Adoption And Transformation Survival Guide/ M. Sahota. —Б.м.: lulu.com, 2012. —80 с.3.Наивныйбайевский классификатор [Электронный ресурс] // Денис Баженов: суровая реальность: [сайт] / Электрон. Текстовые дан. / Б. м., [2012] –Режим доступа: http://bazhenov.me/blog/2012/06/11/naivebayes.html, Дата обращения: 21.04.2016.