- Необходимые компоненты
- Принципиальная электрическая схема
- Создание набора данных для распознавания речи Arduino
- Обучение модели
- Код Arduino для распознавания голоса Arduino
Технология распознавания речи очень полезна в автоматизации, которая не только дает вам возможность управлять устройствами без помощи рук, но и повышает безопасность системы. Помимо создания гаджетов с голосовым управлением, распознавание речи также оказывает значительную помощь людям, страдающим различными нарушениями.
В предыдущих проектах мы создали преобразователь текста в речь (TTS) на базе Arduino и подсветку с голосовым управлением. Теперь в этом проекте мы собираемся использовать машинное обучение для обучения модели распознавания речи с помощью Edge Impulse Studio с тремя командами: « LIGHT ON» , « LIGHT OFF» и « NOISE ». Edge Impulse - это онлайн-платформа машинного обучения, которая позволяет разработчикам создавать интеллектуальные устройства нового поколения со встроенным машинным обучением. Ранее мы использовали Edge impulse studio, чтобы различать звуки кашля и шума.
Необходимые компоненты
Оборудование
- Arduino 33 BLE Sense
- СВЕТОДИОД
- Перемычки
Программного обеспечения
- Edge Impulse Studio
- IDE Arduino
Мы рассмотрели подробное руководство по Arduino 33 BLE Sense.
Принципиальная электрическая схема
Принципиальная схема этого распознавания голоса с использованием Arduino приведена ниже. Деталь Fritzing для Arduino 33 BLE не была доступна, поэтому я использовал Arduino Nano, так как обе имеют одинаковую распиновку.
Положительный вывод светодиода подключается к цифровому выводу 5 датчика BLE Arduino 33, а отрицательный вывод подключается к выводу GND на Arduino.
Создание набора данных для распознавания речи Arduino
Здесь Edge Impulse Studio используется для обучения нашей модели распознавания речи. Обучение модели в Edge Impulse Studio аналогично обучению моделей машинного обучения в других средах машинного обучения. Для обучения первый шаг модели машинного обучения - собрать набор данных, содержащий образцы данных, которые мы хотели бы распознать.
Поскольку наша цель - управлять светодиодом с помощью нашей голосовой команды, нам нужно будет собрать образцы голоса для всех команд и шума, чтобы он мог различать голосовые команды и другие шумы.
Мы создадим набор данных с тремя классами « LED ON », « LED OFF » и « noise ». Чтобы создать набор данных, создайте учетную запись Edge Impulse, подтвердите свою учетную запись и затем начните новый проект. Вы можете загрузить образцы с помощью своего мобильного телефона, платы Arduino или импортировать набор данных в свою учетную запись Edge Impulse. Самый простой способ загрузить образцы в свою учетную запись - использовать мобильный телефон. Для этого подключите мобильный телефон к Edge Impulse.
Чтобы подключить мобильный телефон, нажмите « Устройства », а затем нажмите « Подключить новое устройство» .
Теперь в следующем окне нажмите «Использовать свой мобильный телефон» , и появится QR-код. Отсканируйте QR-код своим мобильным телефоном или введите URL-адрес, указанный в QR-коде.
Это подключит ваш телефон к Edge Impulse studio.
Теперь, когда ваш телефон подключен к Edge Impulse Studio, вы можете загружать свои сэмплы. Чтобы загрузить образцы, нажмите « Сбор данных» . Теперь на странице сбора данных введите имя метки, выберите микрофон в качестве датчика и введите длину выборки. Нажмите « Начать выборку» , ваше устройство захватит 2-секундную выборку. Запишите в общей сложности от 10 до 12 голосовых образцов в различных условиях.
После загрузки образцов для первого класса установите изменение метки и соберите образцы для классов « свет выключен» и «шум» .
Эти образцы предназначены для обучения модуля, на следующих шагах мы соберем тестовые данные. Тестовые данные должны составлять не менее 30% данных обучения, поэтому соберите 4 выборки «шум» и от 4 до 5 выборок для «свет включен» и «свет выключен».
Обучение модели
Поскольку наш набор данных готов, теперь мы можем создать импульс для данных. Для этого перейдите на страницу « Создать импульс ». Измените настройки по умолчанию для размера окна 1000 мс на 1200 мс и увеличения окна 500 мс до 50 мс. Это означает, что наши данные будут обрабатываться 1,2 с за раз, начиная каждые 58 мс.
Теперь на странице « Создать импульс» нажмите « Добавить блок обработки» . В следующем окне выберите блок Audio (MFCC). После этого нажмите « Добавить обучающий блок» и выберите блок нейронной сети (Keras). Затем нажмите « Сохранить импульс» .
На следующем этапе перейдите на страницу MFCC и нажмите «Создать компоненты». Он будет генерировать блоки MFCC для всех наших окон аудио.
После этого перейдите на страницу « Классификатор NN», нажмите на три точки в правом верхнем углу « Настройки нейронной сети» и выберите « Перейти в режим Keras (эксперт)» .
Замените оригинал на следующий код и измените « Минимальный рейтинг достоверности» на « 0,70» . Затем нажмите кнопку « Начать обучение» . Начнется обучение вашей модели.
импортировать тензорный поток как tf из tensorflow.keras.models импортировать последовательность из tensorflow.keras.layers импортировать Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D из tensorflow.keras.optimizers импортировать Adamras.constraflow. import MaxNorm # архитектура модели model = Sequential () model.add (InputLayer (input_shape = (X_train.shape,), name = 'x_input')) model.add (Reshape ((int (X_train.shape / 13), 13, 1), input_shape = (X_train.shape,))) model.add (Conv2D (10, kernel_size = 5, Activation = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2, padding = 'same')) model.add (Conv2D (5, kernel_size = 5, Activation = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (classes, activate = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # это контролирует скорость обучения opt = Adam (lr = 0.005, beta_1 = 0.9, beta_2 = 0.999) # обучить нейронную сеть model.compile (loss ='ategorical_crossentropy ', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epochs = 9, validation_data = (X_test, Y_test), verbose = 2)подробный = 2)подробный = 2)
После обучения модель покажет результаты обучения. Для меня точность составила 81,1%, а потери составили 0,45, что не является идеальной производительностью, но мы можем продолжить работу. Вы можете повысить производительность своей модели, создав обширный набор данных.
Теперь, когда наша модель распознавания речи готова, мы развернем эту модель как библиотеку Arduino. Перед загрузкой модели в виде библиотеки вы можете протестировать производительность, перейдя на страницу « Живая классификация» . Функция классификации в реальном времени позволяет тестировать модель как с существующими данными тестирования, которые поставляются с набором данных, так и путем потоковой передачи аудиоданных с вашего мобильного телефона.
Чтобы проверить данные с помощью телефона, выберите на нем « Перейти в режим классификации» .
Теперь, чтобы загрузить модель как библиотеку Arduino, перейдите на страницу « Развертывание » и выберите « Библиотека Arduino» . Теперь прокрутите вниз и нажмите « Построить », чтобы начать процесс. Это создаст библиотеку Arduino для вашего проекта.
Теперь добавьте библиотеку в вашу Arduino IDE. Для этого откройте IDE Arduino и нажмите Sketch> Include Library> Add.ZIP library.
Затем загрузите пример, перейдя в Файл> Примеры> Имя вашего проекта - Edge Impulse> nano_ble33_sense_microphone.
Код Arduino для распознавания голоса Arduino
Здесь внесены некоторые изменения в управление светодиодом с помощью голосовых команд.
Мы вносим некоторые изменения в цикл void (), который выводит вероятность выполнения команд. В исходном коде все метки и их значения печатаются вместе.
for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Чтобы управлять светодиодом, мы должны сохранить все вероятности команд в трех разных переменных, чтобы мы могли использовать для них условные операторы. Таким образом, согласно новому коду, если вероятность команды « включить свет» больше 0,50, тогда он включит светодиод, а если вероятность команды « выключить свет» будет больше 0,50, он выключит светодиод.
for (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {noise = result.classification.value; Serial.println ("Шум:"); Serial.println (шум); } для (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Свет выключен:"); Serial.print (без подсветки); } lighton = 1- (шум + выключение света); Serial.println ("Свет включен:"); Serial.print (светлый); если (световой индикатор> 0,50) {digitalWrite (светодиод, ВЫСОКИЙ); } если (выключено> 0,50) {digitalWrite (светодиод, НИЗКИЙ); }
После внесения изменений загрузите код в свой Arduino. Откройте последовательный монитор на скорости 115200 бод.
Вот как вы можете построить распознавание речи с помощью Arduino и дать команды для управления устройствами.
Полное рабочее видео с библиотекой и кодом приведено ниже.