- Componente necesare
- Diagrama circuitului
- Crearea setului de date pentru recunoașterea vorbirii Arduino
- Instruirea modelului
- Cod Arduino pentru recunoaștere vocală Arduino
Tehnologia de recunoaștere a vorbirii este foarte utilă în automatizare, care nu numai că vă oferă controlul mâinilor libere asupra dispozitivelor, ci oferă și securitate sistemului. În afară de realizarea gadgeturilor controlate prin voce, recunoașterea vorbirii oferă și un ajutor semnificativ persoanelor care suferă de diferite dizabilități.
În proiectele anterioare am construit convertorul Text to Speech (TTS) bazat pe Arduino și lumini controlate prin voce. Acum, în acest proiect, vom folosi învățarea automată pentru a instrui un model de recunoaștere a vorbirii folosind Edge Impulse Studio cu trei comenzi, adică „ LIGHT ON” , „ LIGHT OFF” și „ NOISE ”. Edge Impulse este o platformă online de învățare automată care permite dezvoltatorilor să creeze următoarea generație de soluții inteligente de dispozitive cu Machine Learning încorporat. Am folosit anterior studio de impulsuri Edge pentru a diferenția sunetele de tuse și zgomot.
Componente necesare
Hardware
- Arduino 33 BLE Sense
- LED
- Sârme jumper
Software
- Edge Impulse Studio
- IDE Arduino
Am acoperit un tutorial detaliat despre Arduino 33 BLE Sense.
Diagrama circuitului
Diagrama circuitului pentru această recunoaștere vocală folosind Arduino este prezentată mai jos. Partea Fritzing pentru Arduino 33 BLE nu era disponibilă, așa că am folosit Arduino Nano deoarece ambele au același pinout.
Conductorul pozitiv al LED-ului este conectat la pinul digital 5 al Arduino 33 BLE sense, iar cablul negativ este conectat la pinul GND al Arduino.
Crearea setului de date pentru recunoașterea vorbirii Arduino
Aici Edge Impulse Studio este folosit pentru a instrui modelul nostru de recunoaștere a vorbirii. Instruirea unui model pe Edge Impulse Studio este similară cu instruirea modelelor de învățare automată pe alte cadre de învățare automată. Pentru instruire, primul pas al unui model de învățare automată este de a colecta un set de date care conține eșantioane de date pe care am dori să le putem recunoaște.
Deoarece scopul nostru este de a controla un LED cu comanda noastră vocală, va trebui să colectăm mostre vocale pentru toate comenzile și zgomotul, astfel încât să poată distinge între comenzile vocale și alte zgomote.
Vom crea un set de date cu trei clase „ LED ON ”, „ LED OFF ” și „ noise ”. Pentru a crea un set de date, creați un cont Edge Impulse, verificați-vă contul și apoi începeți un nou proiect. Puteți încărca eșantioanele folosind telefonul mobil, placa Arduino sau puteți importa un set de date în contul dvs. de impuls de margine. Cel mai simplu mod de a încărca probele în contul dvs. este prin utilizarea telefonului mobil. Pentru aceasta conectați telefonul mobil la Edge Impulse.
Pentru a conecta telefonul mobil, faceți clic pe „ Dispozitive ”, apoi faceți clic pe „ Conectați un dispozitiv nou” .
Acum, în fereastra următoare, faceți clic pe „Utilizați telefonul mobil” și va apărea un cod QR. Scanați codul QR cu telefonul mobil sau introduceți adresa URL dată pe codul QR.
Acest lucru vă va conecta telefonul la studioul Edge Impulse.
Cu telefonul conectat la Edge Impulse Studio, puteți încărca acum mostrele. Pentru a încărca mostrele, faceți clic pe „ Achiziție date” . Acum, pe pagina de achiziție de date, introduceți numele etichetei, selectați microfonul ca senzor și introduceți lungimea eșantionului. Faceți clic pe „ Începeți eșantionarea” , dispozitivul dvs. va captura un eșantion de 2 secunde. Înregistrați în total 10 - 12 eșantioane de voce în condiții diferite.
După încărcarea probelor pentru prima clasă, setați acum schimbarea etichetei și colectați probele pentru clasa „ lumină oprită” și „zgomot” .
Aceste mostre sunt destinate instruirii modulului, în următorii pași, vom colecta datele de testare. Datele de testare trebuie să fie cel puțin 30% din datele de antrenament, deci colectați cele 4 eșantioane de „zgomot” și 4 până la 5 eșantioane pentru „lumină aprinsă” și „lumină oprită”.
Instruirea modelului
Deoarece setul nostru de date este gata, acum putem crea un impuls pentru date. Pentru aceasta, accesați pagina „ Creați impuls ”. Schimbați setările implicite ale unei dimensiuni a ferestrei de 1000 ms la 1200ms și la creșterea ferestrei de 500 ms la 50ms. Aceasta înseamnă că datele noastre vor fi procesate 1,2 s la un moment dat, începând cu fiecare 58 ms.
Acum, pe pagina „ Creați impuls” , faceți clic pe „ Adăugați un bloc de procesare” . În fereastra următoare selectați blocul Audio (MFCC). După aceea, faceți clic pe „ Adăugați un bloc de învățare” și selectați blocul Neural Network (Keras). Apoi faceți clic pe „ Salvați impulsul” .
În pasul următor, accesați pagina MFCC și apoi faceți clic pe „Generați caracteristici”. Acesta va genera blocuri MFCC pentru toate ferestrele noastre audio.
După aceea, accesați pagina „ Clasificator NN” și faceți clic pe cele trei puncte din colțul din dreapta sus al „ Setărilor rețelei neuronale” și selectați „ Comutare la modul Keras (expert)” .
Înlocuiți originalul cu următorul cod și schimbați „ Evaluarea minimă de încredere” la „ 0,70” . Apoi faceți clic pe butonul „ Începeți antrenamentul” . Va începe să vă pregătiți modelul.
import tensorflow ca tf din tensorflow.keras.models import Secvențial din tensorflow.keras.layers import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D din tensorflow.keras.optimizers import Adam din tensorflow.keras.constraints import MaxNorm # model architecture 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, activation = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # aceasta controlează rata de învățare opt = Adam (lr = 0,005; beta_1 = 0,9; beta_2 = 0,999) = 9, validare_date = (X_test, Y_test), detaliat = 2)detaliat = 2)detaliat = 2)
După antrenarea modelului, va arăta performanța antrenamentului. Pentru mine, precizia a fost de 81,1%, iar pierderile de 0,45, ceea ce nu este o performanță ideală, dar putem continua. Puteți crește performanța modelului dvs. prin crearea unui set de date vast.
Acum, deoarece modelul nostru de recunoaștere a vorbirii este gata, vom implementa acest model ca bibliotecă Arduino. Înainte de a descărca modelul ca bibliotecă, puteți testa performanța accesând pagina „ Clasificare live” . Funcția de clasificare Live vă permite să testați modelul atât cu datele de testare existente furnizate împreună cu setul de date, fie prin streaming de date audio de pe telefonul dvs. mobil.
Pentru a testa datele cu telefonul, alegeți „ Comutați la modul de clasificare” de pe telefon.
Acum, pentru a descărca modelul ca bibliotecă Arduino, accesați pagina „ Deployment ” și selectați „ Arduino Library” . Acum derulați în jos și faceți clic pe „ Construiți ” pentru a începe procesul. Aceasta va crea o bibliotecă Arduino pentru proiectul dvs.
Acum adăugați biblioteca în IDE-ul dvs. Arduino. Pentru aceasta deschideți IDE-ul Arduino și apoi faceți clic pe Sketch> Include Library> Add.ZIP library
Apoi, încărcați un exemplu accesând Fișier> Exemple> Numele proiectului dvs. - Edge Impulse> nano_ble33_sense_microphone
Cod Arduino pentru recunoaștere vocală Arduino
Aici s-au făcut câteva modificări pentru a controla LED-ul cu comenzile vocale.
Aducem unele modificări în bucla void () în care tipărește probabilitatea comenzilor. În codul original, imprimă toate etichetele și valorile lor împreună.
for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Pentru a controla LED-ul trebuie să salvăm toate probabilitățile comenzii în trei variabile diferite, astfel încât să le putem pune instrucțiuni condiționate. Deci, conform noului cod, dacă probabilitatea comenzii „ lumină aprinsă” este mai mare de 0,50, atunci se va aprinde LED-ul și dacă probabilitatea comenzii „ lumină oprită” este mai mare de 0,50 decât va stinge LED-ul.
for (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {noise = result.classification.value; Serial.println ("Zgomot:"); Serial.println (zgomot); } pentru (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Lumina oprită"); Serial.print (lightoff); } lighton = 1- (noise + lightoff); Serial.println ("Lumina aprinsă:"); Serial.print (lighton); if (lighton> 0,50) {digitalWrite (led, HIGH); } if (lightoff> 0,50) {digitalWrite (led, LOW); }
După efectuarea modificărilor, încărcați codul în Arduino. Deschideți monitorul serial la 115200 baud.
Acesta este modul în care puteți construi recunoașterea vorbirii folosind Arduino și puteți da comenzi pentru a utiliza dispozitivele.
Un videoclip complet de lucru cu o bibliotecă și un cod este prezentat mai jos.