Skip to content

Архитектура Агрегата

Dmitry Che edited this page Apr 4, 2016 · 4 revisions

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

Что внутри

Агрегат - это Java приложение, работающее на фреймворке Vertx. Внутренняя структура и API Агрегата используют возможности и парадигму этого фреймворка, поэтому все что верно с точки зрения Vertx, верно и для Агрегата.

Немного о Vertx

vertx Это масштабируемый и расширяемый фреймворк для создания многомодульных приложений, где взаимодействие между модулями происходит по принципу реактивной парадигмы - за счет обмена событиями и их неблокирующей обработкой. В этом смысле Vertx подобен NodeJS, но предоставляет также возможность использовать сразу несколько языков программирования для реализации модулей приложения.

Подробнее о Vertx и его API для разных языков программирования можно узнать из официальной документации.

Как работает Агрегат

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

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

Что могут делать модули

  • реализовывать любые голосовые функции с возможностью переключения контекстов
  • организовывать новые способы активаций Агрегата
  • предоставлять сервис распознавания или синтеза речи (онлайн или офлайн)

Да и вообще все что угодно. Например реализовать пользовательский интерфейс для различных нужд (в том числе для управления другими модулями Агрегата).

Как работает модуль

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

Агрегат - это декларативный фреймворк для создания голосового ассистента, определяющий лишь правила взаимодействия модулей

Виды событий

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

Простой пример событий

Пользователь активировал Агрегат и начинает говорить команду.

Модуль активации (например модуль активации с клавиатуры) генерирует событие asr.start, которое указывает, что нужно начать распознавать речь в текст. Другой модуль (модуль распознавания речи) обязан слушать этот вид событий и среагировать на него - то есть начинать слушать речь через микрофон устройства. Как он это будет делать - это его задача.

В момент начала фактической записи речи пользователя модуль распознавания должен отправить широковещательное событие asr.state с сообщением start. А когда закончит слушать - широковещательное событие asr.state с сообщением end.

Как только модуль распознавания речи распознал речь или получил ошибку распознавания, он обязан отправить широковещательное событие asr.result с распознанным текстом в качестве сообщения (или пустым сообщением в случае ошибки).

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

Собственные события

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

Полный список событий

Полный список типов событий с описанием можно найти здесь.

Russian Version (Русская версия)





IDE


English Version

Main Page

Modules

  • List of available modules

User Guide

  • Where to get

  • How to install

  • How to use

  • Setting up


Developer Guide

Aggregate Architecture

Events List

Command Line


How to Create a Module

  • Java
  • Javascript
  • Typescript
  • Groovy
  • Ruby

Functional Modules

  • Query grammar

  • Pattern syntax

  • Dynamic patterns

  • Standard patterns

Activation Modules

Speech Recognition Modules

Text-to-Speech Modules


IDEs

  • Developing in Eclipse
  • Developing in IntelliJ IDEA

Change Log

Clone this wiki locally