Распознавание голоса с помощью ESP32

ESP32 довольно мощный микроконтроллер. Его возможностей хватает на то, чтобы не только выполнять задачи "умного дома" и IoT или проигрывать музыкальный клип, но и выполнять распознавание речи и подключаться к голосовым помощникам, таким как Google Assistant и Alexa, а также создавать голосовые интерфейсы с помощью Google DialogFlow
2599
В избранное

Работа с аудио в ESP32

Для начала настроим окружение для работы с аудиоприложениями ESP32 от Espressif. Посмотрим на простом примере, как использовать ESP-ADF (Espressif Audio Development Framework).

Чтобы упростить начало работы с ESP-ADF, Espressif разработал несколько отладочных плат, предназначенные для работы с аудио.

ESP32-LyraT ESP32-LyraTD-MSC ESP32-LyraT-Min

ESP32-LyraT

ESP32-LyraTD-MSC

ESP32-LyraT-Mini


Кроме того, можно использовать и другие платы с ESP32 с поддерживаемым аудиокодеком или чипом DSP  (в крайнем случае вы можете разработать драйвер для поддержки связи с нужным вам чипом).

Что такое ESP-ADF

ESP-ADF доступен в виде набора компонентов для расширения функциональности, уже предоставленной ESP-IDF (Espressif IoT Development Framework).

Чтобы использовать ESP-ADF, сначала необходимо настроить ESP-IDF, как это описано далее.

Примечание

ESP-ADF работает со стабильной версией ESP-IDF. Если вы уже установили другую версию, перейдите на стабильную версию, иначе вы не сможете скомпилировать приложения ESP-ADF.

Настройка ESP-IDF

Настройте свой компьютер в соответствии с документацией ESP32. Скомпилировать и загрузить код в ESP32 можно из командной строки с помощью make или с помощью Eclipse IDE.

Примечание

Предполагается, что для установки набора инструментов, ESP-IDF, ESP-ADF и примеров приложений используется каталог  ~/esp. При использовании другого каталога нужно настроить соответствующие команды.

После того, как вы выполните настройку ESP-IDF и перейдете к ESP-ADF, вы заметите, что установка ESP-ADF выполняется аналогичным образом. Это должно облегчить запуск и работу с компонентами ESP-ADF.

Если вы только начинаете изучать ESP32 и ESP-IDF, то рекомендуем сначала проверить правильность установки на примерах hello_world и blink. Если вы смогли собрать, загрузить и запустить эти два примера, вы готовы перейти к следующему разделу.

Загрузка ESP-ADF

Теперь, когда ESP-IDF готова для компиляции, сборки и загрузки приложения для ESP32, вы можете перейти к установке специфичных для аудио API и библиотек. Они представлены в репозитории ESP-ADF. Чтобы получить их, откройте терминал, перейдите в каталог для установки ESP-ADF и клонируйте репо, используя команду:git clone

cd ~/esp
git clone --recursive https://github.com/espressif/esp-adf.git

ESP-ADF будет загружен в ~/esp/esp-adf

Настройка пути к ESP-ADF

Toolchain получает доступ к ESP-ADF, используя переменную окружения ADF_PATH. Эту переменную нужно установить, иначе проекты не будут собраны. Процесс настройки аналогичен настройке IDF_PATH переменной, см. инструкции в документации ESP-IDF в разделе «Добавление IDF_PATH в профиль пользователя».

Создание проекта

Теперь все готово, чтобы собрать первое аудио приложение для ESP32. Сам процесс сборки подробно описан в документации ESP-IDF. Сейчас повторим основные шаги.

Примечание

ESP-ADF основан на конкретной версии ESP-IDF. Эта версия была клонирована вместе с ESP-ADF, как подкаталог или, точнее, как подмодуль. Просто следуйте этой инструкции, и сценарий сборки автоматически получит ESP-IDF из подмодуля esp-idf@ca3faa61.

Чтобы продемонстрировать, как создать приложение, воспользуемся проектом get-start/play_mp3 из каталога examples в ADF.

Скопируйте папку get-start/play_mp3 в ~/esp каталог:

cd ~/esp
cp -r $ADF_PATH/examples/get-started/play_mp3

Аналогично вы можете использовать и другие проекты из каталога примеров в репозитории ESP-ADF.

Подключение и настройка

Подключите отладочную плату ESP32 к ПК, проверьте, с каким последовательным портом соединилась плата.

