- Необходими компоненти
- Електрическа схема
- Създаване на набор от данни за разпознаване на реч Arduino
- Обучение на модела
- Arduino код за разпознаване на глас Arduino
Технологията за разпознаване на реч е много полезна при автоматизацията, която не само ви дава свободен контрол върху устройствата, но и добавя сигурност към системата. Освен че създава приспособления с гласово управление, разпознаването на реч също предоставя значителна помощ на хората, страдащи от различни увреждания.
В предишни проекти изградихме преобразувател на текст в реч (TTS), базиран на Arduino, и гласово контролирани светлини. Сега в този проект ще използваме машинно обучение за обучение на модел за разпознаване на реч, използвайки Edge Impulse Studio с три команди, т.е. „ LIGHT ON“ , „ LIGHT OFF“ и „ NOISE “. Edge Impulse е онлайн платформа за машинно обучение, която позволява на разработчиците да създадат следващото поколение интелигентни решения за устройства с вградено машинно обучение. Преди използвахме Edge impulse studio, за да разграничим звуците от кашлица и шум.
Необходими компоненти
Хардуер
- Arduino 33 BLE Sense
- LED
- Джъмперни проводници
Софтуер
- Edge Impulse Studio
- IDE на Arduino
Покрихме подробен урок за Arduino 33 BLE Sense.
Електрическа схема
Електрическа схема за това гласово разпознаване с помощта на Arduino е дадена по-долу. Фризиращата част за Arduino 33 BLE не беше налична, затова използвах Arduino Nano, тъй като и двете имат едни и същи щифтове.
Положителният проводник на LED е свързан към цифров щифт 5 на Arduino 33 BLE sense, а отрицателният проводник е свързан към 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 ms на 1200ms и 500 ms Увеличаване на прозореца на 50ms. Това означава, че данните ни ще се обработват по 1,2 секунди наведнъж, започвайки на всеки 58ms.
Сега на страницата „ Създаване на импулс“ кликнете върху „ Добавяне на блок за обработка“ . В следващия прозорец изберете блок Audio (MFCC). След това кликнете върху „ Добавяне на учебен блок“ и изберете блока на Neural Network (Keras). След това кликнете върху „ Запазване на импулса“ .
В следващата стъпка отидете на страницата на MFCC и след това кликнете върху „Генериране на функции“. Той ще генерира MFCC блокове за всички наши аудио прозорци.
След това отидете на страницата „ NN Classifier“ и кликнете върху трите точки в горния десен ъгъл на „ Настройки на невронната мрежа“ и изберете „ Превключване към режим Keras (експертен)“ .
Заменете оригинала със следния код и променете „ Минимален рейтинг на доверие“ на „ 0,70“ . След това кликнете върху бутона „ Стартиране на обучението“ . Ще започне да тренира вашия модел.
импортиране на tensorflow като tf от tensorflow.keras.models импортиране на Sequential от tensorflow.keras.layers импортиране на Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D от tensorflow.keras.optimizor импортиране на 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 (Dense (класове, активация = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # това контролира опцията за скорост на обучение = Адам (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # тренирайте модела на невронната мрежа.compile (загуба = 'categorical_crossentropy', оптимизатор = 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 Library“ . Сега превъртете надолу и кликнете върху „ Изграждане “, за да започнете процеса. Това ще изгради библиотека на Arduino за вашия проект.
Сега добавете библиотеката във вашата Arduino IDE. За това отворете IDE на Arduino и след това кликнете върху Скица> Включване на библиотека> Добавяне на библиотека ZIP
След това заредите пример, като отидете на Файл> Примери> Името на вашия проект - Edge Impulse> 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 (шум); } за (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 и да давате команди за управление на устройствата.
Пълно работещо видео с библиотека и код е дадено по-долу.