- Componenti richiesti
- Schema elettrico
- Creazione del set di dati per il riconoscimento vocale di Arduino
- Formazione del modello
- Codice Arduino per riconoscimento vocale Arduino
La tecnologia di riconoscimento vocale è molto utile nell'automazione che non solo ti dà il controllo a mani libere sui dispositivi, ma aggiunge anche sicurezza al sistema. Oltre a creare gadget a controllo vocale, il riconoscimento vocale fornisce anche un aiuto significativo alle persone che soffrono di varie disabilità.
In progetti precedenti abbiamo costruito un convertitore di sintesi vocale (TTS) basato su Arduino e luci a comando vocale. Ora, in questo progetto, utilizzeremo l'apprendimento automatico per addestrare un modello di riconoscimento vocale utilizzando Edge Impulse Studio con tre comandi, ovvero " LIGHT ON" , " LIGHT OFF" e " NOISE ". Edge Impulse è una piattaforma di machine learning online che consente agli sviluppatori di creare la prossima generazione di soluzioni per dispositivi intelligenti con Machine Learning integrato. In precedenza abbiamo utilizzato Edge Impulse Studio per differenziare i suoni della tosse e del rumore.
Componenti richiesti
Hardware
- Arduino 33 BLE Sense
- GUIDATO
- Cavi per ponticelli
Software
- Edge Impulse Studio
- IDE Arduino
Abbiamo coperto un tutorial dettagliato su Arduino 33 BLE Sense.
Schema elettrico
Di seguito è riportato lo schema del circuito per questo riconoscimento vocale utilizzando Arduino. La parte Fritzing per Arduino 33 BLE non era disponibile, quindi ho usato Arduino Nano poiché entrambi hanno lo stesso pinout.
Il cavo positivo del LED è collegato al pin digitale 5 di Arduino 33 BLE sense e il cavo negativo è collegato al pin GND di Arduino.
Creazione del set di dati per il riconoscimento vocale di Arduino
Qui Edge Impulse Studio viene utilizzato per addestrare il nostro modello di riconoscimento vocale. L'addestramento di un modello su Edge Impulse Studio è simile all'addestramento di modelli di machine learning su altri framework di machine learning. Per l'addestramento, il primo passaggio di un modello di apprendimento automatico consiste nel raccogliere un set di dati contenente i campioni di dati che vorremmo essere in grado di riconoscere.
Poiché il nostro obiettivo è controllare un LED con il nostro comando vocale, avremo bisogno di raccogliere campioni vocali per tutti i comandi e il rumore in modo che possa distinguere tra comandi vocali e altri rumori.
Creeremo un dataset con tre classi " LED ON ", " LED OFF " e " noise ". Per creare un set di dati, crea un account Edge Impulse, verifica il tuo account e quindi avvia un nuovo progetto. Puoi caricare i campioni utilizzando il tuo cellulare, la tua scheda Arduino oppure puoi importare un set di dati nel tuo account edge impulse. Il modo più semplice per caricare i campioni nel tuo account è utilizzare il tuo telefono cellulare. Per questo collega il cellulare con Edge Impulse.
Per connettere il telefono cellulare, fare clic su " Dispositivi " e quindi su " Collega un nuovo dispositivo" .
Ora nella finestra successiva fai clic su "Usa il tuo telefono cellulare" e apparirà un codice QR. Scansiona il codice QR con il tuo telefono cellulare o inserisci l'URL fornito sul codice QR.
Questo collegherà il tuo telefono con Edge Impulse Studio.
Con il telefono connesso a Edge Impulse Studio, ora puoi caricare i tuoi campioni. Per caricare i campioni fare clic su " Acquisizione dati" . Ora nella pagina Acquisizione dati inserisci il nome dell'etichetta, seleziona il microfono come sensore e inserisci la lunghezza del campione. Fare clic su " Avvia campionamento" , il dispositivo acquisirà un campione di 2 secondi. Registra un totale di 10-12 campioni vocali in condizioni diverse.
Dopo aver caricato i campioni per la prima classe ora imposta la modifica dell'etichetta e raccogli i campioni per la classe " luce spenta" e "rumore" .
Questi esempi sono per l'addestramento del modulo, nei passaggi successivi raccoglieremo i dati del test. I dati dei test dovrebbero essere almeno il 30% dei dati di addestramento, quindi raccogliere i 4 campioni di "rumore" e da 4 a 5 campioni per "luce accesa" e "luce spenta".
Formazione del modello
Poiché il nostro set di dati è pronto, ora possiamo creare un impulso per i dati. Per questo vai alla pagina " Crea impulso ". Modificare le impostazioni predefinite di una dimensione della finestra di 1000 ms a 1200 ms e aumentare la finestra di 500 ms a 50 ms. Ciò significa che i nostri dati verranno elaborati per 1,2 s alla volta, a partire da ogni 58 ms.
Ora nella pagina " Crea impulso" fai clic su " Aggiungi un blocco di elaborazione" . Nella finestra successiva selezionare il blocco Audio (MFCC). Successivamente, fai clic su " Aggiungi un blocco di apprendimento" e seleziona il blocco Rete neurale (Keras). Quindi fare clic su " Salva impulso" .
Nel passaggio successivo, vai alla pagina MFCC e quindi fai clic su "Genera funzionalità". Genererà blocchi MFCC per tutte le nostre finestre di audio.
Dopodiché, vai alla pagina " NN Classifier" e fai clic sui tre punti nell'angolo in alto a destra delle " Impostazioni rete neurale" e seleziona " Passa alla modalità Keras (esperto)" .
Sostituisci l'originale con il codice seguente e modifica il " Grado di confidenza minimo" in " 0,70" . Quindi fare clic sul pulsante " Avvia formazione" . Inizierà l'addestramento del tuo modello.
importa tensorflow come tf da tensorflow.keras.models importa Sequential da tensorflow.keras.layers importa Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D da tensorflow.keras.optimizer. import MaxNorm # model architecture 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, activation = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2, padding = 'same')) model.add (Conv2D (5, kernel_size = 5, activation = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (classes, activation = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # controlla il tasso di apprendimento opt = Adam (lr = 0.005, beta_1 = 0.9, beta_2 = 0.999) # addestra la rete neurale model.compile (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epochs = 9, validation_data = (X_test, Y_test), verbose = 2)verbose = 2)verbose = 2)
Dopo l'allenamento il modello mostrerà le prestazioni dell'allenamento. Per me la precisione era dell'81,1% e la perdita di 0,45 non è una prestazione ideale, ma possiamo procedere con essa. Puoi aumentare le prestazioni del tuo modello creando un vasto set di dati.
Ora che il nostro modello di riconoscimento vocale è pronto, distribuiremo questo modello come libreria Arduino. Prima di scaricare il modello come libreria è possibile testare le prestazioni andando alla pagina "Classificazione in tempo reale " . La funzione di classificazione in tempo reale consente di testare il modello sia con i dati di test esistenti forniti con il set di dati o tramite lo streaming di dati audio dal telefono cellulare.
Per testare i dati con il telefono, selezionare " Passa alla modalità di classificazione" sul telefono.
Ora per scaricare il modello come libreria Arduino, vai alla pagina " Distribuzione " e seleziona " Libreria Arduino" . Ora scorri verso il basso e fai clic su " Build " per avviare il processo. Questo creerà una libreria Arduino per il tuo progetto.
Ora aggiungi la libreria nel tuo IDE Arduino. Per questo apri l'IDE di Arduino e quindi fai clic su Schizzo> Includi libreria> Aggiungi libreria ZIP
Quindi, carica un esempio andando su File> Esempi> Il nome del tuo progetto - Edge Impulse> nano_ble33_sense_microphone
Codice Arduino per riconoscimento vocale Arduino
Qui sono state apportate alcune modifiche per controllare il LED con i comandi vocali.
Stiamo apportando alcune modifiche nel void loop () in cui stampa la probabilità dei comandi. Nel codice originale, stampa tutte le etichette e i loro valori insieme.
for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Per controllare il LED dobbiamo salvare tutte le probabilità di comando in tre diverse variabili in modo da poter inserire delle istruzioni condizionali su di esse. Quindi, secondo il nuovo codice, se la probabilità del comando ' luce accesa' è maggiore di 0,50 allora si accenderà il LED e se la probabilità del comando ' luce spenta' sarà maggiore di 0,50 allora spegnerà il LED.
for (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {noise = result.classification.value; Serial.println ("Rumore:"); Serial.println (rumore); } for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Luce spenta:"); Serial.print (lightoff); } lighton = 1- (rumore + lightoff); Serial.println ("Luce accesa:"); Serial.print (lighton); if (lighton> 0.50) {digitalWrite (led, HIGH); } if (lightoff> 0.50) {digitalWrite (led, LOW); }
Dopo aver apportato le modifiche, carica il codice nel tuo Arduino. Aprire il monitor seriale a 115200 baud.
In questo modo puoi costruire il riconoscimento vocale usando Arduino e dare comandi per azionare i dispositivi.
Di seguito viene fornito un video completo di lavoro con una libreria e un codice.