Sommario:

Identificatore sonoro personalizzato per la cucina: 4 passaggi
Identificatore sonoro personalizzato per la cucina: 4 passaggi

Video: Identificatore sonoro personalizzato per la cucina: 4 passaggi

Video: Identificatore sonoro personalizzato per la cucina: 4 passaggi
Video: Come faccio?? 2024, Dicembre
Anonim
Image
Image
Identificatore del suono della cucina personalizzato
Identificatore del suono della cucina personalizzato

Per il nostro progetto finale in un corso sui sistemi interattivi questa primavera, abbiamo creato un sistema in tempo reale per identificare e visualizzare i suoni comuni in cucina utilizzando la classificazione Support-Vector Machine. Il sistema è composto da un laptop per il campionamento/classificazione audio e un display Arduino/matrice di punti per la visualizzazione. Quella che segue è una guida per creare la propria versione di questo sistema per i suoni della propria cucina.

Il nostro caso d'uso originale era come un dispositivo per la cucina di un individuo non udente e con problemi di udito, ma questo sistema potrebbe teoricamente essere adattato per identificare un insieme di suoni in una varietà di contesti. La cucina era un punto di partenza ideale, poiché tende ad essere relativamente silenziosa e contiene una quantità ragionevole di suoni semplici e distinti.

Un repository GitHub per questo progetto può essere trovato qui.

Forniture

  • Arduino Leonardo Microcontrollore con header
  • KEYESTUDIO Display LED a matrice di punti 16x16 per Arduino
  • Cavo per ponticello breadboard
  • Cavo da Micro-USB a USB 2.0
  • Un laptop con Jupyter Notebook (installazione Anaconda)

    Una guida per principianti a Jupyter Notebook può essere trovata qui

  • Una notevole quantità di mattoncini LEGO non corrispondenti per l'alloggiamento del sistema

    (Ma puoi davvero sostituirli con qualsiasi materiale da costruzione fai-da-te che desideri!)

Passaggio 1: raccolta di campioni di suoni in cucina

Raccolta di campioni sonori in cucina
Raccolta di campioni sonori in cucina

Figura sopra: dati audio presi dalla registrazione di una forchetta e di un coltello che tintinnano insieme utilizzando questo processo di raccolta

Per identificare i suoni in tempo reale, dobbiamo fornire al nostro modello di apprendimento automatico esempi di qualità per il confronto. Abbiamo creato un notebook Jupyter per questo processo, a cui è possibile accedere qui o tramite il repository GitHub del nostro progetto. Il repository contiene anche raccolte di campioni da due diverse cucine a scopo di test.

Passaggio 1.1: copiare il notebook CollectSamples.ipynb nella directory di lavoro del notebook Jupyter e aprirlo.

Passaggio 1.2: esegui ogni cella una per una, prestando attenzione a tutte le note che abbiamo fornito nelle intestazioni. Fermati quando raggiungi uno intitolato "Registrazione campione".

NOTA: in questo notebook vengono utilizzate diverse librerie Python e ognuna richiede l'installazione prima di poter essere importata correttamente nel progetto. Puoi farlo manualmente, anche se una guida per l'installazione della libreria all'interno di Jupyter Notebook può essere trovata qui.

Passaggio 1.3: creare una directory vuota per memorizzare i campioni all'interno della directory di lavoro per questo progetto.

Passaggio 1.4: modifica la variabile SAMPLES_LOCATION nella cella "Registrazione campione" in modo che corrisponda alla posizione della directory vuota.

Passaggio 1.5: aggiungi o rimuovi tutti i suoni che desideri alla variabile SOUND_LABELS.

Affinché il codice di registrazione di esempio funzioni, ogni riga di questa variabile deve essere separata da una virgola e della seguente forma:

'ts':Suono("Suono mirato", "ts")

Passaggio 1.6: quando tutte le etichette sono state aggiunte, valutando la cella "Registrazione campioni" inizia il processo di raccolta del campione. Nell'output della cella, ti verrà chiesto di inserire il codice funzione che hai associato a ciascun suono nelle etichette (ad esempio, "ts" per TargetedSound). Non farlo ancora.

Passaggio 1.7: porta il tuo laptop in cucina e posizionalo nell'area in cui è più probabile che tu possa posizionare il sistema finito. Questa posizione dovrebbe essere centrale per una buona raccolta audio e asciutta e lontana da eventuali fuoriuscite per proteggere i tuoi dispositivi elettronici.

Passaggio 1.8: prepara il tuo primo suono mirato. Se si tratta di un segnale acustico del timer del forno, è possibile impostare il timer su un minuto e attendere che il conto alla rovescia arrivi a circa 20 secondi prima di continuare con il passaggio successivo.

Passaggio 1.9: digitare il codice dell'etichetta nel prompt (ad esempio, "ts") e premere Invio/Invio.

Il sistema inizierà ad ascoltare un evento sonoro distinto dal rumore ambientale della stanza. Dopo aver rilevato questo evento sonoro, inizierà la registrazione finché non rileva che il suono nella stanza è tornato ai livelli ambientali. Quindi salverà l'audio come file WAV a 16 bit nella directory identificata in SAMPLES_LOCATION nel formato:

