-
Notifications
You must be signed in to change notification settings - Fork 40
Архитектура Агрегата
Агрегат - это мультимодульная, мультиплатформенная программная голосовая система с открытым API и возможностью расширения за счет модулей.
Агрегат - это Java приложение, работающее на фреймворке Vertx. Внутренняя структура и API Агрегата используют возможности и парадигму этого фреймворка, поэтому все что верно с точки зрения Vertx, верно и для Агрегата.

Подробнее о Vertx и его API для разных языков программирования можно узнать из официальной документации.
Агрегат организует взаимодействие между модулями за счет обмена с ними асинхронными сообщениями. Ядро Агрегата берет на себя работу по синхронизации такого обмена, реализации анализа текста пользовательского запроса (NLP) и диспетчеризации запросов к нужным модулям. А также выполняет работу по обработке сообщений от модулей и переключению диалоговых контекстов.
Другими словами, сам Агрегат - это связующее звено между всеми модулями, организованный вокруг парадигмы голосового ассистента, который умеет распознавать речь, переключать контексты, совершать действия и синтезировать голосовой ответ (или ответы).
- реализовывать любые голосовые функции с возможностью переключения контекстов
- организовывать новые способы активаций Агрегата
- предоставлять сервис распознавания или синтеза речи (онлайн или офлайн)
Да и вообще все что угодно. Например реализовать пользовательский интерфейс для различных нужд (в том числе для управления другими модулями Агрегата).
Агрегат не накладывает никаких ограничений на то, как именно модуль реализует свою функцию, какие сторонние библиотеки использует и как взаимодействует с системой.
Агрегат лишь указывает, какие виды событий могут происходить в системе, и каким образом необходимо на них реагировать, чтобы получить нужный результат. Все остальное определяет сам модуль.
Агрегат - это декларативный фреймворк для создания голосового ассистента, определяющий лишь правила взаимодействия модулей
Чтобы создать свой модуль, необходимо понимать, какие виды событий происходят в Агрегате, и как на них нужно реагировать в коде своего модуля.
Пользователь активировал Агрегат и начинает говорить команду.
Модуль активации (например модуль активации с клавиатуры) генерирует событие asr.start, которое указывает, что нужно начать распознавать речь в текст. Другой модуль (модуль распознавания речи) обязан слушать этот вид событий и среагировать на него - то есть начинать слушать речь через микрофон устройства. Как он это будет делать - это его задача.
В момент начала фактической записи речи пользователя модуль распознавания должен отправить широковещательное событие asr.state с сообщением start. А когда закончит слушать - широковещательное событие asr.state с сообщением end.
Как только модуль распознавания речи распознал речь или получил ошибку распознавания, он обязан отправить широковещательное событие asr.result с распознанным текстом в качестве сообщения (или пустым сообщением в случае ошибки).
Вот пример того, как Агрегат декларирует правила взаимодействия между модулями на основе событий. Заметьте, что в этом примере не приводилось ни одной строчки кода, так как сама реализация модуля лежит на разработчике модуля и никак не ограничивается Агрегатом.
Конечно же, любой модуль может генерировать свой тип событий с нужным сообщением, чтобы другие модули могли использовать эту информацию как-либо для реализации своих функций. Так, например, модуль активации с клавиатуры рассылает код клавиши в широковещательном событии каждый раз, как пользователь нажимает или отпускает клавишу. В свою очередь модуль Диктовка слушает этот вид событий, чтобы переключить контекст Агрегата и слушать любой текст, в случае если пользователь нажал нужную комбинацию клавиш.
Полный список типов событий с описанием можно найти здесь.
- Разработка в Eclipse
- Разработка в IntelliJ IDEA
- List of available modules
-
Where to get
-
How to install
-
How to use
-
Setting up
- Java
- Javascript
- Typescript
- Groovy
- Ruby
-
Query grammar
-
Pattern syntax
-
Dynamic patterns
-
Standard patterns
- Developing in Eclipse
- Developing in IntelliJ IDEA