- Komponenter krävs
- Kretsschema
- Skapa datamängden för Arduino Taligenkänning
- Träna modellen
- Arduino-kod för röstigenkänning av Arduino
Taligenkänningstekniken är mycket användbar inom automatisering, som inte bara ger dig handsfree-kontroll över enheter utan också ger säkerhet till systemet. Förutom att göra röststyrda prylar, taligenkänning ger också betydande hjälp till människor som lider av olika funktionshinder.
I tidigare projekt byggde vi Arduino-baserade Text to Speech (TTS) Converter och röststyrda lampor. Nu i det här projektet ska vi använda maskininlärning för att träna en taligenkänningsmodell med Edge Impulse Studio med tre kommandon, dvs ' LIGHT ON' , ' LIGHT OFF' och ' NOISE '. Edge Impulse är en online maskininlärningsplattform som gör det möjligt för utvecklare att skapa nästa generation av intelligenta enhetslösningar med inbäddad maskininlärning. Vi använde Edge impulse studio tidigare för att differentiera host- och bullerljud.
Komponenter krävs
Hårdvara
- Arduino 33 BLE Sense
- LED
- Bygeltrådar
programvara
- Edge Impulse Studio
- Arduino IDE
Vi har täckt en detaljerad handledning om Arduino 33 BLE Sense.
Kretsschema
Kretsschema för detta röstigenkänning med Arduino ges nedan. Fritzing-delen för Arduino 33 BLE var inte tillgänglig, så jag använde Arduino Nano eftersom båda har samma pinout.
Den positiva ledningen på LED är ansluten till den digitala stiftet 5 i Arduino 33 BLE-avkänning och den negativa ledningen är ansluten till GND-stiftet i Arduino.
Skapa datamängden för Arduino Taligenkänning
Här används Edge Impulse Studio för att träna vår modell för taligenkänning. Att träna en modell på Edge Impulse Studio liknar utbildning av maskininlärningsmodeller i andra maskininlärningsramar. För utbildning är en maskininlärningsmodells första steg att samla in en dataset som innehåller de dataprover som vi vill kunna känna igen.
Eftersom vårt mål är att styra en LED med vårt röstkommando måste vi samla röstprover för alla kommandon och brus så att den kan skilja mellan röstkommandon och andra ljud.
Vi kommer att skapa en dataset med tre klasser " LED ON ", " LED OFF " och " noise ". För att skapa en dataset, skapa ett Edge Impulse-konto, verifiera ditt konto och starta sedan ett nytt projekt. Du kan ladda proverna med din mobil, ditt Arduino-kort eller så kan du importera en dataset till ditt kantimpulskonto. Det enklaste sättet att ladda proverna till ditt konto är att använda din mobiltelefon. För att ansluta mobilen med Edge Impulse.
För att ansluta mobiltelefon klickar du på " Enheter " och sedan på " Anslut en ny enhet" .
Klicka nu på "Använd din mobiltelefon" i nästa fönster så visas en QR-kod. Skanna QR-koden med din mobiltelefon eller ange webbadressen som ges på QR-koden.
Detta kommer att ansluta din telefon till Edge Impulse studio.
Med din telefon ansluten till Edge Impulse Studio kan du nu ladda dina prover. För att ladda proverna, klicka på ' Datainsamling' . Ange nu etikettnamnet på datainsamlingssidan, välj mikrofonen som sensor och ange provets längd. Klicka på " Starta provtagning" , din enhet kommer att fånga ett prov på 2 sekunder. Spela in totalt 10 till 12 röstprover under olika förhållanden.
Efter att ha laddat upp proverna för den första klassen ställer du in ändringsetiketten och samlar in proverna för " light off" och "noise" -klassen.
Dessa prover är för utbildning av modulen, i nästa steg samlar vi in testdata. Testdata bör vara minst 30% av träningsdata, så samla de fyra proverna av "buller" och 4 till 5 prover för "light on" och "light off".
Träna modellen
Eftersom vår dataset är klar kan vi nu skapa en impuls för data. Gå till sidan ' Skapa impuls ' för det. Ändra standardinställningarna för en 1000 ms fönsterstorlek till 1200 ms och 500 ms för fönstret till 50 ms. Detta innebär att våra data kommer att behandlas 1,2 sekunder åt gången, från 58 ms.
Klicka nu på sidan ' Skapa impuls' på ' Lägg till ett behandlingsblock' . I nästa fönster väljer du Audio (MFCC) -blocket. Klicka sedan på ' Lägg till ett inlärningsblock' och välj blocket Neural Network (Keras). Klicka sedan på ' Spara impuls' .
I nästa steg går du till MFCC-sidan och klickar sedan på 'Skapa funktioner'. Det kommer att generera MFCC-block för alla våra ljudfönster.
Gå sedan till sidan " NN Classifier" och klicka på de tre punkterna i det övre högra hörnet av " Neural Network Settings" och välj " Switch to Keras (expert) mode" .
Byt ut originalet med följande kod och ändra ' Minsta tillförlitlighet' till ' 0,70' . Klicka sedan på knappen ' Börja träna' . Det kommer att börja träna din modell.
importera tensorflow som tf från tensorflow.keras.models importera sekventiellt från tensorflow.keras.layers importerar tät, InputLayer, Dropout, platt, omformning, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D från tensorflow.keras.optimizers importerar Adam från tensorflow.keras.straints. importera MaxNorm # modellarkitekturmodell = Sekventiell () modell.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 = 'samma', 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_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Tät (klasser, aktivering = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # detta styr inlärningshastigheten opt = Adam (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # träna den neurala nätverksmodellen. Kompilera (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epoker = 9, validering_data = (X_test, Y_test), ingående = 2)detaljerad = 2)detaljerad = 2)
Efter träning av modellen kommer den att visa träningsprestandan. För mig var noggrannheten 81,1% och förlusten var 0,45 vilket inte är perfekt prestanda men vi kan fortsätta med det. Du kan öka din modells prestanda genom att skapa en stor dataset.
Nu när vår Taligenkänningsmodell är klar kommer vi att distribuera den här modellen som Arduino-bibliotek. Innan du laddar ner modellen som ett bibliotek kan du testa föreställningen genom att gå till " Live Classification" -sidan. Med Live-klassificeringsfunktionen kan du testa modellen både med befintlig testdata som medföljde datasetet eller genom att strömma ljuddata från din mobiltelefon.
För att testa data med din telefon, välj " Byt till klassificeringsläge" på din telefon.
För att ladda ner modellen som Arduino-bibliotek, gå till sidan ' Deployment ' och välj ' Arduino Library' . Bläddra nu ner och klicka på ' Bygg ' för att starta processen. Detta kommer att bygga ett Arduino-bibliotek för ditt projekt.
Lägg nu till biblioteket i din Arduino IDE. För att öppna Arduino IDE och klicka sedan på Skiss> Inkludera bibliotek> Add.ZIP-bibliotek
Ladda sedan ett exempel genom att gå till Arkiv> Exempel> Ditt projektnamn - Edge Impulse> nano_ble33_sense_microphone
Arduino-kod för röstigenkänning av Arduino
Här har några ändringar gjorts för att styra LED med röstkommandon.
Vi gör några ändringar i tomrummet () där det skriver ut sannolikheten för kommandon. I den ursprungliga koden skriver den ut alla etiketter och deras värden tillsammans.
för (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
För att styra lysdioden måste vi spara alla kommandosannolikheter i tre olika variabler så att vi kan sätta villkorliga uttalanden på dem. Så enligt den nya koden, om sannolikheten för " ljus på" -kommandot är mer än 0,50, tänds lysdioden och om sannolikheten för " ljus av" -kommandot är mer än 0,50 än lysdioden.
för (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {noise = result.classification.value; Serial.println ("Buller:"); Serial.println (brus); } för (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Ljus av:"); Serial.print (lightoff); } lighton = 1- (buller + lightoff); Serial.println ("Light ON:"); Serial.print (lighton); if (lighton> 0,50) {digitalWrite (led, HIGH); } if (lightoff> 0,50) {digitalWrite (led, LOW); }
Efter att ha gjort ändringarna laddar du upp koden till din Arduino. Öppna den seriella bildskärmen vid 115200 baud.
Så här kan du bygga taligenkänning med Arduino och ge kommandon för att hantera enheterna.
En komplett arbetsvideo med ett bibliotek och kod ges nedan.