В терминале перейдите в каталог приложения play_mp3 и настройте его menuconfig, выбрав последовательный порт, скорость загрузки и версию аудиоплаты:

cd ~/esp/play_mp3
make menuconfig

Сохраните конфигурацию.

Сборка, прошивка и тестирование

Теперь вы можете собрать, загрузить и проверить приложение. Выполните:

make flash monitor -j5

Команда соберет и загрузит прошивку в ESP32 и запустит монитор.

Прошивка

Для загрузки прошивка платы должна быть переведена в режим загрузки. Для этого нажмите и удерживайте кнопку Boot, кратковременно нажмите кнопку Reset и отпустите кнопку Boot. Вы можете переключиться в режим загрузки в любое время во время сборки приложения, но не позднее, чем отобразится сообщение «Connecting»:

...
&nbsp
esptool.py v2.1
Connecting........_____....;

После завершения сборки и загрузки вы должны увидеть следующее сообщение:

...
 
Leaving...
Hard resetting...
MONITOR
--- idf_monitor on /dev/ttyUSB0 115200 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---

Терминал

Теперь нажмите кнопку Reset, чтобы запустить приложение. После нескольких строк лога запуска должны отображаться сообщения, специфичные для приложения play_mp3:

...
 
I (303) PLAY_MP3_FLASH: [ 1 ] Start audio codec chip
I (323) PLAY_MP3_FLASH: [ 2 ] Create audio pipeline, add all elements to pipeline, and subscribe pipeline event
I (323) PLAY_MP3_FLASH: [2.1] Create mp3 decoder to decode mp3 file and set custom read callback
I (333) PLAY_MP3_FLASH: [2.2] Create i2s stream to write data to codec chip
I (343) PLAY_MP3_FLASH: [2.3] Register all elements to audio pipeline
I (353) PLAY_MP3_FLASH: [2.4] Link it together [mp3_music_read_cb]-->mp3_decoder-->i2s_stream-->[codec_chip]
I (363) PLAY_MP3_FLASH: [ 3 ] Setup event listener
I (363) PLAY_MP3_FLASH: [3.1] Listening event from all elements of pipeline
I (373) PLAY_MP3_FLASH: [ 4 ] Start audio_pipeline
W (373) AUDIO_ELEMENT: [mp3] RESUME:Element has not running,state:3,task_run:1
W (393) AUDIO_ELEMENT: [i2s] RESUME:Element has not running,state:3,task_run:1
I (403) PLAY_MP3_FLASH: [ * ] Receive music info from mp3 decoder, sample_rates=44100, bits=16, ch=2
W (433) AUDIO_ELEMENT: [i2s] RESUME:Element has not running,state:3,task_run:1
I (7183) PLAY_MP3_FLASH: [ 5 ] Stop audio_pipeline
W (7183) AUDIO_PIPELINE: There are no listener registered

Если все прошло правильно, кроме приведенных выше логов вы должны услышать звук, воспроизводимый в течение примерно 7 секунд через динамики или наушники, подключенные к плате.

Теперь вы можете попробовать другие примеры или перейти к разработке собственных приложений. Обратите внимание, как задается путь к  ESP-ADF. Откройте файл get-start/play_mp3/Makefile, вы должны увидеть следующие строки:

PROJECT_NAME := play_mp3
include $(ADF_PATH)/project.mk

Во второй строке указывается путь toolchain для ESP-ADF. Аналогичные строки должны быть в Makefile в ваших приложениях, разработанных с ESP-ADF.

Как работает приложение

Все аудиоприложения используют API ESP-ADF, которое позволяет, выбирая такие элементы, как кодеки (декодеры и кодеры), функции потоков или обработки звука, объединять их в конвейер.

Элементы инфраструктуры работы с  аудио

Рис. 4. Элементы инфраструктуры работы с  аудио

 На диаграмме ниже представлена организация двух элементов, MP3-декодера и I2S-потока в Audio Pipeline, который использовался в приведенном выше примере get-start/play_mp3.

Пример организации элементов в аудио конвейере

Рис. 5. Пример организации элементов в аудио конвейере

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

Обновление ESP-ADF

Если вам потребуется обновить ESP-ADF, самый простой способ сделать это - удалить существующую папку esp-adf и снова ее клонировать, как это было описано ранее.

Распознавание речи

В состав ESP-ADF включен интерфейс распознавания речи для распознавания голосовых команд пробуждения. К сожалению, большинство из реализованных в настоящее время команд пробуждения написаны на китайском языке, и есть только одна команда «Hi, Lexin» на английском языке.

