- Componenten vereist
- Schakelschema
- De gegevensset voor Arduino-spraakherkenning maken
- Het model trainen
- Arduino-code voor Arduino-spraakherkenning
Spraakherkenningstechnologie is erg handig bij automatisering, waardoor u niet alleen handsfree controle hebt over apparaten, maar ook beveiliging aan het systeem toevoegt. Naast het maken van spraakgestuurde gadgets, biedt spraakherkenning ook aanzienlijke hulp aan mensen met verschillende handicaps.
In eerdere projecten hebben we op Arduino gebaseerde Text to Speech (TTS) Converter en spraakgestuurde lichten gebouwd. In dit project gaan we machine learning gebruiken om een spraakherkenningsmodel te trainen met Edge Impulse Studio met drie commando's, namelijk ' LICHT AAN' , ' LICHT UIT' en ' GELUID '. Edge Impulse is een online machine learning-platform waarmee ontwikkelaars de volgende generatie intelligente apparaatoplossingen met embedded Machine Learning kunnen creëren. We gebruikten eerder Edge Impulse Studio om hoest- en lawaai te onderscheiden.
Componenten vereist
Hardware
- Arduino 33 BLE Sense
- LED
- Doorverbindingsdraden
Software
- Edge Impulse Studio
- Arduino IDE
We hebben een gedetailleerde tutorial over Arduino 33 BLE Sense behandeld.
Schakelschema
Het schakelschema voor deze spraakherkenning met Arduino wordt hieronder gegeven. Fritzing-onderdeel voor Arduino 33 BLE was niet beschikbaar, dus ik heb Arduino Nano gebruikt omdat beide dezelfde pinout hebben.
De positieve kabel van de LED is verbonden met digitale pin 5 van Arduino 33 BLE sense en de negatieve kabel is verbonden met de GND-pin van Arduino.
De gegevensset voor Arduino-spraakherkenning maken
Hier wordt Edge Impulse Studio gebruikt om ons spraakherkenningsmodel te trainen. Het trainen van een model op Edge Impulse Studio is vergelijkbaar met het trainen van machine learning-modellen op andere machine learning-frameworks. Voor training is de eerste stap van een machine learning-model het verzamelen van een dataset met de gegevensmonsters die we graag zouden willen herkennen.
Omdat het ons doel is om een LED te besturen met onze spraakopdracht, moeten we spraakmonsters verzamelen voor alle opdrachten en ruis, zodat deze onderscheid kan maken tussen spraakopdrachten en andere geluiden.
We zullen een dataset maken met drie klassen " LED AAN ", " LED UIT " en " ruis ". Om een dataset aan te maken, maakt u een Edge Impulse-account aan, verifieert u uw account en start u een nieuw project. Je kunt de samples laden met je mobiel, je Arduino-bord of je kunt een dataset importeren in je edge impulse-account. De eenvoudigste manier om de samples in uw account te laden, is door uw mobiele telefoon te gebruiken. Verbind daarvoor de mobiel met Edge Impulse.
Om een mobiele telefoon aan te sluiten, klikt u op ' Apparaten ' en vervolgens op ' Een nieuw apparaat verbinden' .
Klik nu in het volgende venster op 'Gebruik je mobiele telefoon' , en een QR-code zal verschijnen. Scan de QR-code met uw mobiele telefoon of voer de URL in die op de QR-code staat.
Hiermee wordt uw telefoon verbonden met Edge Impulse Studio.
Met uw telefoon verbonden met Edge Impulse Studio, kunt u nu uw samples laden. Om de samples te laden klikt u op ' Data-acquisitie' . Voer nu op de pagina Data-acquisitie de labelnaam in, selecteer de microfoon als sensor en voer de monsterlengte in. Klik op ' Start sampling' , uw apparaat neemt een sample van 2 seconden op. Neem in totaal 10 tot 12 stemmonsters op onder verschillende omstandigheden.
Na het uploaden van de samples voor de eerste klas zet je nu het label en verzamel je de samples voor ' light off' en 'noise' class.
Deze voorbeelden zijn voor het trainen van de module, in de volgende stappen verzamelen we de testgegevens. De testgegevens moeten ten minste 30% van de trainingsgegevens zijn, dus verzamel de 4 monsters van 'ruis' en 4 tot 5 monsters voor 'licht aan' en 'licht uit'.
Het model trainen
Nu onze dataset klaar is, kunnen we nu een impuls aan de data geven. Ga daarvoor naar de pagina ' Impuls creëren '. Wijzig de standaardinstellingen van een venstergrootte van 1000 ms naar 1200 ms en een verhoging van 500 ms venster naar 50 ms. Dit betekent dat onze gegevens 1,2 seconden per keer worden verwerkt, beginnend met elke 58 ms.
Klik nu op de pagina ' Impuls maken' op ' Verwerkingsblok toevoegen' . Selecteer in het volgende venster het blok Audio (MFCC). Klik daarna op ' Leerblok toevoegen' en selecteer het blok Neural Network (Keras). Klik vervolgens op ' Impuls opslaan' .
Ga in de volgende stap naar de MFCC-pagina en klik vervolgens op 'Generate Features'. Het zal MFCC-blokken genereren voor al onze vensters met audio.
Ga daarna naar de ' NN Classifier'- pagina en klik op de drie stippen in de rechterbovenhoek van de' Neural Network-instellingen ' en selecteer' Switch to Keras (expert) mode ' .
Vervang het origineel door de volgende code en verander de ' Minimale betrouwbaarheidsclassificatie' in ' 0,70' . Klik vervolgens op de knop ' Start training' . Het zal uw model gaan trainen.
importeer tensorflow als tf uit tensorflow.keras.models import Sequential uit tensorflow.keras.layers import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D uit tensorflow.keras.optimizers importeer Adamas.keras.optimizers import Adamas uit tensorflow.keras.optimizers. import MaxNorm # modelarchitectuur 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, activering = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2, padding = 'same')) model.add (Conv2D (5, kernel_size = 5, activering = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (klassen, activering = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # dit regelt de leersnelheid opt = Adam (lr = 0.005, beta_1 = 0.9, beta_2 = 0.999) # train het neurale netwerkmodel. Stapel (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, tijdperken = 9, validation_data = (X_test, Y_test), uitgebreid = 2)uitgebreid = 2)uitgebreid = 2)
Na het trainen van het model zal het de trainingsprestaties laten zien. Voor mij was de nauwkeurigheid 81,1% en het verlies was 0,45, dat is geen ideale prestatie, maar we kunnen ermee doorgaan. U kunt de prestaties van uw model verbeteren door een uitgebreide gegevensset te maken.
Nu ons spraakherkenningsmodel klaar is, zullen we dit model inzetten als Arduino-bibliotheek. Voordat u het model als bibliotheek downloadt, kunt u de prestaties testen door naar de pagina ' Live classificatie' te gaan . Met de functie Live classificatie kunt u het model testen met zowel de bestaande testgegevens die bij de dataset zijn geleverd als door audiogegevens van uw mobiele telefoon te streamen.
Om de gegevens met uw telefoon te testen, kiest u ' Overschakelen naar classificatiemodus' op uw telefoon.
Om het model nu als Arduino Library te downloaden, gaat u naar de pagina ' Implementatie ' en selecteert u ' Arduino Library' . Scroll nu naar beneden en klik op ' Build ' om het proces te starten. Hiermee wordt een Arduino-bibliotheek voor uw project gebouwd.
Voeg nu de bibliotheek toe aan uw Arduino IDE. Open daarvoor de Arduino IDE en klik vervolgens op Sketch> Inclusief bibliotheek> Add.ZIP-bibliotheek
Laad vervolgens een voorbeeld door naar Bestand> Voorbeelden> Uw projectnaam - Edge Impulse> nano_ble33_sense_microphone te gaan
Arduino-code voor Arduino-spraakherkenning
Hier zijn enkele wijzigingen aangebracht om de LED te bedienen met de spraakopdrachten.
We brengen enkele wijzigingen aan in de void-lus () waar het de waarschijnlijkheid van opdrachten afdrukt. In de originele code drukt het alle labels en hun waarden samen af.
voor (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Om de LED te besturen, moeten we alle commando-waarschijnlijkheden in drie verschillende variabelen opslaan, zodat we er voorwaardelijke uitspraken over kunnen doen. Dus volgens de nieuwe code als de kans op ' licht aan' commando groter is dan 0,50 dan zal het de LED inschakelen en als de kans op ' licht uit' commando groter is dan 0,50 dan zal het de LED uitschakelen.
voor (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {noise = resultaat.classificatie.waarde; Serial.println ("Ruis:"); Serial.println (ruis); } voor (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Licht uit:"); Serial.print (licht uit); } lighton = 1- (noise + lightoff); Serial.println ("Licht AAN:"); Serial.print (lighton); if (lighton> 0.50) {digitalWrite (led, HIGH); } if (lightoff> 0.50) {digitalWrite (led, LOW); }
Nadat u de wijzigingen heeft aangebracht, uploadt u de code naar uw Arduino. Open de seriële monitor op 115200 baud.
Zo bouw je met Arduino spraakherkenning en geef je commando's om de apparaten te bedienen.
Een complete werkvideo met een bibliotheek en code wordt hieronder gegeven.