Innehållsförteckning:

Custom Kitchen Sound Identifier: 4 steg
Custom Kitchen Sound Identifier: 4 steg

Video: Custom Kitchen Sound Identifier: 4 steg

Video: Custom Kitchen Sound Identifier: 4 steg
Video: Every Single Filament Part 4: CURSED FILAMENT! 2024, November
Anonim
Image
Image
Custom Kitchen Sound Identifier
Custom Kitchen Sound Identifier

För vårt sista projekt i en interaktiv systemkurs i våras skapade vi ett system i realtid för att identifiera och visualisera vanliga ljud i köket med hjälp av Support-Vector Machine-klassificering. Systemet består av en bärbar dator för ljudprovtagning/klassificering och en Arduino/dot -matrisdisplay för visualisering. Följande är en guide för att skapa din egen version av detta system för ljud från ditt eget kök.

Vårt ursprungliga användningsfall var som en enhet för köket för en döv och hörselskadad person, men detta system kunde teoretiskt anpassas för att identifiera en uppsättning ljud i en mängd olika sammanhang. Köket var en idealisk plats att börja, eftersom det tenderar att vara relativt tyst och innehåller en rimlig mängd enkla, distinkta ljud.

Ett GitHub -arkiv för detta projekt finns här.

Tillbehör

  • Arduino Leonardo mikrokontroller med sidhuvuden
  • KEYESTUDIO 16x16 Dot Matrix LED Display för Arduino
  • Brödbräda bygel tråd
  • Micro-USB till USB 2.0-kabel
  • En bärbar dator med Jupyter Notebook (Anaconda -installation)

    En nybörjarguide till Jupyter Notebook finns här

  • En betydande mängd felaktiga LEGO -klossar för systemets hölje

    (Men du kan verkligen ersätta dessa med alla byggmaterial som du vill ha!)

Steg 1: Samla köksljudprover

Samla in ljudprover i köket
Samla in ljudprover i köket

Figur ovan: Ljuddata från inspelning av en gaffel och kniv som klirrar ihop med denna insamlingsprocess

För att identifiera ljud i realtid måste vi förse vår maskininlärningsmodell med kvalitetsexempel för jämförelse. Vi skapade en Jupyter -anteckningsbok för denna process, som kan nås här eller genom vårt projekts GitHub -förvar. Förvaret innehåller också provsamlingar från två olika kök för teständamål.

Steg 1.1: Kopiera CollectSamples.ipynb -anteckningsboken till din fungerande Jupyter Notebook -katalog och öppna den.

Steg 1.2: Kör varje cell en efter en, var uppmärksam på alla anteckningar vi har angett i rubrikerna. Stanna när du når en med titeln "Provinspelning".

OBS: Flera Python -bibliotek används i den här anteckningsboken, och var och en kräver installation innan de kan importeras till projektet. Du är välkommen att göra detta manuellt, men en guide för biblioteksinstallation i Jupyter Notebook finns här.

Steg 1.3: Skapa en tom katalog för att lagra dina prover i din arbetskatalog för detta projekt.

Steg 1.4: Redigera variabeln SAMPLES_LOCATION i cellen "Provinspelning" så att den matchar din tomma katalogs plats.

Steg 1.5: Lägg till eller ta bort så många ljud som du vill i variabeln SOUND_LABELS.

För att provinspelningskoden ska fungera måste varje rad i denna variabel separeras med ett komma och med följande form:

'ts': Ljud ("TargetedSound", "ts")

Steg 1.6: När alla etiketter har lagts till, utvärderar cellen "Provinspelning" med provsamlingsprocessen. I cellens utdata uppmanas du att mata in den korta koden som du associerade till varje ljud i etiketterna (dvs "ts" för TargetedSound). Gör inte det här ännu.

Steg 1.7: Ta in din bärbara dator i köket och placera den i det område som du med största sannolikhet skulle placera det färdiga systemet. Denna plats bör vara central för bra ljudinsamling och torr och bort från eventuella spill för att skydda din elektronik.

Steg 1.8: Förbered ditt första riktade ljud. Om det här är en ugnstimersignal kan du ställa in timern på en minut och vänta tills den räknas ner till 20 sekunder eller så innan du fortsätter till nästa steg.

Steg 1.9: Skriv in etikettkoden i prompten (dvs. "ts") och tryck på Enter/Return.