API так же включает механизм автоматического обнаружения речи (обнаружение голосовой активности (VAD)) и механизм записи речи.

API распознавания речи предназначен для легкой интеграции с Audio Framework для извлечения аудиопотока с микрофона, подключенного к аудиочипу.

Для распознавания речи используются три модуля:

  • Модель обнаружения слов пробуждения WakeNet
  • Модель распознавания речевых команд MultiNet
  • Модуль акустических алгоритмов: AEC (акустическое подавление эха), VAD (обнаружение голосовой активности), AGC (автоматическое управление усилением), NS (подавление шума)

Все модули предоставлены в виде компонентов, поэтому они могут быть интегрированы в проекты с минимальными усилиями.

Обнаружение голосовой активности

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

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

Реализация API обнаружения голосовой активности продемонстрирована в примере speech recognition/vad.

Обнаружение слов пробуждения

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

Кроме набора слов на китайском, вы можете использовать бесплатно подготовленную фразу «Hi, Lexin». В коммерческих проектах можно заказать разработку модели слова пробуждения инженерам Espressif.

Интерфейс распознавания речи

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

Образец конвейера распознавания речи

Рис. 6. Образец конвейера распознавания речи

Конфигурирование и использование отдельных элементов показано в нескольких примерах, приложенных к ESP-ADF. Сложность может представлять использование фильтра и потока RAW. Фильтр используется для настройки частоты дискретизации потока I2S в соответствии с частотой дискретизации модели распознавания речи. Поток RAW - это способ подачи данных аудиовхода в модель.

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

#include "esp_wn_iface.h"
#include "esp_wn_models.h"
#include "rec_eng_helper.h"
 
esp_wn_iface_t *wakenet;
model_coeff_getter_t *model_coeff_getter;
model_iface_data_t *model_data;
 
// Initialize wakeNet model data
get_wakenet_iface(&wakenet);
get_wakenet_coeff(&model_coeff_getter);
model_data = wakenet->create(model_coeff_getter, DET_MODE_90);
 
// Set parameters of buffer
int audio_chunksize = wakenet->get_samp_chunksize(model_data);
int frequency = wakenet->get_samp_rate(model_data);
int16_t *buffer = malloc(audio_chunksize * sizeof(int16_t));
 
// Get voice data feed to buffer
...
 
// Detect
int r = wakenet->detect(model_data, buffer);
if (r > 0) {
    printf("Detection triggered output %d.\n",  r);
}
 
// Destroy model
wakenet->destroy(model_data)

Использование API распознавания речи демонстрируется в примере speech_recognition/asr и в репозитории распознавания речи Espressif.

Распознавание речевых команд

Модель распознавания речевых команд Espressif MultiNet специально разработана для предоставления возможности распознавания речевых команд в автономном режиме. С помощью этой модели вы можете легко добавлять свои собственные речевые команды, что устраняет необходимость повторного обучения модели.

В настоящее время MultiNet поддерживает до 100 команд на китайском и английском языке.

MultiNet

MultiNet - это облегченная модель, специально разработанная на основе CRNN и CTC для реализации многокомпонентного распознавания с ESP32. Теперь она поддерживает до 100 речевых команд, включая настраиваемые команды.

MultiNet использует MFCC функции (Мел частотные кепстральные коэффициенты) аудиоклипа в качестве входных данных и фонемы (на китайском или английском) в качестве выходных данных. Сравнивая выходные фонемы, определяется соответствующая китайская или английская команда.

Процесс распознавания команд

Алгоритм процесса распознавания команд следующий:

  1. Добавьте настраиваемые команды в очередь речевых команд
  2. Подготовьте аудиоклип 30 мс (16 кГц, 16 бит, моно)
  3. Введите этот звук в модель MFCC и получите его MFCC функции
  4. Введите полученные MFCC функции в MultiNet и получите выходную фонему 
  5. Введите полученную фонему в модель Language и получите выходные данные
  6. Сравните выходные данные с существующими речевыми командами одну за другой и выведите идентификатор соответствующей команды (если есть).

Поток, обрабатывающий голосовые команды, выглядит следующим образом (рис. 7):

 Поток, обрабатывающий голосовые команды
Рис. 7. Поток, обрабатывающий голосовые команды

Пользовательские команды