TargetedSound_#_captured.wav

La parte # di questo nome file corrisponde al numero di campioni del suono di destinazione che hai raccolto. Dopo che il file WAV è stato salvato, il prompt si ripeterà, consentendo di raccogliere diversi campioni dello stesso suono in un'unica esecuzione della cella.

NON modificare questo nome file. È importante per il prossimo passo.

Passaggio 1.10: ripetere i passaggi 1.8 e 1.9 fino a quando non sono stati raccolti 5-10 campioni di ciascun suono.

Passaggio 1.11: immettere "x" al termine per uscire dall'esecuzione.

ATTENZIONE: La mancata chiusura della cella in questo modo può causare il crash del Notebook. In questo caso, il kernel del Notebook deve essere ripristinato e ogni cella deve essere eseguita di nuovo dall'alto.

Passaggio 1.11 (Facoltativo): controlla i dati WAV dei singoli file nella cella "Visualizzazione rapida del suono" per assicurarti di aver acquisito tutte le informazioni desiderate.

Alcuni suggerimenti:

  • Registra quando la tua cucina è silenziosa.
  • Registra solo un suono alla volta. Il sistema non è in grado di distinguere la sovrapposizione nei suoni.
  • Cerca di rendere ogni prova sonora il più coerente possibile. Questo aiuterà l'accuratezza dell'identificazione.
  • La rivalutazione della cella di registrazione reimposterà il valore # nel nome del file e sovrascriverà tutti i file esistenti che corrispondono a quel #. Abbiamo trovato più semplice registrare tutti i campioni di un suono contemporaneamente, quindi interrompere la cella di registrazione.
  • Se il sistema non rileva il suono desiderato, provare a ridurre il valore THRESHOLD (impostato su 30 per iniziare) e rivalutare la cella.
  • Se la registrazione viene attivata da altri suoni al di fuori di quello mirato, provare ad aumentare il valore di SOGLIA (impostato a 30 per iniziare) e rivalutare la cella.

Passaggio 2: preparazione del display Arduino/Matrix

Preparazione del display Arduino/Matrix
Preparazione del display Arduino/Matrix
Preparazione del display Arduino/Matrix
Preparazione del display Arduino/Matrix
Preparazione del display Arduino/Matrix
Preparazione del display Arduino/Matrix

Successivamente, configureremo il sistema di visualizzazione utilizzando un display a matrice di punti LED Arduino Leonardo e KEYESTUDIO 16x16. Questo serve per produrre la previsione del modello di classificazione dei suoni rilevati. Come prima, abbiamo fornito tutti i file richiesti sia qui che nel repository GitHub del progetto.

Passaggio 2.1: cablare Arduino e la matrice LED secondo lo schema sopra. KEYESTUDIO include cavi per il collegamento alla loro matrice di punti, ma saranno necessari cavi jumper per breadboard per collegare questi cavi all'Arduino

Passaggio 2.2: aprire "arduino_listener.ino" utilizzando l'IDE Ardunio e caricarlo su Leonardo. Se cablato correttamente, dovresti vedere l'icona "ascolto" (assomiglia al Wi-Fi) come mostrato nell'immagine sopra.

