Inhaltsverzeichnis:
- Lieferungen
- Schritt 1: Sammeln von Küchen-Sound-Samples
- Schritt 2: Vorbereiten des Arduino/Matrix-Displays
- Schritt 3: Ausführen des Klassifikators und Identifizieren von Geräuschen
- Schritt 4: Erstellen eines LEGO-Gehäuses
Video: Benutzerdefinierter Küchen-Sound-Identifikator - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:17
Für unser Abschlussprojekt in einem interaktiven Systemkurs in diesem Frühjahr haben wir ein Echtzeit-System zur Erkennung und Visualisierung gängiger Geräusche in der Küche mittels Support-Vector Machine-Klassifizierung erstellt. Das System besteht aus einem Laptop für Audio-Sampling/Klassifizierung und einem Arduino/Dot-Matrix-Display zur Visualisierung. Im Folgenden finden Sie eine Anleitung zum Erstellen Ihrer eigenen Version dieses Systems für Klänge aus Ihrer eigenen Küche.
Unser ursprünglicher Anwendungsfall war ein Gerät für die Küche eines gehörlosen und schwerhörigen Menschen, aber dieses System könnte theoretisch angepasst werden, um eine Reihe von Geräuschen in einer Vielzahl von Kontexten zu identifizieren. Die Küche war ein idealer Ausgangspunkt, da sie relativ ruhig ist und eine angemessene Menge einfacher, unterschiedlicher Geräusche enthält.
Ein GitHub-Repository für dieses Projekt finden Sie hier.
Lieferungen
- Arduino Leonardo Mikrocontroller mit Headern
- KEYESTUDIO 16x16 Dot Matrix LED-Anzeige für Arduino
- Steckbrücken-Überbrückungskabel
- Micro-USB-zu-USB 2.0-Kabel
-
Ein Laptop mit Jupyter Notebook (Anaconda-Installation)
Eine Anleitung für Anfänger zu Jupyter Notebook finden Sie hier
-
Eine beträchtliche Menge nicht übereinstimmender LEGO-Steine für das Gehäuse des Systems
(Aber Sie können diese wirklich durch jedes DIY-Baumaterial ersetzen, das Sie möchten!)
Schritt 1: Sammeln von Küchen-Sound-Samples
Abbildung oben: Audiodaten, die bei der Aufnahme eines Zusammenklirrens von Gabel und Messer mit diesem Erfassungsprozess aufgenommen wurden
Um Echtzeitgeräusche zu identifizieren, müssen wir unser Machine-Learning-Modell mit Qualitätsbeispielen zum Vergleich versorgen. Für diesen Prozess haben wir ein Jupyter-Notebook erstellt, auf das hier oder über das GitHub-Repository unseres Projekts zugegriffen werden kann. Zu Testzwecken enthält das Repository auch Musterkollektionen aus zwei verschiedenen Küchen.
Schritt 1.1: Kopieren Sie das Notebook CollectSamples.ipynb in Ihr funktionierendes Jupyter Notebook-Verzeichnis und öffnen Sie es.
Schritt 1.2: Führen Sie jede Zelle nacheinander aus und achten Sie dabei auf alle Hinweise, die wir in den Überschriften angegeben haben. Stoppen Sie, wenn Sie eine mit dem Titel "Sample Recording" erreichen.
HINWEIS: In diesem Notebook werden mehrere Python-Bibliotheken verwendet, und jede erfordert eine Installation, bevor sie erfolgreich in das Projekt importiert werden kann. Sie können dies gerne manuell tun, aber eine Anleitung zur Bibliotheksinstallation in Jupyter Notebook finden Sie hier.
Schritt 1.3: Erstellen Sie ein leeres Verzeichnis, um Ihre Samples in Ihrem Arbeitsverzeichnis für dieses Projekt zu speichern.
Schritt 1.4: Bearbeiten Sie die Variable SAMPLES_LOCATION in der Zelle "Sample Recording" so, dass sie mit dem Speicherort Ihres leeren Verzeichnisses übereinstimmt.
Schritt 1.5: Fügen Sie der Variablen SOUND_LABELS beliebig viele Sounds hinzu oder entfernen Sie sie.
Damit der Beispielaufzeichnungscode funktioniert, muss jede Zeile dieser Variablen durch ein Komma getrennt werden und die folgende Form haben:
'ts':Sound("TargetedSound", "ts")
Schritt 1.6: Wenn alle Labels hinzugefügt wurden, werten Sie die Zelle "Sample Recording" aus und starten Sie den Probensammelvorgang. In der Ausgabe der Zelle werden Sie aufgefordert, den Funktionscode einzugeben, den Sie jedem Sound in den Labels zugeordnet haben (d. h. "ts" für TargetedSound). Tun Sie dies noch nicht.
Schritt 1.7: Nehmen Sie Ihren Laptop mit in die Küche und stellen Sie ihn dort auf, wo Sie das fertige System am ehesten platzieren würden. Dieser Ort sollte für eine gute Audiosammlung zentral und trocken und fern von möglichen Verschüttungen sein, um Ihre Elektronik zu schützen.
Schritt 1.8: Bereiten Sie Ihren ersten gezielten Sound vor. Wenn es sich um einen Ofentimer-Piepton handelt, können Sie den Timer auf eine Minute einstellen und warten, bis er auf etwa 20 Sekunden heruntergezählt hat, bevor Sie mit dem nächsten Schritt fortfahren.
Schritt 1.9: Geben Sie den Etikettencode in die Eingabeaufforderung ein (d. h. "ts") und drücken Sie die Eingabetaste/Return.
Das System beginnt, nach einem Geräuschereignis zu suchen, das sich von den Umgebungsgeräuschen des Raums unterscheidet. Nach Wahrnehmung dieses Schallereignisses beginnt die Aufnahme, bis die Geräusche im Raum wieder auf die Umgebungspegel zurückgekehrt sind. Es wird dann das Audio als 16-Bit-WAV-Datei in dem in SAMPLES_LOCATION angegebenen Verzeichnis im folgenden Format speichern:
TargetedSound_#_captured.wav
Der #-Teil dieses Dateinamens entspricht der Anzahl der gesammelten Samples des Zielsounds. Nachdem die WAV-Datei gespeichert wurde, wird die Eingabeaufforderung wiederholt, sodass Sie mehrere Samples desselben Sounds in einer einzigen Ausführung der Zelle sammeln können.
Ändern Sie diesen Dateinamen NICHT. Es ist wichtig für den nächsten Schritt.
Schritt 1.10: Wiederholen Sie die Schritte 1.8 und 1.9, bis Sie 5-10 Samples von jedem Sound gesammelt haben.
Schritt 1.11: Geben Sie "x" ein, wenn Sie fertig sind, um die Ausführung zu beenden.
WARNUNG: Wird die Zelle nicht auf diese Weise beendet, kann das Notebook abstürzen. In diesem Fall muss der Notebook-Kernel zurückgesetzt und jede Zelle erneut von oben ausgeführt werden.
Schritt 1.11 (Optional): Überprüfen Sie die WAV-Daten einzelner Dateien in der Zelle "Quick Sound Visualization", um sicherzustellen, dass Sie alle gewünschten Informationen erfasst haben.
Einige Hinweise:
- Nehmen Sie auf, wenn Ihre Küche still ist.
- Nehmen Sie nur einen Ton auf einmal auf. Das System kann Überlappungen bei Tönen nicht unterscheiden.
- Versuchen Sie, jeden Klangversuch so konsistent wie möglich zu gestalten. Dies trägt zur Genauigkeit der Identifizierung bei.
- Eine erneute Auswertung der Aufnahmezelle setzt den #-Wert im Dateinamen zurück und überschreibt alle vorhandenen Dateien, die diesem # entsprechen. Wir fanden es am einfachsten, alle Samples eines Sounds auf einmal aufzunehmen und dann die Aufnahmezelle zu stoppen.
- Wenn das System Ihren Zielton nicht aufnimmt, versuchen Sie, den THRESHOLD-Wert zu verringern (zum Starten auf 30 eingestellt) und bewerten Sie die Zelle erneut.
- Wenn die Aufnahme durch andere Geräusche außerhalb des Ziels ausgelöst wird, versuchen Sie, den THRESHOLD-Wert (zum Starten auf 30 gesetzt) zu erhöhen und die Zelle neu zu bewerten.
Schritt 2: Vorbereiten des Arduino/Matrix-Displays
Als nächstes richten wir das Visualisierungssystem mit einem Arduino Leonardo und einem KEYESTUDIO 16x16 LED-Punktmatrix-Display ein. Dies dient dazu, die Vorhersage des Klassifikationsmodells von erkannten Geräuschen auszugeben. Wie zuvor haben wir alle erforderlichen Dateien sowohl hier als auch im GitHub-Repository des Projekts bereitgestellt.
Schritt 2.1: Verdrahten Sie die Arduino- und LED-Matrix gemäß dem obigen Diagramm. KEYESTUDIO enthält Drähte zum Anschluss an ihre Punktmatrix, aber Steckbrückendrähte werden benötigt, um diese Drähte mit dem Arduino zu verbinden
Schritt 2.2: Öffnen Sie "arduino_listener.ino" mit der Ardunio IDE und laden Sie es auf den Leonardo hoch. Bei korrekter Verkabelung sollten Sie das Symbol "Hören" (sieht aus wie Wi-Fi) sehen, wie in der obigen Abbildung gezeigt.
Schritt 2.3: Bereiten Sie die Symbole vor, die Sie für jeden Ihrer Zielsounds anzeigen möchten. Um zu wissen, welche LEDs aufleuchten sollen, muss das Icon vom Arduino als Byte-Array an die Matrix gesendet werden. Zum Beispiel wird unser Kaffeetassensymbol (im Bild oben) in diesem Format an die Matrix gesendet:
{
0xff, 0xff, 0xff, 0xff, 0xfc, 0xfb, 0xbb, 0x5b, 0xeb, 0xfb, 0xfb, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf, 0xf 0xfb, 0xf7, 0x0f, 0xdf, 0x1f, 0xff, 0xff };
Wir haben unsere Icons mit dem Online-Tool Dot2Pic gezeichnet, mit 16 Spalten, 16 Zeilen und "monochromatisch, 8 Pixel pro Byte, vertikale Einstellung" aus dem Dropdown-Menü. Unsere finden Sie im Array "sample_icon_bytes.txt".
HINWEIS: Es kann auch Online-Tools geben, die dies automatisch mit hochgeladenen Dateien tun können.
Schritt 2.4: Zeichnen Sie jedes Symbol. Wenn Sie mit dem Zeichnen fertig sind, wählen Sie "In das Array konvertieren".
Schritt 2.5: Ersetzen Sie nicht benötigte Symbole, die oben im Code "arduino_listening.ino" definiert sind, wie gewünscht. Fügen Sie unbedingt einen Kommentar hinzu, der das Symbol beschreibt, damit Sie sich daran erinnern, welches welches ist!
Schritt 2.6: Laden Sie den neuen Code auf den Arduino hoch. Schließen Sie die Datei noch nicht, wir benötigen sie für den nächsten Schritt.
Schritt 3: Ausführen des Klassifikators und Identifizieren von Geräuschen
Jetzt ist es an der Zeit, das System zusammenzustellen. Die Klassifizierungspipeline, die Arduino-Kommunikation und die Live-Audioaufnahme erfolgen über ein einziges Arduino-Notebook, das hier bereitgestellt wurde oder über das GitHub-Repository unseres Projekts zugänglich ist.
Schritt 3.1: Kopieren Sie das Notebook FullPipeline.ipynb in Ihr funktionierendes Jupyter Notebook-Verzeichnis und öffnen Sie es.
Schritt 3.2: Führen Sie jede Zelle nacheinander aus und achten Sie auf alle Hinweise, die wir in den Überschriften angegeben haben. Es wird keine Ausgabe erwartet. Stoppen Sie, wenn Sie die Zelle mit dem Titel "Trainingsdaten laden" erreichen.
Schritt 3.3: Bearbeiten Sie die Variable SAMPLES_LOCATION_ROOT in der Zelle "Trainingsdaten laden" in das übergeordnete Verzeichnis des Speicherorts Ihres früheren Beispielverzeichnisses. Ändern Sie dann die Variable SAMPLES_DIR_NAME in den Namen Ihres Verzeichnisses. Wenn Sie also den Speicherort in CollectSamples.ipynb auf Folgendes festgelegt hätten:
SAMPLES_LOCATION = "/Users/xxxx/Documents/KitchenSoundClassifier/MySamples/NewDir"
Sie würden diese Variablen nun auf Folgendes setzen:
SAMPLES_LOCATION_ROOT = "/Users/xxxx/Documents/KitchenSoundClassifier/MySamples/"SAMPLES_DIR_NAME = "NewDir"
Dies ermöglichte bei Ungenauigkeiten schnelle Änderungen am Klassifikator. Sie können zwischen verschiedenen Sample-Sammlungen wechseln, um Ihre Daten zu optimieren.
Schritt 3.4: Werten Sie die Zelle aus. Sie sollten sehen, dass jede Sammlung erfolgreich geladen wurde.
Schritt 3.5: Fahren Sie fort, jede Zelle nacheinander auszuführen, und achten Sie auf alle Hinweise, die wir in den Überschriften bereitgestellt haben.
Schritt 3.6: Stoppen Sie, wenn Sie die Zelle "Messaging Arduino" erreichen. Definieren Sie den seriellen Port, den Ihr Computer für die Kommunikation mit dem Arduino verwendet, in der PORT_DEF-Variablen. Dies finden Sie in der Arduino IDE und gehen Sie zu Tools> Port.
Weitere Informationen finden Sie hier.
Schritt 3.8: Öffnen Sie Ihre Arduino-IDE erneut. Notieren Sie sich an Stellen, an denen Sie Änderungen an den Symbolen vorgenommen haben, den Buchstaben neben dem Array-Wert, aber ändern Sie ihn NICHT. Im Beispiel unten ist dies "g".
// Mülltrennungconst 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, };
Schritt 3.7: (Zurück zur Zelle "Messaging Arduino" des Notebooks) Ändern Sie die Beschriftungen im self.sounds-Wörterbuch so, dass sie mit den Beschriftungen übereinstimmen, die Sie bei der Aufnahme Ihrer Samples verwendet haben, und stellen Sie sicher, dass jede Beschriftung dem einzelnen Buchstaben entspricht, den Sie im vorherigen notiert haben Schritt. "Aufzeichnen" und "Anhören" gehören beide zur Kernfunktion des Systems und sollten nicht geändert werden. Ändern Sie den zweiten Buchstaben NICHT, es sei denn, Sie sind zuversichtlich, auch einige zusätzliche Änderungen am Arduino-Code vorzunehmen, da dies die Kommunikation mit dem Arduino / der Matrix sonst durcheinander bringt.
Schritt 3.8: Führen Sie die Hauptfunktion aus! Der Code erfasst die Trainingsdaten, extrahiert ihre Schlüsselfunktionen, speist sie in die Pipeline ein, erstellt ein Klassifizierungsmodell und beginnt dann, auf Geräuschereignisse zu lauschen. Wenn es einen erkennt, ändert sich die Matrix in ein Aufzeichnungssymbol (Quadrat mit Kreis darin) und segmentiert diese Daten und speist sie in das Modell ein. Was auch immer das Modell vorhersagt, wird einige Sekunden später auf dem Matrix-Display angezeigt.
Sie können die Ausgabe der Zelle unten mitverfolgen. Sehen Sie, wie genau Sie es erhalten können!
Schritt 4: Erstellen eines LEGO-Gehäuses
Das ist der lustige Teil! Sie haben alle ernsthaften Schritte des maschinellen Lernens durchgeführt und das gesamte End-to-End-System zum Laufen gebracht, und jetzt können Sie als Belohnung mit LEGOs spielen. Es gibt nicht viel von einem Prozess, der hier detailliert werden muss. Wir haben einfach hier und da Blöcke hinzugefügt, die uns gefielen, ohne uns zu viele Gedanken über das Gesamtdesign zu machen, und waren mit dem Ergebnis zufrieden.
Lassen Sie sich von unseren Bildern inspirieren für Ihr eigenes kreatives Wohnen, das für Ihre Küche einzigartig ist. Wir platzierten den Arduino und den Großteil der Verkabelung in einem hohlen Gehäuse und befestigten dann das Matrix-Display darüber mit Überhängen. Wir haben etwas Papier über dem Display hinzugefügt, um das Licht leicht zu streuen, was die Symbole unserer Meinung nach klarer macht.
Empfohlen:
Benutzerdefinierter PC-Build: 5 Schritte
Benutzerdefinierter PC-Build: Dies ist eine Anleitung für einen benutzerdefinierten PC-Build mit den Materialien, die ich zur Hand hatte, damit Ihr Computer nicht genau so aussieht wie meiner, es sei denn, Sie erhalten genau die gleichen Komponenten