Пользователи могут задавать свои собственные речевые команды с помощью make menuconfig. Вызовите menuconfig->Component config > ESP Speech Recognition->Add speech commands, в sdk уже есть 20 китайских команд и 7 английских команд. Вот перечень команд на английском языке:

Идентификатор команды

команда

Идентификатор команды

Команда

0

turn on the light

включи свет

4

red mode

красный режим

1

turn off the light

выключить свет

5

blue mode

синий режим

2

lighting mode

режим освещения

6

yellow mode

желтый режим

3

reading mode

режим чтения

   

MultiNet поддерживает и пользовательские команды. Вы можете добавить свои собственные команды в MultiNet. Обратите внимание, что вновь добавленная команда должна получить свой идентификатор команды, прежде чем она будет распознана MultiNet.

Добавление речевой команды

Модель MultiNet предопределяет некоторые речевые команды. Пользователи также могут определять свои собственные речевые команды и количество идентификаторов речевых команд с помощью  menuconfig -> Component config -> ESP Speech Recognition -> Add speech commands и The number of speech commands.

Распознавание английской речи

Речевые команды должны быть подготовлены в виде набора фонетических символов с пробелами между ними. Для генерации фонетических символов, соответствующих командным словам, можно использовать скрипт general_label_EN/general_label_en.py в каталоге tools корневого каталога skainet. Подробная информация о подготовке команд приведена в способ генерации фонетических символов.

Примечание:

  • Один идентификатор речевых команд может соответствовать нескольким фразам
  • Поддерживается до 100 идентификаторов речевых команд или фраз речевых команд, включая настраиваемые команды
  • Соответствующие несколько фраз для одного идентификатора команды должны быть разделены символом ','

Поддержка Dialogflow в ESP32

ESP32 поддерживает функционал клиента голосового помощника Alexa и Google, а недавно в него была добавлена поддержка Dialogflow, голосового интерфейса от Google. Это позволяет разработчикам включать в свои устройства пользовательский голосовой интерфейс на естественном языке.

Отличия Dialogflow от голосовых помощников следующие:

  • Снижение сложности реализации,
  • Наличие бесплатных тарифов (лимит 1000 запросов в день),
  • Возможность задания пользовательских слов пробуждения, вместо использования « Ok, Google» или «Alexa»
  • Никаких проблем с сертификацией, так как вы не интегрируетесь с Alexa или Google Assistant; вы строите свой собственный интерфейс

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

Dialogflow является частью Voice Assistant SDK, пример использования доступен на github: https://github.com/espressif/esp-va-sdk/tree/master/examples/google_dialogflow. Начало работы с Dialogflow описано на следующей странице: https://github.com/espressif/esp-va-sdk/blob/master/examples/google_dialogflow/README-Dialogflow.md

Базовый набор технологий, используемых в реализации Dialogflow для VA SDK, включает в себя:

  • gRPC
  • Google Protobufs
  • HTTP 2.0

Текущая реализация Dialogflow SDK пока не включает в себя поддержку создания пользовательских слов пробуждения, и для инициализации разговора нужно нажать кнопку на плате.

Полезные ссылки

Производитель: Espressif Systems (shanghai) Pte. Ltd.
Наименование
Производитель
Описание Корпус/
Изображение
Цена, руб. Наличие
ESP32-LyraT
ESP32-LyraT
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796570 ИНФО RND
Доступно: 24 шт. 2000,00
Смарт аудио платформа ESP32-LyraT. Плата представляет собой практически готовое решение для производительных и беспроводных аудио устройств.
ESP32-LyraT 2000,00 от 4 шт. 1820,00 от 6 шт. 1750,00 от 10 шт. 1670,00 от 26 шт. 1590,00
24 шт.
(на складе)
ESP32-LyraTD-MSC
ESP32-LyraTD-MSC
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796571 ИНФО
Доступно: 3 шт. от 1 шт. от 9182,44
Выбрать
условия
поставки
Смарт аудиоплатформа ESP32-LyraTD-MSC.
ESP32-LyraTD-MSC от 1 шт. от 9182,44
3 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-LyraTD-DSPG
ESP32-LyraTD-DSPG
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 3421951 ИНФО
Доступно: 52 шт. от 1 шт. от 8688,50
Выбрать
условия
поставки
Отладочная плата Espressif  ESP32-LyraTD-DSPG.
ESP32-LyraTD-DSPG от 1 шт. от 8688,50
52 шт.
(под заказ)
Выбрать
условия
поставки

Сравнение позиций

  • ()