Spisu treści:

Niestandardowy identyfikator dźwięku w kuchni: 4 kroki
Niestandardowy identyfikator dźwięku w kuchni: 4 kroki

Wideo: Niestandardowy identyfikator dźwięku w kuchni: 4 kroki

Wideo: Niestandardowy identyfikator dźwięku w kuchni: 4 kroki
Wideo: Skuteczna reklama na Facebooku w 4 prostych (hłe hłe) krokach! 🙃 2024, Listopad
Anonim
Image
Image
Niestandardowy identyfikator dźwięku w kuchni
Niestandardowy identyfikator dźwięku w kuchni

W ramach naszego ostatniego projektu na kursie systemów interaktywnych tej wiosny stworzyliśmy system czasu rzeczywistego do identyfikacji i wizualizacji typowych dźwięków w kuchni przy użyciu klasyfikacji Support-Vector Machine. System składa się z laptopa do próbkowania/klasyfikowania dźwięku oraz wyświetlacza Arduino/dot matrix do wizualizacji. Poniżej znajduje się przewodnik po stworzeniu własnej wersji tego systemu dla dźwięków z własnej kuchni.

Nasz pierwotny przypadek użycia dotyczył urządzenia kuchennego dla osób niesłyszących i niedosłyszących, ale system ten można teoretycznie przystosować do identyfikacji zestawu dźwięków w różnych kontekstach. Kuchnia była idealnym miejscem do rozpoczęcia, ponieważ zwykle jest stosunkowo cicha i zawiera rozsądną ilość prostych, wyraźnych dźwięków.

Repozytorium GitHub dla tego projektu można znaleźć tutaj.

Kieszonkowe dzieci

  • Mikrokontroler Arduino Leonardo z nagłówkami
  • Wyświetlacz LED z matrycą punktową KEYESTUDIO 16x16 dla Arduino
  • Przewód połączeniowy płytki do krojenia chleba
  • Kabel micro-USB do USB 2.0
  • Laptop z notatnikiem Jupyter (instalacja Anacondy)

    Przewodnik dla początkujących po Jupyter Notebook można znaleźć tutaj

  • Duża ilość niedopasowanych klocków LEGO do obudowy systemu

    (Ale naprawdę możesz je zastąpić dowolnym materiałem budowlanym do majsterkowania!)

Krok 1: Zbieranie próbek dźwięków kuchennych

Zbieranie próbek dźwięków kuchennych
Zbieranie próbek dźwięków kuchennych

Rysunek powyżej: Dane dźwiękowe z nagrania widelca i noża brzęczącego o siebie podczas tego procesu zbierania

Aby zidentyfikować dźwięki w czasie rzeczywistym, musimy dostarczyć nasz model uczenia maszynowego wysokiej jakości przykładami do porównania. Dla tego procesu stworzyliśmy notatnik Jupyter, do którego można uzyskać dostęp tutaj lub za pośrednictwem repozytorium GitHub naszego projektu. Repozytorium zawiera również próbki próbek z dwóch różnych kuchni do celów testowych.

Krok 1.1: Skopiuj notatnik CollectSamples.ipynb do działającego katalogu notatnika Jupyter i otwórz go.

Krok 1.2: Uruchom każdą komórkę po kolei, zwracając uwagę na wszelkie notatki, które podaliśmy w nagłówkach. Zatrzymaj się, gdy dojdziesz do jednego zatytułowanego „Sample Recording”.

UWAGA: W tym notatniku używanych jest kilka bibliotek Pythona, a każda z nich wymaga instalacji, zanim będzie mogła zostać pomyślnie zaimportowana do projektu. Możesz to zrobić ręcznie, chociaż przewodnik dotyczący instalacji biblioteki w Jupyter Notebook można znaleźć tutaj.

Krok 1.3: Utwórz pusty katalog do przechowywania próbek w katalogu roboczym dla tego projektu.

Krok 1.4: Edytuj zmienną SAMPLES_LOCATION w komórce „Przykładowe nagranie”, aby dopasować lokalizację pustego katalogu.

Krok 1.5: Dodaj lub usuń dowolną liczbę dźwięków do zmiennej SOUND_LABELS.

