- Komponenter, der kræves
- Kredsløbsdiagram
- Oprettelse af datasættet til Arduino talegenkendelse
- Træning af modellen
- Arduino-kode til Arduino stemmegenkendelse
Talegenkendelsesteknologi er meget nyttig i automatisering, som ikke kun giver dig håndfri kontrol over enheder, men også tilføjer sikkerhed til systemet. Bortset fra at lave stemmestyrede gadgets giver talegenkendelse også betydelig hjælp til mennesker, der lider af forskellige handicap.
I tidligere projekter byggede vi Arduino-baseret Tekst til tale (TTS) konverter og stemmestyrede lys. Nu i dette projekt skal vi bruge maskinlæring til at træne en talegenkendelsesmodel ved hjælp af Edge Impulse Studio med tre kommandoer, dvs. ' LIGHT ON' , ' LIGHT OFF' og ' NOISE '. Edge Impulse er en online maskinlæringsplatform, der gør det muligt for udviklere at skabe den næste generation af intelligente enhedsløsninger med indlejret maskinlæring. Vi brugte Edge impulsstudie tidligere til at differentiere hoste og støjlyde.
Komponenter, der kræves
Hardware
- Arduino 33 BLE Sense
- LED
- Jumper Wires
Software
- Edge Impulse Studio
- Arduino IDE
Vi har dækket en detaljeret vejledning om Arduino 33 BLE Sense.
Kredsløbsdiagram
Kredsløbsdiagram for denne stemmegenkendelse ved hjælp af Arduino er angivet nedenfor. Fritzing-del til Arduino 33 BLE var ikke tilgængelig, så jeg brugte Arduino Nano, da begge har samme pinout.
Den positive ledning af LED er forbundet til den digitale pin 5 i Arduino 33 BLE sense, og negativ ledning er forbundet til GND-stiften i Arduino.
Oprettelse af datasættet til Arduino talegenkendelse
Her bruges Edge Impulse Studio til at træne vores talegenkendelsesmodel. Uddannelse af en model i Edge Impulse Studio svarer til træning af maskinlæringsmodeller på andre maskinlæringsrammer. Til træning er en maskinlæringsmodells første trin at indsamle et datasæt, der indeholder de stikprøver af data, som vi gerne vil kunne genkende.
Da vores mål er at styre en LED med vores stemmekommando, skal vi samle stemmeprøver til alle kommandoer og støj, så den kan skelne mellem stemmekommandoer og andre lyde.
Vi opretter et datasæt med tre klasser " LED ON ", " LED OFF " og " noise ". For at oprette et datasæt skal du oprette en Edge Impulse-konto, bekræfte din konto og derefter starte et nyt projekt. Du kan indlæse prøverne ved hjælp af din mobil, dit Arduino-kort, eller du kan importere et datasæt til din kantimpulskonto. Den nemmeste måde at indlæse prøverne på din konto er ved hjælp af din mobiltelefon. For at forbinde mobilen med Edge Impulse.
For at oprette forbindelse til mobiltelefon skal du klikke på ' Enheder ' og derefter klikke på ' Tilslut en ny enhed' .
Klik nu på det næste vindue på 'Brug din mobiltelefon' , så vises en QR-kode. Scan QR-koden med din mobiltelefon, eller indtast den URL, der er angivet på QR-koden.
Dette forbinder din telefon med Edge Impulse studio.
Med din telefon tilsluttet Edge Impulse Studio kan du nu indlæse dine prøver. For at indlæse prøverne skal du klikke på ' Dataindsamling' . Indtast nu etiketnavnet på siden Dataindsamling, vælg mikrofonen som en sensor, og indtast prøvelængden. Klik på ' Start prøveudtagning' , din enhed fanger en prøve på 2 sekunder. Optag i alt 10 til 12 stemmeprøver under forskellige forhold.
Efter upload af prøverne til den første klasse skal du nu indstille skiftetiketten og samle prøverne til ' light off' og 'noise' klasse.
Disse prøver er til træning af modulet. I de næste trin indsamler vi testdata. Testdata skal være mindst 30% af træningsdataene, så saml de 4 prøver af 'støj' og 4 til 5 prøver for 'lys til' og 'lys slukket'.
Træning af modellen
Da vores datasæt er klar, kan vi nu oprette en impuls til dataene. Gå til siden ' Opret impuls ' for det. Skift standardindstillingerne for en vinduesstørrelse på 1000 ms til 1200 ms og vinduet på 500 ms til 50 ms. Dette betyder, at vores data behandles 1,2 sek ad gangen og starter hver 58ms.
Klik nu på siden ' Opret impuls' på ' Tilføj en behandlingsblok' . I det næste vindue skal du vælge Audio (MFCC) -blokken. Klik derefter på ' Tilføj en læringsblok' og vælg blokken Neural Network (Keras). Klik derefter på ' Gem impuls' .
I det næste trin skal du gå til MFCC-siden og derefter klikke på 'Generer funktioner'. Det genererer MFCC-blokke til alle vores lydvinduer.
Gå derefter til ' NN Classifier' -siden og klik på de tre prikker i øverste højre hjørne af ' Neural Network settings' og vælg ' Switch to Keras (expert) mode' .
Udskift originalen med følgende kode, og skift ' Minimum tillidsvurdering' til ' 0,70' . Klik derefter på knappen ' Start træning' . Det begynder at træne din model.
importer tensorflow som tf fra tensorflow.keras.models import Sekventiel 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 # modelarkitektur model = Sekventiel () 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 = 'samme', 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 (pool_størrelse = 2,padding = 'same')) model.add (Flatten ()) model.add (Tæt (klasser, aktivering = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # dette styrer optagelsen af læringshastigheden = Adam (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # træne den neurale netværksmodel. Kompilere (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epoker = 9, validering_data = (X_test, Y_test), detaljeret = 2)detaljeret = 2)detaljeret = 2)
Efter træning af modellen vil den vise træningspræstationen. For mig var nøjagtigheden 81,1%, og tabet var 0,45, hvilket ikke er ideel ydelse, men vi kan fortsætte med det. Du kan øge din models ydeevne ved at oprette et stort datasæt.
Nu da vores talegenkendelsesmodel er klar, vil vi implementere denne model som Arduino-bibliotek. Før du downloader modellen som et bibliotek, kan du teste ydeevnen ved at gå til ' Live Classification' -siden. Live-klassifikationsfunktionen giver dig mulighed for at teste modellen både med de eksisterende testdata, der fulgte med datasættet, eller ved at streame lyddata fra din mobiltelefon.
For at teste dataene med din telefon skal du vælge ' Skift til klassifikationstilstand' på din telefon.
For at downloade modellen som Arduino-bibliotek skal du gå til siden ' Implementering ' og vælge ' Arduino Library' . Rul nu ned og klik på ' Byg ' for at starte processen. Dette bygger et Arduino-bibliotek til dit projekt.
Tilføj nu biblioteket i din Arduino IDE. For det skal du åbne Arduino IDE og derefter klikke på Skitse> Inkluder bibliotek> Tilføj.ZIP-bibliotek
Indlæs derefter et eksempel ved at gå til Filer> Eksempler> Dit projektnavn - Edge Impulse> nano_ble33_sense_microphone
Arduino-kode til Arduino stemmegenkendelse
Her er der foretaget nogle ændringer for at styre LED med stemmekommandoer.
Vi foretager nogle ændringer i hulrummet (), hvor det udskriver sandsynligheden for kommandoer. I den originale kode udskriver den alle etiketterne og deres værdier sammen.
for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
For at kontrollere LED'en er vi nødt til at gemme alle kommandosandsynlighederne i tre forskellige variabler, så vi kan sætte betingede udsagn på dem. Så ifølge den nye kode, hvis sandsynligheden for ' lys til' kommando er mere end 0,50, vil den tænde lysdioden, og hvis sandsynligheden for ' lys fra' kommandoen er mere end 0,50, vil den slukke for LED'en.
for (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {noise = result.classification.value; Serial.println ("Støj:"); Serial.println (støj); } for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Lys slukket:"); Serial.print (lightoff); } lighton = 1- (støj + lightoff); Serial.println ("Lys TIL:"); Serial.print (lighton); hvis (lighton> 0,50) {digitalWrite (led, HIGH); } hvis (lightoff> 0,50) {digitalWrite (led, LOW); }
Når du har foretaget ændringerne, skal du uploade koden til din Arduino. Åbn den serielle skærm ved 115200 baud.
Sådan kan du oprette talegenkendelse ved hjælp af Arduino og give kommandoer til at betjene enhederne.
En komplet arbejdsvideo med et bibliotek og kode er angivet nedenfor.