- Erforderliche Komponenten
- Schaltplan
- Erstellen des Datensatzes für die Arduino-Spracherkennung
- Das Modell trainieren
- Arduino-Code für die Arduino-Spracherkennung
Die Spracherkennungstechnologie ist in der Automatisierung sehr nützlich, da Sie nicht nur die Geräte freihändig steuern, sondern auch die Sicherheit des Systems erhöhen können. Neben der Herstellung sprachgesteuerter Geräte bietet die Spracherkennung auch Menschen mit verschiedenen Behinderungen eine wichtige Hilfe.
In früheren Projekten haben wir Arduino-basierte TTS-Konverter (Text to Speech) und sprachgesteuerte Lichter gebaut. In diesem Projekt werden wir maschinelles Lernen verwenden, um ein Spracherkennungsmodell mit Edge Impulse Studio mit drei Befehlen zu trainieren: " LIGHT ON" , " LIGHT OFF" und " NOISE ". Edge Impulse ist eine Online-Plattform für maschinelles Lernen, mit der Entwickler die nächste Generation intelligenter Gerätelösungen mit eingebettetem maschinellem Lernen erstellen können. Wir haben zuvor Edge Impulse Studio verwendet, um Husten- und Geräuschgeräusche zu unterscheiden.
Erforderliche Komponenten
Hardware
- Arduino 33 BLE Sense
- LED
- Überbrückungsdrähte
Software
- Edge Impulse Studio
- Arduino IDE
Wir haben ein detailliertes Tutorial zu Arduino 33 BLE Sense behandelt.
Schaltplan
Das Schaltbild für diese Spracherkennung mit Arduino ist unten angegeben. Das Fritzing-Teil für Arduino 33 BLE war nicht verfügbar, daher habe ich Arduino Nano verwendet, da beide die gleiche Pinbelegung haben.
Die positive Leitung der LED ist mit dem digitalen Pin 5 von Arduino 33 BLE sense verbunden, und die negative Leitung ist mit dem GND-Pin von Arduino verbunden.
Erstellen des Datensatzes für die Arduino-Spracherkennung
Hier wird Edge Impulse Studio verwendet, um unser Spracherkennungsmodell zu trainieren. Das Trainieren eines Modells in Edge Impulse Studio ähnelt dem Trainieren von Modellen für maschinelles Lernen auf anderen Frameworks für maschinelles Lernen. Für das Training besteht der erste Schritt eines maschinellen Lernmodells darin, einen Datensatz zu sammeln, der die Datenproben enthält, die wir erkennen möchten.
Da unser Ziel darin besteht, eine LED mit unserem Sprachbefehl zu steuern, müssen wir Sprachproben für alle Befehle und Geräusche sammeln, damit zwischen Sprachbefehlen und anderen Geräuschen unterschieden werden kann.
Wir werden einen Datensatz mit den drei Klassen " LED EIN ", " LED AUS " und " Rauschen " erstellen. Um ein Dataset zu erstellen, erstellen Sie ein Edge Impulse-Konto, überprüfen Sie Ihr Konto und starten Sie ein neues Projekt. Sie können die Samples mit Ihrem Handy oder Ihrem Arduino-Board laden oder einen Datensatz in Ihr Edge-Impulse-Konto importieren. Der einfachste Weg, die Proben in Ihr Konto zu laden, ist die Verwendung Ihres Mobiltelefons. Verbinden Sie dazu das Handy mit Edge Impulse.
Um eine Verbindung zum Mobiltelefon herzustellen, klicken Sie auf " Geräte " und dann auf " Neues Gerät verbinden" .
Klicken Sie nun im nächsten Fenster auf "Verwenden Sie Ihr Mobiltelefon" und ein QR-Code wird angezeigt. Scannen Sie den QR-Code mit Ihrem Mobiltelefon oder geben Sie die im QR-Code angegebene URL ein.
Dadurch wird Ihr Telefon mit Edge Impulse Studio verbunden.
Wenn Ihr Telefon mit Edge Impulse Studio verbunden ist, können Sie jetzt Ihre Samples laden. Um die Samples zu laden, klicken Sie auf ' Datenerfassung' . Geben Sie nun auf der Seite Datenerfassung den Etikettennamen ein, wählen Sie das Mikrofon als Sensor aus und geben Sie die Probenlänge ein. Klicken Sie auf " Sampling starten" . Ihr Gerät erfasst ein 2-Sekunden-Sample. Nehmen Sie insgesamt 10 bis 12 Sprachproben unter verschiedenen Bedingungen auf.
Nachdem Sie die Samples für die erste Klasse hochgeladen haben, stellen Sie nun die Änderung der Beschriftung ein und sammeln Sie die Samples für die Klassen ' Light Off' und 'Noise' .
Diese Beispiele dienen zur Schulung des Moduls. In den nächsten Schritten werden die Testdaten gesammelt. Die Testdaten sollten mindestens 30% der Trainingsdaten betragen. Sammeln Sie daher die 4 Proben „Rauschen“ und 4 bis 5 Proben für „Licht an“ und „Licht aus“.
Das Modell trainieren
Sobald unser Datensatz fertig ist, können wir jetzt einen Impuls für die Daten erzeugen. Gehen Sie dazu zur Seite " Impuls erstellen ". Ändern Sie die Standardeinstellungen für eine Fenstergröße von 1000 ms auf 1200 ms und eine Fenstergröße von 500 ms auf 50 ms. Dies bedeutet, dass unsere Daten jeweils 1,2 s ab jeweils 58 ms verarbeitet werden.
Klicken Sie nun auf der Seite " Impuls erstellen" auf " Verarbeitungsblock hinzufügen" . Wählen Sie im nächsten Fenster den Audio-Block (MFCC). Klicken Sie anschließend auf " Lernblock hinzufügen" und wählen Sie den Keras-Block (Neural Network) aus. Klicken Sie dann auf " Impuls speichern" .
Gehen Sie im nächsten Schritt zur MFCC-Seite und klicken Sie auf "Features generieren". Es werden MFCC-Blöcke für alle unsere Audiofenster generiert.
Gehen Sie danach zur Seite ' NN Classifier' und klicken Sie auf die drei Punkte in der oberen rechten Ecke der ' Neural Network Settings' und wählen Sie ' Switch to Keras (Expert) Mode' .
Ersetzen Sie das Original durch den folgenden Code und ändern Sie die ' Mindestvertrauensbewertung' in ' 0,70' . Klicken Sie dann auf die Schaltfläche " Training starten" . Es beginnt mit dem Training Ihres Modells.
Tensorflow als tf aus tensorflow.keras.models importieren Sequentiell aus tensorflow.keras.layers importieren Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D aus tensorflow.keras.optimizers Adam aus tensorflow.keras.conin importieren import MaxNorm # Modellarchitektur 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, Aktivierung = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2, padding = 'same')) model.add (Conv2D (5, kernel_size = 5, Aktivierung = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D () pool_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (Klassen, Aktivierung = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3)) # steuert die Lernrate opt = Adam (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # trainiere das neuronale Netzwerkmodell = 9, Validierungsdaten = (X_test, Y_test), ausführlich = 2)ausführlich = 2)ausführlich = 2)
Nach dem Training des Modells wird die Trainingsleistung angezeigt. Für mich betrug die Genauigkeit 81,1% und der Verlust 0,45, was keine ideale Leistung ist, aber wir können damit fortfahren. Sie können die Leistung Ihres Modells steigern, indem Sie ein umfangreiches Dataset erstellen.
Sobald unser Spracherkennungsmodell fertig ist, werden wir dieses Modell als Arduino-Bibliothek bereitstellen. Bevor Sie das Modell als Bibliothek herunterladen, können Sie die Leistung auf der Seite " Live-Klassifizierung" testen. Mit der Live-Klassifizierungsfunktion können Sie das Modell sowohl mit den vorhandenen Testdaten testen, die mit dem Datensatz geliefert wurden, als auch durch Streamen von Audiodaten von Ihrem Mobiltelefon.
Um die Daten mit Ihrem Telefon zu testen, wählen Sie auf Ihrem Telefon die Option "In den Klassifizierungsmodus wechseln" .
Um das Modell als Arduino-Bibliothek herunterzuladen, gehen Sie zur Seite " Bereitstellung " und wählen Sie " Arduino-Bibliothek" . Scrollen Sie nun nach unten und klicken Sie auf " Erstellen ", um den Vorgang zu starten. Dadurch wird eine Arduino-Bibliothek für Ihr Projekt erstellt.
Fügen Sie nun die Bibliothek in Ihre Arduino IDE ein. Öffnen Sie dazu die Arduino IDE und klicken Sie auf Sketch> Include Library> Add.ZIP library
Laden Sie dann ein Beispiel, indem Sie zu Datei> Beispiele> Ihr Projektname - Edge Impulse> nano_ble33_sense_microphone gehen
Arduino-Code für die Arduino-Spracherkennung
Hier wurden einige Änderungen vorgenommen, um die LED mit den Sprachbefehlen zu steuern.
Wir nehmen einige Änderungen in der void loop () vor, in der die Wahrscheinlichkeit von Befehlen gedruckt wird. Im Originalcode werden alle Etiketten und ihre Werte zusammen gedruckt.
für (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }}
Um die LED zu steuern, müssen wir alle Befehlswahrscheinlichkeiten in drei verschiedenen Variablen speichern, damit wir ihnen bedingte Anweisungen geben können. Wenn also nach dem neuen Code die Wahrscheinlichkeit des Befehls " Licht an" mehr als 0,50 beträgt, wird die LED eingeschaltet, und wenn die Wahrscheinlichkeit des Befehls " Licht aus" mehr als 0,50 beträgt, wird die LED ausgeschaltet.
für (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {Noise = result.classification.value; Serial.println ("Noise:"); Serial.println (Rauschen); } for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Light Off:"); Serial.print (Lightoff); } lighton = 1- (Rauschen + Lightoff); Serial.println ("Light ON:"); Serial.print (Lighton); if (lighton> 0.50) {digitalWrite (led, HIGH); } if (lightoff> 0.50) {digitalWrite (led, LOW); }}
Laden Sie nach den Änderungen den Code in Ihr Arduino hoch. Öffnen Sie den seriellen Monitor bei 115200 Baud.
Auf diese Weise können Sie mit Arduino eine Spracherkennung erstellen und Befehle zum Bedienen der Geräte eingeben.
Ein vollständiges Arbeitsvideo mit einer Bibliothek und Code ist unten angegeben.