Aby przykładowy kod nagrywania działał, każdy wiersz tej zmiennej musi być oddzielony przecinkiem i mieć następującą postać:

'ts':Sound("Dźwięk docelowy", "ts")

Krok 1.6: Po dodaniu wszystkich etykiet, ocena komórki „Zapis próbki” i rozpoczęcie procesu pobierania próbki. W danych wyjściowych komórki zostaniesz poproszony o wprowadzenie krótkiego kodu powiązanego z każdym dźwiękiem w etykietach (tj. „ts” dla TargetedSound). Nie rób tego jeszcze.

Krok 1.7: Zabierz laptopa do kuchni i umieść go w miejscu, w którym najprawdopodobniej umieścisz gotowy system. To miejsce powinno być centralne dla dobrego zbierania dźwięku, suche i z dala od wszelkich możliwych rozlań, aby chronić elektronikę.

Krok 1.8: Przygotuj swój pierwszy ukierunkowany dźwięk. Jeśli jest to sygnał dźwiękowy minutnika piekarnika, możesz ustawić minutnik na jedną minutę i poczekać, aż odliczy się do około 20 sekund, zanim przejdziesz do następnego kroku.

Krok 1.9: Wpisz kod etykiety w wierszu monitu (tj. „ts”) i naciśnij klawisz Enter/Return.

System zacznie nasłuchiwać zdarzenia dźwiękowego różniącego się od hałasu otoczenia. Po wykryciu tego zdarzenia dźwiękowego rozpocznie nagrywanie, dopóki nie wykryje, że dźwięk w pomieszczeniu wróci do poziomów otoczenia. Następnie zapisze dźwięk jako 16-bitowy plik WAV w katalogu określonym w SAMPLES_LOCATION w formacie:

TargetedSound_#_przechwycony.wav

Część # tej nazwy pliku odpowiada liczbie zebranych próbek docelowego dźwięku. Po zapisaniu pliku WAV monit zostanie powtórzony, umożliwiając zebranie kilku próbek tego samego dźwięku w jednym wykonaniu komórki.

NIE zmieniaj tej nazwy pliku. To ważne dla następnego kroku.

Krok 1.10: Powtarzaj kroki 1.8 i 1.9, aż zbierzesz 5-10 próbek każdego dźwięku.

Krok 1.11: Wprowadź "x" po zakończeniu, aby wyjść z wykonywania.

OSTRZEŻENIE: Niezamknięcie komórki w ten sposób może spowodować awarię notebooka. W takim przypadku jądro notebooka musi zostać zresetowane, a każda komórka uruchomiona ponownie od góry.

Krok 1.11 (Opcjonalnie): Sprawdź dane WAV poszczególnych plików w komórce „Szybka wizualizacja dźwięku”, aby upewnić się, że przechwyciłeś wszystkie pożądane informacje.

Kilka porad:

  • Nagrywaj, gdy w Twojej kuchni jest cicho.
  • Nagrywaj tylko jeden dźwięk na raz. System nie rozróżnia nakładania się dźwięków.
  • Postaraj się, aby każda próba dźwięku była jak najbardziej spójna. Pomoże to w dokładności identyfikacji.
  • Ponowna ocena komórki nagrywania zresetuje wartość # w nazwie pliku i nadpisze wszystkie istniejące pliki, które pasują do tego #. Okazało się, że najłatwiej jest nagrać wszystkie próbki jednego dźwięku jednocześnie, a następnie zatrzymać komórkę nagrywania.
  • Jeśli system nie odbiera docelowego dźwięku, spróbuj obniżyć wartość THRESHOLD (ustaw na 30, aby rozpocząć) i ponownie oceń komórkę.
  • Jeśli nagranie jest wyzwalane przez inne dźwięki poza docelowym, spróbuj zwiększyć wartość THRESHOLD (ustawioną na 30, aby rozpocząć) i ponownie oceń komórkę.

Krok 2: Przygotowanie wyświetlacza Arduino/Matrix

