- Потрібні компоненти
- Кругова діаграма
- Створення набору даних для розпізнавання мови Arduino
- Навчання моделі
- Код Arduino для розпізнавання голосу Arduino
Технологія розпізнавання мовлення дуже корисна в автоматизації, яка не тільки дає вам вільний контроль над пристроями, але і додає безпеку системі. Окрім виготовлення приладів з голосовим управлінням, розпізнавання мови також надає значну допомогу людям, які страждають від різних інвалідностей.
У попередніх проектах ми створили перетворювач тексту в мову (TTS) на базі Arduino та підсвічування голосового управління. Зараз у цьому проекті ми будемо використовувати машинне навчання для навчання моделі розпізнавання мови за допомогою Edge Impulse Studio з трьома командами, тобто " LIGHT ON" , " LIGHT OFF" і " NOISE ". Edge Impulse - це онлайн-платформа машинного навчання, яка дозволяє розробникам створювати інтелектуальні рішення для пристроїв наступного покоління із вбудованим машинним навчанням. Раніше ми використовували студію імпульсів Edge для розрізнення звуків кашлю та шуму.
Потрібні компоненти
Апаратне забезпечення
- Arduino 33 BLE Sense
- СВІТЛОДІОДНИЙ
- Провід перемички
Програмне забезпечення
- Студія Edge Impulse
- IDE Arduino
Ми розглянули детальний підручник з Arduino 33 BLE Sense.
Кругова діаграма
Схема для цього розпізнавання голосу за допомогою Arduino наведена нижче. Фризирующая частина для Arduino 33 BLE була недоступна, тому я використовував Arduino Nano, оскільки обидва мають однакову розпиновку.
Позитивний провід світлодіода підключений до цифрового виводу 5 сенсора Arduino 33 BLE, а негативний провід - до виводу GND Arduino.
Створення набору даних для розпізнавання мови Arduino
Тут Edge Impulse Studio використовується для навчання нашої моделі розпізнавання мовлення. Навчання моделі в Edge Impulse Studio подібне до навчання моделей машинного навчання на інших платформах машинного навчання. Для навчання першим кроком моделі машинного навчання є збір набору даних, який містить зразки даних, які ми хотіли б мати можливість розпізнати.
Оскільки наша мета - керувати світлодіодом за допомогою голосової команди, нам потрібно буде зібрати зразки голосу для всіх команд і шуму, щоб він міг розрізнити голосові команди та інші шуми.
Ми створимо набір даних із трьома класами “ LED ON ”, “ LED OFF ” та “ noise ”. Щоб створити набір даних, створіть обліковий запис Edge Impulse, підтвердьте свій обліковий запис і запустіть новий проект. Ви можете завантажити зразки за допомогою мобільного телефону, плати Arduino або імпортувати набір даних у свій обліковий запис імпульсного краю. Найпростіший спосіб завантажити зразки у свій обліковий запис - за допомогою мобільного телефону. Для цього підключіть мобільний телефон до Edge Impulse.
Щоб підключити мобільний телефон, натисніть « Пристрої », а потім « Підключити новий пристрій» .
Тепер у наступному вікні натисніть «Використовувати свій мобільний телефон» , і з’явиться QR-код. Відскануйте QR-код за допомогою мобільного телефону або введіть URL-адресу, вказану в QR-коді.
Це підключить ваш телефон до студії Edge Impulse.
За допомогою телефону, підключеного до Edge Impulse Studio, тепер ви можете завантажувати свої зразки. Щоб завантажити зразки, натисніть " Збір даних" . Тепер на сторінці Збір даних введіть назву ярлика, виберіть мікрофон як датчик і введіть довжину зразка. Клацніть на « Почати вибірку» , пристрій захопить зразок 2 секунди. Запишіть у загальній складності від 10 до 12 зразків голосу в різних умовах.
Після завантаження зразків для першого класу встановіть зміну мітки та зберіть зразки для класу « вимкнене світло» та «шум» .
Ці зразки призначені для навчання модулю. На наступних етапах ми будемо збирати дані тесту. Дані тестів повинні складати щонайменше 30% навчальних даних, тому збирайте 4 зразки „шуму” та 4–5 зразків для „включення світла” та „вимкнення світла”.
Навчання моделі
Оскільки наш набір даних готовий, тепер ми можемо створити імпульс для даних. Для цього перейдіть на сторінку " Створення імпульсу ". Змініть налаштування за замовчуванням для розміру вікна 1000 мс на 1200 мс та 500 мс Вікно збільшиться до 50 мс. Це означає, що наші дані оброблятимуться за 1,2 с за раз, починаючи кожні 58 мс.
Тепер на сторінці " Створення імпульсу" натисніть " Додати блок обробки" . У наступному вікні виберіть блок Аудіо (MFCC). Після цього натисніть « Додати навчальний блок» і виберіть блок « Нейронна мережа» (Keras). Потім натисніть « Зберегти імпульс» .
На наступному кроці перейдіть на сторінку MFCC, а потім натисніть "Створити функції". Він генеруватиме блоки MFCC для всіх наших вікон аудіо.
Після цього перейдіть на сторінку « Класифікатор NN» і натисніть на три крапки у верхньому правому куті « Налаштування нейронної мережі» та виберіть « Переключитися в режим Кераса (експерт)» .
Замініть оригінал таким кодом і змініть " Мінімальний рейтинг довіри" на " 0,70" . Потім натисніть кнопку « Почати тренування» . Це почне тренувати вашу модель.
import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D from tensorflow.keras.optimsizstrastrats імпортувати 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 (розмір_басейну = 2,padding = 'same')) model.add (Flatten ()) model.add (Щільний (класи, активація = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # це контролює швидкість навчання opt = Адам (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # тренуємо модель нейронної мережі.compile (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, эпохи = 9, дані перевірки_ (X_test, Y_test), детально = 2)багатослівний = 2)багатослівний = 2)
Після навчання моделі вона покаже результативність навчання. Для мене точність становила 81,1%, а втрата - 0,45, що не є ідеальною продуктивністю, але ми можемо продовжувати з цим. Ви можете підвищити продуктивність вашої моделі, створивши величезний набір даних.
Тепер, коли наша модель розпізнавання мови готова, ми розгорнемо цю модель як бібліотеку Arduino. Перш ніж завантажувати модель як бібліотеку, ви можете перевірити ефективність, перейшовши на сторінку " Класифікація в реальному часі" . Функція класифікації в реальному часі дозволяє протестувати модель як з наявними даними тестування, що надійшли з набором даних, так і шляхом потокової передачі аудіоданих із вашого мобільного телефону.
Щоб перевірити дані за допомогою телефону, виберіть на телефоні « Перейти в режим класифікації» .
Тепер, щоб завантажити модель як Arduino Library, перейдіть на сторінку « Розгортання » та виберіть « Бібліотека Arduino» . Тепер прокрутіть униз і натисніть « Побудувати », щоб розпочати процес. Це створить бібліотеку Arduino для вашого проекту.
Тепер додайте бібліотеку в свою IDE Arduino. Для цього відкрийте IDE Arduino, а потім натисніть Ескіз> Включити бібліотеку> Додати бібліотеку ZIP
Потім завантажте приклад, перейшовши до Файл> Приклади> Назва вашого проекту - Імпульс краю> nano_ble33_sense_microphone
Код Arduino для розпізнавання голосу Arduino
Тут були внесені деякі зміни для управління світлодіодом за допомогою голосових команд.
Ми робимо деякі зміни у циклі void (), де він друкує ймовірність команд. В оригінальному коді він друкує всі наклейки та їх значення разом.
для (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, то світлодіод вимкне.
для (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {шум = результат.класифікація.значення; Serial.println ("Шум:"); Serial.println (шум); } for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Світло вимкнено:"); Serial.print (lightoff); } lighton = 1- (шум + світло); Serial.println ("Світло увімкнено:"); Serial.print (lighton); if (lighton> 0.50) {digitalWrite (led, HIGH); } if (lightoff> 0,50) {digitalWrite (led, LOW); }
Після внесення змін завантажте код у свій Arduino. Відкрийте послідовний монітор на 115200 бод.
Ось як ви можете побудувати розпізнавання мови за допомогою Arduino і давати команди для управління пристроями.
Повне робоче відео з бібліотекою та кодом наведено нижче.