Passaggio 2.3: Prepara le icone che desideri visualizzare per ciascuno dei tuoi suoni target. Per sapere quali LED accendere, l'icona deve essere inviata dall'Arduino alla matrice come array di byte. Ad esempio, la nostra icona della tazza di caffè (nell'immagine sopra) viene inviata alla matrice in questo formato:

{

0xff, 0xff, 0xff, 0xff, 0xfc, 0xfb, 0xbb, 0x5b, 0xeb, 0xfb, 0xfb, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf, 0x0f, 0xf, 0xf, 0xf 0xfb, 0xf7, 0x0f, 0xdf, 0x1f, 0xff, 0xff};

Abbiamo disegnato le nostre icone utilizzando lo strumento online Dot2Pic, con 16 colonne, 16 righe e "monocromatico, 8 pixel per byte, impostazione verticale" selezionato dal menu a discesa. Il nostro si trova nell'array "sample_icon_bytes.txt".

NOTA: potrebbero esserci anche strumenti online che possono farlo automaticamente con i file caricati.

Passaggio 2.4: Disegna ogni icona. Quando hai finito di disegnare, seleziona "Converti nell'array".

Passaggio 2.5: sostituire le icone non necessarie definite nella parte superiore del codice "arduino_listening.ino" come desiderato. Assicurati di aggiungere un commento che descriva l'icona in modo da ricordare quale è quale!

Passaggio 2.6: carica il nuovo codice su Arduino. Non chiudere ancora il file, ne avremo bisogno per il passaggio successivo.

Passaggio 3: esecuzione del classificatore e identificazione dei suoni

Esecuzione del classificatore e identificazione dei suoni
Esecuzione del classificatore e identificazione dei suoni
Esecuzione del classificatore e identificazione dei suoni
Esecuzione del classificatore e identificazione dei suoni

Ora è il momento di mettere insieme il sistema. La pipeline di classificazione, la comunicazione Arduino e l'acquisizione dell'audio dal vivo vengono eseguite tramite un singolo notebook Arduino, che è stato fornito qui o è possibile accedervi tramite il repository GitHub del nostro progetto.

Passaggio 3.1: copiare il notebook FullPipeline.ipynb nella directory di lavoro del notebook Jupyter e aprirlo.

Passaggio 3.2: esegui ogni cella una per una, prestando attenzione a tutte le note che abbiamo fornito nelle intestazioni. Non è previsto alcun output. Fermati quando raggiungi la cella intitolata "Carica i dati di allenamento".

Passaggio 3.3: Modifica la variabile SAMPLES_LOCATION_ROOT nella cella "Carica i dati di addestramento" nella directory padre della posizione della directory di esempio precedente. Quindi, cambia la variabile SAMPLES_DIR_NAME con il nome della tua directory. Quindi, se avessi impostato la posizione in CollectSamples.ipynb su:

SAMPLES_LOCATION = "/Users/xxxx/Documents/KitchenSoundClassifier/MySamples/NewDir"

Ora imposteresti queste variabili su:

SAMPLES_LOCATION_ROOT = "/Users/xxxx/Documents/KitchenSoundClassifier/MySamples/"SAMPLES_DIR_NAME = "NewDir"

Abbiamo fatto questo per consentire rapide modifiche al classificatore in caso di imprecisioni. Puoi passare da una raccolta di campioni all'altra per ottimizzare i tuoi dati.

Passaggio 3.4: valutare la cella. Dovresti vedere ogni raccolta caricata correttamente.

Passaggio 3.5: continua a eseguire ogni cella una per una, prestando attenzione a tutte le note che abbiamo fornito nelle intestazioni.

Passaggio 3.6: fermati quando raggiungi la cella "Messaggi Arduino". Definisci la porta seriale che il tuo computer utilizzerà per la comunicazione con Arduino nella variabile PORT_DEF. Questo può essere trovato nell'IDE di Arduino e andando su Strumenti> Porta.

Ulteriori informazioni possono essere trovate qui.

Passaggio 3.8: riapri il tuo IDE Arduino. Nei punti in cui hai apportato modifiche alle icone, prendi nota della lettera accanto al valore dell'array, ma NON modificarla. Nell'esempio seguente, questo è "g".

// smaltimento dei rifiuticonst unsigned char g[1][32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf7, 0xf7, 0xfb, 0xff, 0xfe, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x27, 0xc3, 0x03, 0xc3, 0x27, 0x2f, 0xff, 0xef, 0xdf, 0xbf, 0xff, 0xff, };

Step 3.7: (Ritornando alla cella "Messaging Arduino" del Notebook) Cambia le etichette nel dizionario self.sounds in modo che corrispondano alle etichette che hai usato nella registrazione dei tuoi campioni, assicurandoti che ogni etichetta corrisponda alla singola lettera che hai annotato nel precedente fare un passo. "Registrazione" e "Ascolto" sono entrambi parte della funzionalità di base del sistema e non dovrebbero essere modificati. NON modificare la seconda lettera a meno che tu non ti senta sicuro di apportare alcune modifiche extra anche al codice Arduino, poiché altrimenti rovinerebbe la comunicazione con Arduino/matrice.

Passaggio 3.8: esegui la funzione principale! Il codice catturerà i dati di addestramento, estrarrà le sue caratteristiche chiave, li inserirà nella pipeline, costruirà un modello di classificazione, quindi inizierà ad ascoltare gli eventi sonori. Quando ne rileva uno, vedrai la matrice cambiare in un simbolo di registrazione (quadrato con un cerchio all'interno) e segmenterà questi dati e li inserirà nel modello. Qualunque cosa preveda il modello apparirà pochi secondi dopo sul display a matrice.

Puoi seguire l'output della cella di seguito. Guarda quanto puoi ottenerlo con precisione!

Passaggio 4: creazione di un alloggiamento LEGO

Creazione di un alloggiamento LEGO
Creazione di un alloggiamento LEGO
Creazione di un alloggiamento LEGO
Creazione di un alloggiamento LEGO
Creazione di un alloggiamento LEGO
Creazione di un alloggiamento LEGO

Questa è la parte divertente! Hai eseguito tutti i passaggi importanti dell'apprendimento automatico e hai messo in funzione l'intero sistema end-to-end, e ora puoi giocare con i LEGO come ricompensa. Non c'è molto di un processo da dettagliare qui. Abbiamo solo aggiunto blocchi che ci piacevano qua e là senza preoccuparci troppo del design generale, e alla fine siamo rimasti soddisfatti di come è venuto fuori.

Consenti alle nostre immagini di fungere da ispirazione per il tuo alloggiamento creativo unico per la tua cucina. Abbiamo posizionato Arduino e la maggior parte del cablaggio in una custodia vuota, quindi abbiamo fissato il display a matrice sopra con sporgenze. Abbiamo aggiunto un po' di carta sul display per diffondere leggermente la luce che secondo noi rendeva le icone più chiare.

Consigliato: