- Komponenter kreves
- Kretsdiagram
- Opprette datasett for Arduino talegjenkjenning
- Trening av modellen
- Arduino-kode for Arduino stemmegjenkjenning
Talegjenkjenningsteknologi er veldig nyttig i automatisering, som ikke bare gir deg håndfri kontroll over enheter, men som også gir systemet sikkerhet. Bortsett fra å lage stemmestyrte dingser, gir talegjenkjenning også betydelig hjelp til mennesker som lider av ulike funksjonshemninger.
I tidligere prosjekter bygde vi Arduino-basert Text to Speech (TTS) Converter og stemmestyrte lys. Nå i dette prosjektet skal vi bruke maskinlæring til å trene en talegjenkjenningsmodell ved hjelp av Edge Impulse Studio med tre kommandoer, dvs. ' LIGHT ON' , ' LIGHT OFF' og ' NOISE '. Edge Impulse er en online maskinlæringsplattform som gjør det mulig for utviklere å lage neste generasjon intelligente enhetsløsninger med innebygd maskinlæring. Vi brukte Edge impulse studio tidligere for å skille hoste og støylyder.
Komponenter kreves
Maskinvare
- Arduino 33 BLE Sense
- LED
- Jumper Wires
Programvare
- Edge Impulse Studio
- Arduino IDE
Vi har dekket en detaljert opplæring om Arduino 33 BLE Sense.
Kretsdiagram
Kretsdiagram for denne stemmegjenkjenningen ved hjelp av Arduino er gitt nedenfor. Fritzing-delen til Arduino 33 BLE var ikke tilgjengelig, så jeg brukte Arduino Nano da begge har samme pinout.
Den positive ledningen til LED er koblet til den digitale pinnen 5 i Arduino 33 BLE sense, og den negative ledningen er koblet til GND-pinnen i Arduino.
Opprette datasett for Arduino talegjenkjenning
Her brukes Edge Impulse Studio til å trene vår Talegjenkjenningsmodell. Å trene en modell på Edge Impulse Studio ligner på å trene maskinlæringsmodeller i andre maskinlæringsrammer. For opplæring er en maskinlæringsmodells første trinn å samle inn et datasett som inneholder eksemplene på data som vi ønsker å kunne gjenkjenne.
Ettersom vårt mål er å kontrollere en LED med vår stemmekommando, må vi samle stemmeprøver for alle kommandoene og støyen slik at den kan skille mellom talekommandoer og andre lyder.
Vi vil lage et datasett med tre klasser " LED ON ", " LED OFF " og " noise ". For å opprette et datasett, opprett en Edge Impulse-konto, bekreft kontoen din og start et nytt prosjekt. Du kan laste prøvene ved å bruke mobilen din, Arduino-kortet ditt, eller du kan importere et datasett til kantimpulskontoen din. Den enkleste måten å laste prøvene inn på kontoen din er å bruke mobiltelefonen. For det, koble mobilen med Edge Impulse.
For å koble til mobiltelefon, klikk på ' Enheter ' og deretter på ' Koble til en ny enhet' .
Nå klikker du på "Bruk din mobiltelefon" i neste vindu, så vises en QR-kode. Skann QR-koden med mobiltelefonen din, eller skriv inn URL-en som er gitt på QR-koden.
Dette vil koble telefonen din til Edge Impulse studio.
Med telefonen din koblet til Edge Impulse Studio, kan du nå laste inn prøvene dine. For å laste prøvene, klikk på ' Datainnsamling' . Nå angir du navnet på datainnsamlingen på etiketten, velger mikrofonen som sensor og skriver inn prøvelengden. Klikk på ' Start prøvetaking' , enheten vil ta en prøve på 2 sekunder. Ta opp totalt 10 til 12 stemmeprøver under forskjellige forhold.
Etter at du har lastet opp prøvene for første klasse, setter du endringen på etiketten og samler prøvene for " light off" og "noise" -klassen.
Disse prøvene er for opplæring av modulen. I de neste trinnene samler vi testdataene. Testdataene bør være minst 30% av treningsdataene, så samle de 4 prøvene av "støy" og 4 til 5 prøver for "lys på" og "lys av".
Trening av modellen
Siden datasettet vårt er klart, kan vi nå lage en impuls for dataene. Gå til siden " Opprett impuls " for det. Endre standardinnstillingene for en vindusstørrelse på 1000 ms til 1200 ms og 500 ms for å øke til 50 ms. Dette betyr at dataene våre blir behandlet 1,2 s om gangen, og starter hver 58 ms.
Nå på siden " Opprett impuls" klikker du på " Legg til en behandlingsblokk" . I neste vindu velger du Audio (MFCC) -blokken. Etter det klikker du på ' Legg til en læringsblokk' og velger Neural Network (Keras) -blokken. Klikk deretter på ' Save Impulse' .
I neste trinn går du til MFCC-siden og klikker deretter på 'Generer funksjoner'. Det vil generere MFCC-blokker for alle lydvinduene våre.
Deretter går du til ' NN Classifier' -siden og klikker på de tre punktene i øvre høyre hjørne av ' Neural Network settings' og velger ' Switch to Keras (expert) mode' .
Erstatt originalen med følgende kode og endre ' Minimums tillitsgrad' til ' 0,70' . Klikk deretter på ' Start trening' -knappen. Det vil begynne å trene modellen din.
importer tensorflow som tf fra tensorflow.keras.models importerer sekvensiell fra tensorflow.keras.layers importerer Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D fra tensorflow.keras.optimizers importerer Adam fra tensorflow.keras.conints. importer MaxNorm # modellarkitekturmodell = Sekvensiell () 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, aktivering = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2, padding = 'same')) model.add (Conv2D (5, kernel_size = 5, aktivering = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (bassengstørrelse = 2,padding = 'same')) model.add (Flatten ()) model.add (Tett (klasser, aktivering = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # dette styrer læringshastigheten opt = Adam (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # trene nevrale nettverksmodell. Kompilere (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epoker = 9, validering_data = (X_test, Y_test), detaljert = 2)utførlig = 2)utførlig = 2)
Etter å ha trent modellen vil den vise treningsytelsen. For meg var nøyaktigheten 81,1% og tapet var 0,45 som ikke er ideell ytelse, men vi kan fortsette med det. Du kan øke ytelsen til modellen din ved å lage et stort datasett.
Nå som vår Speech Recognition-modell er klar, vil vi distribuere denne modellen som Arduino-bibliotek. Før du laster ned modellen som et bibliotek, kan du teste ytelsen ved å gå til ' Live Classification' -siden. Live klassifiseringsfunksjonen lar deg teste modellen både med eksisterende testdata som fulgte med datasettet eller ved å streame lyddata fra mobiltelefonen din.
For å teste dataene med telefonen din, velg ' Bytt til klassifiseringsmodus' på telefonen.
For å laste ned modellen som Arduino-bibliotek, gå til ' Distribusjon ' -siden og velg ' Arduino Library' . Bla nå ned og klikk på ' Bygg ' for å starte prosessen. Dette vil bygge et Arduino-bibliotek for prosjektet ditt.
Legg nå til biblioteket i din Arduino IDE. For det åpner du Arduino IDE og klikker deretter på Skisse> Inkluder bibliotek> Add.ZIP-bibliotek
Last deretter et eksempel ved å gå til Fil> Eksempler> Prosjektnavnet ditt - Edge Impulse> nano_ble33_sense_microphone
Arduino-kode for Arduino stemmegjenkjenning
Her er det gjort noen endringer for å kontrollere LED med talekommandoer.
Vi gjør noen endringer i tomrummet () der det skriver ut sannsynligheten for kommandoer. I den opprinnelige koden skriver den ut alle etikettene og deres verdier sammen.
for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
For å kontrollere LED-en må vi lagre alle kommandosannsynlighetene i tre forskjellige variabler, slik at vi kan sette betingede utsagn på dem. Så i henhold til den nye koden, hvis sannsynligheten for " lys på" -kommandoen er mer enn 0,50, vil den slå på LED-en, og hvis sannsynligheten for " lys av" -kommandoen er mer enn 0,50, vil den slå av LED-en.
for (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {noise = result.classification.value; Serial.println ("Støy:"); Serial.println (støy); } for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Lys av:"); Serial.print (lightoff); } lighton = 1- (støy + lightoff); Serial.println ("Lys PÅ:"); Serial.print (lighton); hvis (lighton> 0,50) {digitalWrite (led, HIGH); } if (lightoff> 0,50) {digitalWrite (led, LOW); }
Etter at du har gjort endringene, laster du opp koden til Arduino. Åpne den serielle skjermen ved 115200 baud.
Slik kan du bygge talegjenkjenning ved hjelp av Arduino og gi kommandoer for å betjene enhetene.
En komplett arbeidsvideo med bibliotek og kode er gitt nedenfor.