Systemet kommer att börja lyssna på en ljudhändelse som skiljer sig från omgivande buller i rummet. När den här ljudhändelsen känns av börjar den spela in tills det känner att ljudet i rummet har återgått till omgivningsnivåerna. Det sparar sedan ljudet som en 16-bitars WAV-fil i katalogen som identifieras i SAMPLES_LOCATION i formatet:

TargetedSound _#_ capture.wav

# -Delen av detta filnamn motsvarar antalet samplingar av det riktade ljudet du har samlat in. När WAV -filen har sparats kommer uppmaningen att upprepas, så att du kan samla flera samplingar av samma ljud i en enda körning av cellen.

Ändra INTE detta filnamn. Det är viktigt för nästa steg.

Steg 1.10: Upprepa steg 1.8 och 1.9 tills du har samlat 5-10 samplingar av varje ljud.

Steg 1.11: Mata in "x" när du är klar för att avsluta körningen.

VARNING: Underlåtenhet att avsluta cellen på detta sätt kan orsaka att notebook -datorn kraschar. I det här fallet måste notebook -kärnan återställas och varje cell körs igen uppifrån.

Steg 1.11 (valfritt): Kontrollera WAV -data för enskilda filer i cellen "Quick Sound Visualization" för att se till att du har fångat all önskad information.

Några tips:

  • Spela in när ditt kök är tyst.
  • Spela bara in ett ljud samtidigt. Systemet kan inte skilja på överlappning i ljud.
  • Försök att göra varje ljudprovning så konsekvent som möjligt. Detta hjälper till att identifieringen är korrekt.
  • Omvärdering av inspelningscellen kommer att återställa # -värdet i filnamnet och skriva över alla befintliga filer som matchar det #. Vi tyckte att det var lättast att spela in alla samplingar av ett ljud på en gång och sedan stoppa inspelningscellen.
  • Om systemet inte tar upp ditt riktade ljud, försök att sänka THRESHOLD -värdet (ställ in på 30 för att starta) och omvärdera cellen.
  • Om inspelningen utlöses av andra ljud utanför den riktade, försök höja THRESHOLD -värdet (ställ in på 30 för att starta) och omvärdera cellen.

Steg 2: Förbereda Arduino/Matrix Display

Förbereda Arduino/Matrix Display
Förbereda Arduino/Matrix Display
Förbereda Arduino/Matrix Display
Förbereda Arduino/Matrix Display
Förbereda Arduino/Matrix Display
Förbereda Arduino/Matrix Display

Därefter ska vi konfigurera visualiseringssystemet med en Arduino Leonardo och KEYESTUDIO 16x16 LED -matrisdisplay. Detta för att mata ut klassificeringsmodellens förutsägelse av detekterade ljud. Som tidigare har vi tillhandahållit alla nödvändiga filer både här och i projektets GitHub -arkiv.

Steg 2.1: Anslut Arduino- och LED -matrisen enligt diagrammet ovan. KEYESTUDIO innehåller ledningar för att ansluta till deras prickmatris, men brödbrädans trådar behövs för att ansluta dessa trådar till Arduino

Steg 2.2: Öppna "arduino_listener.ino" med Ardunio IDE och ladda upp det till Leonardo. Om den är korrekt ansluten bör du se ikonen "lyssnar" (ser ut som Wi-Fi) som visas i bilden ovan.

Steg 2.3: Förbered de ikoner du vill visa för vart och ett av dina målljud. För att veta vilka lysdioder som ska tändas måste ikonen skickas från Arduino till matrisen som en byte -array. Till exempel skickas vår kaffekoppsikon (i bilden ovan) till matrisen i detta format:

