- Components necessaris
- Esquema de connexions
- Creació del conjunt de dades per al reconeixement de veu Arduino
- Formació del model
- Codi Arduino per al reconeixement de veu Arduino
La tecnologia de reconeixement de veu és molt útil en l'automatització, que no només us proporciona un control de mans lliures sobre els dispositius, sinó que també aporta seguretat al sistema. A més de fabricar aparells controlats per veu, el reconeixement de veu també proporciona una ajuda important a les persones que pateixen diverses discapacitats.
En projectes anteriors vam crear convertidor de text a veu (TTS) basat en Arduino i llums controlades per veu. Ara, en aquest projecte, utilitzarem l’aprenentatge automàtic per formar un model de reconeixement de veu mitjançant Edge Impulse Studio amb tres ordres, és a dir, “ LIGHT ON” , “ LIGHT OFF” i “ NOISE ”. Edge Impulse és una plataforma d'aprenentatge automàtic en línia que permet als desenvolupadors crear la propera generació de solucions de dispositius intel·ligents amb Machine Learning incrustat. Anteriorment, hem utilitzat Edge impulsse studio per diferenciar els sons de la tos i el soroll.
Components necessaris
Maquinari
- Arduino 33 BLE Sense
- LED
- Jumper Wires
Programari
- Edge Impulse Studio
- IDE Arduino
Hem tractat un tutorial detallat sobre Arduino 33 BLE Sense.
Esquema de connexions
A continuació es mostra el diagrama de circuits d’aquest reconeixement de veu mitjançant Arduino. La peça Fritzing per a Arduino 33 BLE no estava disponible, de manera que vaig fer servir Arduino Nano, ja que tots dos tenen el mateix pinout.

El cable positiu del LED està connectat al pin digital 5 d'Arduino 33 BLE sense i el cable negatiu està connectat al pin GND d'Arduino.

Creació del conjunt de dades per al reconeixement de veu Arduino
Aquí Edge Impulse Studio s’utilitza per formar el nostre model de reconeixement de veu. La formació d’un model a Edge Impulse Studio és similar a la formació de models d’aprenentatge automàtic en altres marcs d’aprenentatge automàtic. Per a la formació, el primer pas d’un model d’aprenentatge automàtic és recopilar un conjunt de dades que conté les mostres de dades que ens agradaria poder reconèixer.
Com que el nostre objectiu és controlar un LED amb la nostra ordre de veu, haurem de recollir mostres de veu per a totes les ordres i el soroll perquè pugui distingir entre ordres de veu i altres sorolls.
Crearem un conjunt de dades amb tres classes " LED ON ", " LED OFF " i " noise ". Per crear un conjunt de dades, creeu un compte Edge Impulse, verifiqueu-lo i, a continuació, inicieu un projecte nou. Podeu carregar les mostres mitjançant el mòbil, la placa Arduino o podeu importar un conjunt de dades al vostre compte d’impulsos Edge. La manera més senzilla de carregar les mostres al vostre compte és mitjançant el telèfon mòbil. Per a això connecteu el mòbil amb Edge Impulse.
Per connectar el telèfon mòbil, feu clic a " Dispositius " i, a continuació, feu clic a " Connecta un dispositiu nou" .

Ara, a la finestra següent, feu clic a "Utilitza el telèfon mòbil" i apareixerà un codi QR. Escaneja el codi QR amb el telèfon mòbil o introdueix l’URL que apareix al codi QR.

Això connectarà el telèfon amb l’estudi Edge Impulse.

Amb el telèfon connectat a Edge Impulse Studio, ara podeu carregar les vostres mostres. Per carregar les mostres, feu clic a " Adquisició de dades" . Ara, a la pàgina d’adquisició de dades, introduïu el nom de l’etiqueta, seleccioneu el micròfon com a sensor i introduïu la longitud de la mostra. Feu clic a " Inicia el mostreig" i el dispositiu capturarà una mostra de 2 segons. Enregistreu un total de 10 a 12 mostres de veu en diferents condicions.

Després de carregar les mostres per a la primera classe, configureu ara el canvi de l'etiqueta i recopileu les mostres per a les classes " llum apagada" i "soroll" .

Aquestes mostres són per a la formació del mòdul; en els passos següents, recollirem les dades de prova. Les dades de les proves haurien de ser com a mínim el 30% de les dades de formació, de manera que recopileu les 4 mostres de "soroll" i de 4 a 5 mostres per a "llum encesa" i "llum apagada".
Formació del model
Com que el nostre conjunt de dades està a punt, ara podem crear un impuls per a les dades. Per a això, aneu a la pàgina " Crea impuls ". Canvieu la configuració predeterminada de la mida de la finestra de 1000 ms a 1200 ms i la de 500 ms augmenta a 50 ms. Això significa que les nostres dades es processaran 1,2 s alhora, començant cada 58 ms.
Ara a la pàgina " Crea impuls", feu clic a " Afegeix un bloc de processament" . A la finestra següent, seleccioneu el bloc Àudio (MFCC). Després d'això, feu clic a " Afegeix un bloc d'aprenentatge" i seleccioneu el bloc Neural Network (Keras). A continuació, feu clic a " Desa l'impuls" .

Al pas següent, aneu a la pàgina MFCC i feu clic a "Genera funcions". Generarà blocs MFCC per a totes les nostres finestres d’àudio.

Després, aneu a la pàgina "Classificador NN" i feu clic als tres punts de l'extrem superior dret de la " Configuració de la xarxa neuronal" i seleccioneu " Canvia al mode Keras (expert)" .

Substituïu l'original pel codi següent i canvieu la " Qualificació mínima de confiança" a " 0,70" . A continuació, feu clic al botó " Comença a entrenar ". Començarà a entrenar el vostre model.
importa tensorflow com tf des de tensorflow.keras.models importa Seqüencial de tensorflow.keras.layers importa Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D de tensorflow.keras.optimizers importa Adam de 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))) # això controla la velocitat d'aprenentatge opt = Adam (lr = 0,005; beta_1 = 0,9; beta_2 = 0,999) = 9, validació_dades = (X_test, Y_test), detallada = 2)detallat = 2)detallat = 2)
Després d'entrenar el model, mostrarà el rendiment de l'entrenament. Per a mi, la precisió va ser del 81,1% i la pèrdua del 0,45, cosa que no és un rendiment ideal, però podem continuar. Podeu augmentar el rendiment del vostre model creant un gran conjunt de dades.

Ara que el nostre model de reconeixement de veu està a punt, el desplegarem com a biblioteca Arduino. Abans de descarregar el model com a biblioteca, podeu provar el rendiment anant a la pàgina "Classificació en directe" . La funció de classificació en directe us permet provar el model tant amb les dades de prova existents que es van incloure amb el conjunt de dades com mitjançant la transmissió de dades d'àudio des del telèfon mòbil.

Per provar les dades amb el telèfon, trieu " Canvia al mode de classificació" al telèfon.

Ara per descarregar el model com a biblioteca Arduino, aneu a la pàgina " Desplegament " i seleccioneu " Biblioteca Arduino" . Ara desplaceu-vos cap avall i feu clic a " Construeix " per iniciar el procés. Això crearà una biblioteca Arduino per al vostre projecte.

Ara afegiu la biblioteca al vostre IDE Arduino. Per a això, obriu l'IDE Arduino i, a continuació, feu clic a Sketch> Include Library> Add.ZIP library
A continuació, carregueu un exemple anant a Fitxer> Exemples> Nom del vostre projecte - Edge Impulse> nano_ble33_sense_microphone
Codi Arduino per al reconeixement de veu Arduino
Aquí s'han fet alguns canvis per controlar el LED amb les ordres de veu.
Estem realitzant alguns canvis al bucle buit () on s’imprimeix la probabilitat d’ordres. Al codi original, imprimeix totes les etiquetes i els seus valors junts.
per a (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Per controlar el LED hem de desar totes les probabilitats d’ordres en tres variables diferents per poder posar-hi sentències condicionals. Així que d'acord amb el nou codi si la probabilitat de ' llum sobre' comando és més de 0.50, llavors s'encendrà el LED i si la probabilitat de ' fora de la llum' comando és més de 0,50 del que s'apagarà el LED.
per a (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {noise = result.classification.value; Serial.println ("Soroll:"); Serial.println (soroll); } per a (mida_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Llum apagada"); Serial.print (lightoff); } lighton = 1- (soroll + lightoff); Serial.println ("Llum encesa:"); Serial.print (lighton); if (lighton> 0,50) {digitalWrite (led, HIGH); } if (lightoff> 0,50) {digitalWrite (led, BAIX); }
Després de fer els canvis, pengeu el codi al vostre Arduino. Obriu el monitor sèrie a 115200 baud.

Així és com podeu crear reconeixement de veu mitjançant Arduino i donar ordres per fer funcionar els dispositius.
A continuació es mostra un vídeo de treball complet amb una biblioteca i un codi.