Przygotowanie wyświetlacza Arduino/Matrix
Przygotowanie wyświetlacza Arduino/Matrix
Przygotowanie wyświetlacza Arduino/Matrix
Przygotowanie wyświetlacza Arduino/Matrix
Przygotowanie wyświetlacza Arduino/Matrix
Przygotowanie wyświetlacza Arduino/Matrix

Następnie skonfigurujemy system wizualizacji za pomocą wyświetlacza Arduino Leonardo i KEYESTUDIO 16x16 LED z matrycą punktową. Ma to na celu wygenerowanie prognozy modelu klasyfikacji wykrytych dźwięków. Tak jak poprzednio, dostarczyliśmy wszystkie wymagane pliki zarówno tutaj, jak i w repozytorium GitHub projektu.

Krok 2.1: Połącz Arduino i matrycę LED zgodnie z powyższym schematem. KEYESTUDIO zawiera przewody do połączenia z matrycą punktową, ale do podłączenia tych przewodów do Arduino potrzebne będą przewody połączeniowe płytki stykowej

Krok 2.2: Otwórz "arduino_listener.ino" za pomocą Ardunio IDE i prześlij go do Leonardo. Jeśli połączenie jest prawidłowe, powinieneś zobaczyć ikonę „nasłuchiwania” (wygląda jak Wi-Fi), jak pokazano na powyższym obrazku.

Krok 2.3: Przygotuj ikony, które chcesz wyświetlić dla każdego z dźwięków docelowych. Aby wiedzieć, które diody mają się zapalić, ikona musi zostać przesłana z Arduino do matrycy jako tablica bajtów. Na przykład nasza ikona filiżanki kawy (na obrazku powyżej) jest wysyłana do matrycy w następującym formacie:

{

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

Narysowaliśmy nasze ikony za pomocą narzędzia internetowego Dot2Pic, z 16 kolumnami, 16 wierszami i "monochromatycznym, 8 pikseli na bajt, ustawieniem pionowym" wybranym z menu rozwijanego. Nasz można znaleźć w tablicy "sample_icon_bytes.txt".

UWAGA: Mogą również istnieć narzędzia online, które mogą to zrobić automatycznie z przesłanymi plikami.

Krok 2.4: Narysuj każdą ikonę. Po zakończeniu rysowania wybierz „Konwertuj na szyk”.

Krok 2.5: Zastąp niepotrzebne ikony zdefiniowane w górnej części kodu „arduino_listening.ino” zgodnie z potrzebami. Pamiętaj, aby dodać komentarz opisujący ikonę, aby zapamiętać, która jest która!

Krok 2.6: Prześlij nowy kod do Arduino. Nie zamykaj jeszcze pliku, będziemy go potrzebować w następnym kroku.

Krok 3: Uruchamianie klasyfikatora i identyfikacja dźwięków

Uruchamianie klasyfikatora i identyfikacja dźwięków
Uruchamianie klasyfikatora i identyfikacja dźwięków
Uruchamianie klasyfikatora i identyfikacja dźwięków
Uruchamianie klasyfikatora i identyfikacja dźwięków

Teraz nadszedł czas, aby złożyć system. Proces klasyfikacji, komunikacja Arduino i przechwytywanie dźwięku na żywo są wykonywane za pośrednictwem jednego notebooka Arduino, który został dostarczony tutaj lub można uzyskać do niego dostęp za pośrednictwem repozytorium GitHub naszego projektu.

Krok 3.1: Skopiuj notatnik FullPipeline.ipynb do działającego katalogu Jupyter Notebook i otwórz go.

Krok 3.2: Uruchom każdą komórkę po kolei, zwracając uwagę na wszelkie notatki, które podaliśmy w nagłówkach. Nie oczekuje się żadnych danych wyjściowych. Zatrzymaj się, gdy dojdziesz do komórki zatytułowanej „Załaduj dane treningowe”.

Krok 3.3: Edytuj zmienną SAMPLES_LOCATION_ROOT w komórce „Load the Training Data” do katalogu nadrzędnego wcześniejszej lokalizacji katalogu próbek. Następnie zmień zmienną SAMPLES_DIR_NAME na nazwę swojego katalogu. Więc jeśli ustawiłeś lokalizację w CollectSamples.ipynb na:

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

Teraz ustawisz te zmienne na:

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

Zrobiliśmy to, aby umożliwić szybkie zmiany klasyfikatora w przypadku niedokładności. Możesz przełączać się między różnymi kolekcjami próbek, aby dostroić swoje dane.

Krok 3.4: Oceń komórkę. Powinieneś zobaczyć, jak każda kolekcja została załadowana pomyślnie.

Krok 3.5: Kontynuuj uruchamianie każdej komórki jedna po drugiej, zwracając uwagę na wszelkie notatki, które podaliśmy w nagłówkach.

Krok 3.6: Zatrzymaj się, gdy dojdziesz do komórki „Messaging Arduino”. Zdefiniuj port szeregowy, którego komputer będzie używał do komunikacji z Arduino w zmiennej PORT_DEF. Można to znaleźć w Arduino IDE i przejść do Narzędzia> Port.

Więcej informacji można znaleźć tutaj.

Krok 3.8: Otwórz ponownie Arduino IDE. W miejscach, w których dokonałeś zmian w ikonach, zanotuj literę obok wartości tablicy, ale NIE zmieniaj jej. W poniższym przykładzie jest to „g”.

// usuwanie śmieciconst unsigned char g[1][32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf7, 0xf7, 0xfb, 0xff, 0xfe, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0x, 0xff, 0x2f, 0x27, 0xc3, 0x03, 0xc3, 0x27, 0x2f, 0xff, 0xef, 0xdf, 0xbf, 0xff, 0xff, };

Krok 3.7: (Powrót do komórki „Messaging Arduino” w Notatniku) Zmień etykiety w słowniku self.sounds, aby pasowały do etykiet użytych do nagrywania próbek, upewniając się, że każda etykieta odpowiada pojedynczej literze zanotowanej w poprzednim krok. „Nagrywanie” i „Słuchanie” są częścią podstawowych funkcji systemu i nie powinny być zmieniane. NIE zmieniaj drugiej litery, chyba że czujesz się pewnie, wprowadzając również kilka dodatkowych zmian w kodzie Arduino, ponieważ w przeciwnym razie zakłóci to komunikację z Arduino/matrycą.

Krok 3.8: Uruchom główną funkcję! Kod pobierze dane szkoleniowe, wyodrębni ich kluczowe funkcje, wprowadzi je do potoku, zbuduje model klasyfikacji, a następnie zacznie nasłuchiwać zdarzeń dźwiękowych. Kiedy wykryje jeden, zobaczysz, że macierz zamienia się w symbol nagrywania (kwadrat z kołem w środku), który podzieli te dane i wprowadzi je do modelu. Cokolwiek przewiduje model, pojawi się kilka sekund później na wyświetlaczu matrycy.

Możesz śledzić dane wyjściowe komórki poniżej. Zobacz, jak dokładne możesz to uzyskać!

Krok 4: Tworzenie obudowy LEGO

Tworzenie obudowy LEGO
Tworzenie obudowy LEGO
Tworzenie obudowy LEGO
Tworzenie obudowy LEGO
Tworzenie obudowy LEGO
Tworzenie obudowy LEGO

To fajna część! Wykonałeś wszystkie poważne kroki uczenia maszynowego i uruchomiłeś cały kompleksowy system, a teraz możesz grać z LEGO w nagrodę. Nie ma tutaj zbyt wiele do omówienia. Po prostu dodaliśmy bloki, które nam się podobały tu i tam, nie martwiąc się zbytnio o ogólny projekt, i ostatecznie byliśmy zadowoleni z tego, jak się okazało.

Pozwól, aby nasze zdjęcia posłużyły jako inspiracja dla Twojej własnej kreatywnej obudowy unikalnej dla Twojej kuchni. Umieściliśmy Arduino i większość okablowania w wydrążonej obudowie, a następnie zabezpieczyliśmy wyświetlacz matrycowy powyżej nawisami. Dodaliśmy trochę papieru nad wyświetlaczem, aby nieco rozproszyć światło, co naszym zdaniem sprawiło, że ikony były wyraźniejsze.

Zalecana: