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

Подробнее о Vertx и его API для разных языков программирования можно узнать из официальной документации.
Агрегат организует взаимодействие между модулями за счет обмена с ними асинхронными сообщениями. Ядро Агрегата берет на себя работу по синхронизации такого обмена, реализации анализа текста пользовательского запроса и диспетчеризации запросов к нужным модулям. А также выполняет работу по приему сообщений от модулей и переключению контекстов.
Другими словами, сам Агрегат - это связующее звено между всеми модулями, организованный вокруг парадигмы голосового ассистента, который умеет распознавать речь, переключать контекст, совершать действия и синтезировать голосовой ответы (или ответы).
- реализовывать любые голосовые функции с возможностью переключения контекстов
- организовывать новые способы активации Агрегата
- предоставлять сервис распознавания или синтеза речи (неважно, онлайн или офлайн)
Да и вообще все что угодно. Например предоставлять любой пользовательский интерфейс для различных нужд (в том числе для управления другими модулями Агрегата).
По сути, Агрегат не накладывает никаких ограничений на то, как именно модуль реализует свою функцию, какие сторонние библиотеки использует и как взаимодействует с системой.
Агрегат лишь указывает, какие виды событий могут происходить в системе, и каким образом должно на них реагировать, чтобы получить нужный результат. Все остальное определяет сам модуль.
Агрегат - это декларативный фреймворк для создания голосового ассистента, определяющий лишь правила взаимодействия модулей
Чтобы создать свой модуль, необходимо понимать, какие виды событий происходят в Агрегате, и как на них нужно реагировать в коде своего модуля.
Пользователь активировал Агрегат и начинает говорить команду.
Модуль активации (например модуль активации с клавиатуры) генерирует событие 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