⚠️ Данный проект работает только с оригинальными ESP32.ESP32S2 и ESP32S3 не поддерживаются.
Цель данного подпроекта - обеспечение дешёвого решения в первую очередь для сценариев, когда нужно разместить несколько интерфейсов голосового ассистента в разных помещениях. Это достигается за счёт использования достаточно дешёвых устройств на контроллере ESP32 и переноса наиболее трудоёмких операций (распознание и синтез голоса, разбор команд и взаимодействие с другими системами для их выполнения) на один общий сервер.
В оригинальной конструкции используется модуль с микрофоном INMP441 для ввода звука и модуль с усилителем MAX98357A для вывода, однако, скорее всего, подойдут любые другие I2S микрофоны и DAC.
На следующей иллюстрации изображено соединение модулей:
Питание осуществляется через micro-USB порт на плате с контроллером.
К выходу модуля MAX98357A необходимо подключить динамик (не отмечен на схеме).
Пунктиром отмечены соединения для подключения дополнительного микрофона (на момент написания документа, поддержка в прошивке не реализована).
- доделать поддержку аналоговых микрофонов через встроенный АЦП. Это сделало бы изготовление клиентского устройства дешевле и доступнее. В текущей версии она почти работает, за исключением отсутствия возможности установить адекватную частоту дискретизации.
- распознавать триггерную фразу на клиенте
- добавить веб-интерфейс для настроек вместо настройки через
config.h
. Скорее всего, работать должно примерно так: добавляется отдельная аппаратная кнопка, если она нажата при загрузке, то устройство переходит в режим WiFi точки доступа и HTTP-сервера - добавить поддержку второго микрофона (для расширения диаграммы направленности)
- добавить автоматическую подстройку чувствительности микрофона. INMP441 передаёт 24х битные семплы, но текущая прошивка использует только 16 бит, в итоге часть потенциально полезных данных теряется. Можно получать все 24 бита и если сигнал достаточно тихий, то домножать их на некоторое значение перед тем, как взять старшие 16 бит.
- использовать сжатие при передаче аудио-данных с клиента на сервер
- добавить поддержку какого-нибудь индикатора и/или дисплея (с возможностью передавать изображения для него с сервера) на клиенте
- переписать прошивку на чём-нибудь более серьёзном, чем Arduino. Скорее всего, на Rust.
- разработать дизайн корпуса для 3d-печати