{

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

Vi ritade våra ikoner med hjälp av onlineverktyget Dot2Pic, med 16 kolumner, 16 rader och "monokromatisk, 8 pixlar per byte, vertikal inställning" från rullgardinsmenyn. Våra finns i "sample_icon_bytes.txt" -matrisen.

OBS: Det kan också finnas onlineverktyg som kan göra detta automatiskt med uppladdade filer.

Steg 2.4: Rita varje ikon. När du är klar med att rita väljer du "Konvertera till matrisen".

Steg 2.5: Ersätt onödiga ikoner som definierats högst upp i koden "arduino_listening.ino". Var noga med att lägga till en kommentar som beskriver ikonen så att du kommer ihåg vilken som är vilken!

Steg 2.6: Ladda upp den nya koden till Arduino. Stäng inte filen ännu, vi behöver den för nästa steg.

Steg 3: Kör klassificeraren och identifiera ljud

Köra klassificeraren och identifiera ljud
Köra klassificeraren och identifiera ljud
Köra klassificeraren och identifiera ljud
Köra klassificeraren och identifiera ljud

Nu är det dags att sätta ihop systemet. Klassificeringsrörledningen, Arduino -kommunikation och live -ljudinspelning sker genom en enda Arduino -anteckningsbok, som har tillhandahållits här eller kan nås via vårt projekts GitHub -förvar.

Steg 3.1: Kopiera FullPipeline.ipynb -anteckningsboken till din fungerande Jupyter Notebook -katalog och öppna den.

Steg 3.2: Kör varje cell en efter en, var uppmärksam på alla anteckningar vi har angett i rubrikerna. Ingen effekt förväntas. Stanna när du når cellen "Ladda träningsdata".

Steg 3.3: Redigera variabeln SAMPLES_LOCATION_ROOT i cellen "Ladda träningsdata" till den överordnade katalogen för din tidigare provkatalogs plats. Ändra sedan variabeln SAMPLES_DIR_NAME till namnet på din katalog. Så om du hade ställt in platsen i CollectSamples.ipynb till:

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

Du skulle nu ställa in dessa variabler till:

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

Vi gjorde detta för att möjliggöra snabba ändringar av klassificeraren i fall av felaktigheter. Du kan växla mellan olika provsamlingar för att ställa in dina data.

Steg 3.4: Utvärdera cellen. Du bör se att varje samling har laddats in.

Steg 3.5: Fortsätt att köra varje cell en efter en, var uppmärksam på alla anteckningar vi har angett i rubrikerna.

Steg 3.6: Stanna när du når cellen "Messaging Arduino". Definiera den seriella porten som din dator ska använda för kommunikation med Arduino i variabeln PORT_DEF. Detta finns i Arduino IDE och går till Verktyg> Port.

Mer information hittar du här.

Steg 3.8: Öppna om din Arduino IDE. På platser där du gjorde ändringar i ikonerna, anteckna bokstaven bredvid matrisvärdet, men ändra INTE den. I exemplet nedan är detta "g".

// avfallshanteringskonst osignerad 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,};

Steg 3.7: (Återgår till cellen "Meddelande Arduino" i anteckningsboken) Ändra etiketterna i självljudsordlistan så att de matchar de etiketter du använde vid inspelningen av dina prover, se till att varje etikett motsvarar den enda bokstaven du noterade i föregående steg. "Inspelning" och "Lyssna" är båda en del av kärnfunktionen i systemet och bör inte ändras. Ändra INTE den andra bokstaven om du inte känner dig säker på att göra några extra ändringar i Arduino -koden också, eftersom det kommer att förstöra kommunikationen med Arduino/matrisen annars.

Steg 3.8: Kör huvudfunktionen! Koden tar tag i utbildningsdata, extraherar dess nyckelfunktioner, matar in dem i pipelinen, bygger en klassificeringsmodell och börjar sedan lyssna efter ljudhändelser. När den känner av en ser du matrisen byta till en inspelningssymbol (kvadrat med cirkel inuti) och den kommer att segmentera denna data och mata in den i modellen. Vad modellen än förutspår kommer att dyka upp några sekunder senare på matrisdisplayen.

Du kan följa med i cellens utmatning nedan. Se hur exakt du kan få det!

Steg 4: Skapa ett LEGO -hus

Skapa ett LEGO -hus
Skapa ett LEGO -hus
Skapa ett LEGO -hus
Skapa ett LEGO -hus
Skapa ett LEGO -hus
Skapa ett LEGO -hus

Det här är den roliga delen! Du har gjort alla seriösa maskininlärningssteg och fått igång hela systemet från början till slut, och nu får du leka med LEGO som belöning. Det finns inte mycket av en process för detaljer här. Vi har precis lagt till block som vi gillade här och där utan att oroa oss för mycket för den övergripande designen, och vi blev nöjda med hur det blev.

Låt våra bilder tjäna som inspiration för ditt eget kreativa boende unikt för ditt kök. Vi placerade Arduino och majoriteten av ledningarna i ett ihåligt hölje och säkrade sedan matrisdisplayen ovan med överhäng. Vi lade till lite papper över skärmen för att sprida ljuset något som vi kände gjorde ikonerna tydligare.

Rekommenderad: