Inhoudsopgave:

Aangepaste keukengeluidsidentificatie: 4 stappen
Aangepaste keukengeluidsidentificatie: 4 stappen

Video: Aangepaste keukengeluidsidentificatie: 4 stappen

Video: Aangepaste keukengeluidsidentificatie: 4 stappen
Video: Enzoknol Houdt Myron Voor De Gek🤣 #shorts 2024, November
Anonim
Image
Image
Aangepaste keukengeluidsidentificatie
Aangepaste keukengeluidsidentificatie

Voor ons afstudeerproject in een cursus interactieve systemen dit voorjaar hebben we een realtime systeem gemaakt voor het identificeren en visualiseren van veelvoorkomende geluiden in de keuken met behulp van Support-Vector Machine-classificatie. Het systeem bestaat uit een laptop voor audiosampling/classificatie en een Arduino/dot-matrixdisplay voor visualisatie. Hieronder volgt een handleiding voor het maken van uw eigen versie van dit systeem voor geluiden uit uw eigen keuken.

Ons oorspronkelijke gebruik was als een apparaat voor de keuken van een dove en slechthorende persoon, maar dit systeem zou theoretisch kunnen worden aangepast om een reeks geluiden in verschillende contexten te identificeren. De keuken was een ideale plek om te beginnen, omdat het relatief stil is en een redelijke hoeveelheid eenvoudige, duidelijke geluiden bevat.

Een GitHub-repository voor dit project is hier te vinden.

Benodigdheden

  • Arduino Leonardo Microcontroller met headers
  • KEYESTUDIO 16x16 Dot Matrix LED-display voor Arduino
  • Breadboard jumper draad
  • Micro-USB naar USB 2.0-kabel
  • Een laptop met Jupyter Notebook (Anaconda installatie)

    Een beginnershandleiding voor Jupyter Notebook vindt u hier

  • Een aanzienlijke hoeveelheid niet-overeenkomende LEGO-stenen voor de behuizing van het systeem

    (Maar je kunt deze echt vervangen door elk doe-het-zelf-bouwmateriaal dat je maar wilt!)

Stap 1: Het verzamelen van voorbeelden van keukengeluiden

Samples van keukengeluiden verzamelen
Samples van keukengeluiden verzamelen

Afbeelding hierboven: audiogegevens afkomstig van het opnemen van een vork en mes die aan elkaar rammelen met behulp van dit verzamelproces

Om realtime geluiden te identificeren, moeten we ons machine learning-model voorzien van kwaliteitsvoorbeelden ter vergelijking. We hebben voor dit proces een Jupyter-notebook gemaakt, dat hier of via de GitHub-repository van ons project kan worden geopend. De repository bevat ook monstercollecties van twee verschillende keukens voor testdoeleinden.

Stap 1.1: Kopieer het CollectSamples.ipynb-notitieblok naar uw werkende Jupyter Notebook-map en open het.

Stap 1.2: Voer elke cel één voor één uit en let op eventuele opmerkingen die we in de kopjes hebben gegeven. Stop wanneer u er een bereikt met de titel "Voorbeeldopname".

OPMERKING: In dit notebook worden verschillende Python-bibliotheken gebruikt en elke bibliotheken moet worden geïnstalleerd voordat ze met succes in het project kunnen worden geïmporteerd. U kunt dit handmatig doen, hoewel u hier een handleiding voor bibliotheekinstallatie in Jupyter Notebook kunt vinden.

Stap 1.3: Maak een lege map om uw voorbeelden op te slaan in uw werkmap voor dit project.

Stap 1.4: Bewerk de SAMPLES_LOCATION-variabele in de cel "Voorbeeldopname" zodat deze overeenkomt met de locatie van uw lege map.

Stap 1.5: Voeg zoveel geluiden toe of verwijder ze als je wilt aan de SOUND_LABELS variabele.

Om de voorbeeldregistratiecode te laten werken, moet elke regel van deze variabele worden gescheiden door een komma en moet de volgende vorm hebben:

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

Stap 1.6: Wanneer alle labels zijn toegevoegd, evalueert u de cel "Sample Recording" en start u het monsterverzamelingsproces. In de uitvoer van de cel wordt u gevraagd de korte code in te voeren die u aan elk geluid in de labels hebt gekoppeld (d.w.z. "ts" voor TargetedSound). Doe dit nog niet.

Stap 1.7: Neem uw laptop mee naar de keuken en plaats deze in de ruimte waar u het voltooide systeem waarschijnlijk zou plaatsen. Deze locatie moet centraal staan voor een goede audioverzameling, en droog en uit de buurt van eventueel gemorst materiaal om uw elektronica te beschermen.

Stap 1.8: Bereid je eerste gerichte geluid voor. Als dit een pieptoon van de oventimer is, kunt u de timer instellen op één minuut en wachten tot deze is afgeteld tot ongeveer 20 seconden voordat u doorgaat met de volgende stap.

Stap 1.9: Typ de labelcode in de prompt (d.w.z. "ts") en druk op Enter/Return.

Het systeem begint te luisteren naar een geluidsgebeurtenis die verschilt van het omgevingsgeluid van de kamer. Bij het detecteren van deze geluidsgebeurtenis, begint het met opnemen totdat het voelt dat het geluid in de kamer is teruggekeerd naar het omgevingsniveau. Het zal dan de audio opslaan als een 16-bits WAV-bestand in de map die is geïdentificeerd in SAMPLES_LOCATION in het formaat:

TargetedSound_#_captured.wav

Het #-gedeelte van deze bestandsnaam komt overeen met het aantal samples van het beoogde geluid dat u hebt verzameld. Nadat het WAV-bestand is opgeslagen, wordt de prompt herhaald, zodat u meerdere samples van hetzelfde geluid kunt verzamelen in een enkele uitvoering van de cel.

Verander deze bestandsnaam NIET. Het is belangrijk voor de volgende stap.

Stap 1.10: Herhaal stap 1.8 en 1.9 totdat je 5-10 samples van elk geluid hebt verzameld.

Stap 1.11: Voer "x" in wanneer u klaar bent om de uitvoering af te sluiten.

WAARSCHUWING: Als u de cel niet op deze manier afsluit, kan de notebook crashen. In dit geval moet de Notebook-kernel opnieuw worden ingesteld en moet elke cel opnieuw vanaf de bovenkant worden uitgevoerd.

Stap 1.11 (Optioneel): Controleer de WAV-gegevens van afzonderlijke bestanden in de cel "Quick Sound Visualization" om er zeker van te zijn dat u alle gewenste informatie hebt vastgelegd.

Wat tips:

  • Neem op wanneer uw keuken stil is.
  • Neem slechts één geluid tegelijk op. Het systeem kan geen overlap in geluiden onderscheiden.
  • Probeer elke geluidsproef zo consistent mogelijk te maken. Dit komt de nauwkeurigheid van de identificatie ten goede.
  • Als u de opnamecel opnieuw evalueert, wordt de #-waarde in de bestandsnaam opnieuw ingesteld en worden alle bestaande bestanden die overeenkomen met die # overschreven. We vonden het het gemakkelijkst om alle samples van één geluid tegelijk op te nemen en vervolgens de opnamecel te stoppen.
  • Als het systeem uw doelgeluid niet oppikt, probeer dan de THRESHOLD-waarde te verlagen (ingesteld op 30 om te starten) en evalueer de cel opnieuw.
  • Als de opname wordt geactiveerd door andere geluiden buiten het beoogde geluid, probeer dan de THRESHOLD-waarde te verhogen (ingesteld op 30 om te starten) en evalueer de cel opnieuw.

Stap 2: Het Arduino/Matrix-display voorbereiden

Het Arduino/Matrix-display voorbereiden
Het Arduino/Matrix-display voorbereiden
Het Arduino/Matrix-display voorbereiden
Het Arduino/Matrix-display voorbereiden
Het Arduino/Matrix-display voorbereiden
Het Arduino/Matrix-display voorbereiden

Vervolgens gaan we het visualisatiesysteem opzetten met behulp van een Arduino Leonardo en KEYESTUDIO 16x16 LED dot matrix-display. Dit is om de voorspelling van gedetecteerde geluiden door het classificatiemodel uit te voeren. Zoals eerder hebben we alle vereiste bestanden zowel hier als in de GitHub-repository van het project geleverd.

Stap 2.1: Sluit de Arduino en LED-matrix aan volgens het bovenstaande diagram. KEYESTUDIO bevat draden om verbinding te maken met hun dot-matrix, maar er zijn breadboard-jumperdraden nodig om deze draden op de Arduino aan te sluiten

Stap 2.2: Open "arduino_listener.ino" met behulp van de Ardunio IDE en upload het naar de Leonardo. Als de bedrading correct is, zou u het pictogram "luisteren" moeten zien (lijkt op wifi) zoals weergegeven in de bovenstaande afbeelding.

Stap 2.3: Bereid de pictogrammen voor die u wilt weergeven voor elk van uw doelgeluiden. Om te weten welke LED's moeten branden, moet het pictogram als een bytearray van de Arduino naar de matrix worden verzonden. Ons koffiekopje-pictogram (in afbeelding hierboven) wordt bijvoorbeeld in dit formaat naar de matrix gestuurd:

{

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

We hebben onze pictogrammen getekend met behulp van de online tool Dot2Pic, met 16 kolommen, 16 rijen en "monochromatisch, 8 pixels per byte, verticale instelling" geselecteerd in het vervolgkeuzemenu. Die van ons is te vinden in de array "sample_icon_bytes.txt".

OPMERKING: Er kunnen ook online tools zijn die dit automatisch kunnen doen met geüploade bestanden.

Stap 2.4: Teken elk pictogram. Wanneer u klaar bent met tekenen, selecteert u "Converteren naar de array".

Stap 2.5: Vervang naar wens onnodige pictogrammen die bovenaan de code "arduino_listening.ino" zijn gedefinieerd. Zorg ervoor dat u een opmerking toevoegt die het pictogram beschrijft, zodat u onthoudt welke welke is!

Stap 2.6: Upload de nieuwe code naar de Arduino. Sluit het bestand nog niet, we hebben het nodig voor de volgende stap.

Stap 3: De classificatie uitvoeren en geluiden identificeren

De classificatie uitvoeren en geluiden identificeren
De classificatie uitvoeren en geluiden identificeren
De classificatie uitvoeren en geluiden identificeren
De classificatie uitvoeren en geluiden identificeren

Nu is het tijd om het systeem in elkaar te zetten. De classificatiepijplijn, Arduino-communicatie en live audio-opname worden allemaal gedaan via een enkele Arduino-notebook, die hier is geleverd of toegankelijk is via de GitHub-repository van ons project.

Stap 3.1: Kopieer het FullPipeline.ipynb-notebook naar uw werkende Jupyter Notebook-directory en open het.

Stap 3.2: Voer elke cel één voor één uit en let op eventuele opmerkingen die we in de kopjes hebben gegeven. Er wordt geen output verwacht. Stop wanneer u de cel met de titel "Laad de trainingsgegevens" bereikt.

Stap 3.3: Bewerk de SAMPLES_LOCATION_ROOT-variabele in de cel "Laad de trainingsgegevens" naar de bovenliggende map van de locatie van uw eerdere voorbeeldmap. Wijzig vervolgens de SAMPLES_DIR_NAME variabele in de naam van uw directory. Dus als je de locatie in CollectSamples.ipynb had ingesteld op:

SAMPLES_LOCATION = "/Gebruikers/xxxx/Documenten/KitchenSoundClassifier/MijnSamples/Nieuwe map"

U zou deze variabelen nu instellen op:

SAMPLES_LOCATION_ROOT = "/Users/xxxx/Documents/KitchenSoundClassifier/MySamples/"SAMPLES_DIR_NAME = "Nieuwe map"

Dit hebben we gedaan om snelle wijzigingen in de classificatie mogelijk te maken in geval van onnauwkeurigheid. U kunt schakelen tussen verschillende voorbeeldverzamelingen om uw gegevens af te stemmen.

Stap 3.4: Evalueer de cel. U zou elke verzameling met succes moeten zien geladen.

Stap 3.5: Ga door met het één voor één uitvoeren van elke cel, let op eventuele opmerkingen die we in de kopjes hebben gegeven.

Stap 3.6: Stop wanneer u de cel "Messaging Arduino" bereikt. Definieer de seriële poort die uw computer zal gebruiken voor communicatie met de Arduino in de PORT_DEF variabele. Dit is te vinden in de Arduino IDE en ga naar Tools> Port.

Meer informatie vindt u hier.

Stap 3.8: Open uw Arduino IDE opnieuw. Op plaatsen waar u wijzigingen aan de pictogrammen hebt aangebracht, noteert u de letter naast de matrixwaarde, maar wijzigt u deze NIET. In het onderstaande voorbeeld is dit "g".

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

Stap 3.7: (Terugkeren naar de "Messaging Arduino"-cel van de notebook) Wijzig de labels in het self.sounds-woordenboek zodat ze overeenkomen met de labels die u hebt gebruikt bij het opnemen van uw samples, en zorg ervoor dat elk label overeenkomt met de enkele letter die u in de vorige hebt genoteerd stap. "Opnemen" en "Luisteren" maken beide deel uit van de kernfunctionaliteit van het systeem en mogen niet worden gewijzigd. Verander de tweede letter NIET, tenzij je er zeker van bent dat je ook een paar extra wijzigingen in de Arduino-code aanbrengt, omdat dit anders de communicatie met de Arduino/matrix zal verpesten.

Stap 3.8: Voer de hoofdfunctie uit! De code pakt de trainingsgegevens, extraheert de belangrijkste functies, voert ze in de pijplijn, bouwt een classificatiemodel en begint vervolgens te luisteren naar geluidsgebeurtenissen. Wanneer het er een detecteert, ziet u de matrix veranderen in een opnamesymbool (vierkant met cirkel erin) en het zal deze gegevens segmenteren en in het model invoeren. Wat het model ook voorspelt, verschijnt een paar seconden later op het matrixdisplay.

U kunt de uitvoer van de cel hieronder volgen. Kijk hoe nauwkeurig je het kunt krijgen!

Stap 4: Een LEGO-behuizing maken

Een LEGO-behuizing maken
Een LEGO-behuizing maken
Een LEGO-behuizing maken
Een LEGO-behuizing maken
Een LEGO-behuizing maken
Een LEGO-behuizing maken

Dit is het leuke gedeelte! Je hebt alle serieuze machine learning-stappen gedaan en het hele end-to-end-systeem in gebruik genomen, en nu mag je als beloning met LEGO's spelen. Er is niet veel van een proces om hier in detail te treden. We hebben gewoon blokken toegevoegd die we hier en daar leuk vonden zonder ons al te veel zorgen te maken over het algehele ontwerp, en we waren uiteindelijk blij met de manier waarop het bleek.

Laat onze foto's dienen als inspiratie voor uw eigen creatieve huisvesting die uniek is voor uw keuken. We plaatsten de Arduino en het grootste deel van de bedrading in een holle behuizing en bevestigden vervolgens het matrixdisplay erboven met uitsteeksels. We hebben een beetje papier over het scherm toegevoegd om het licht een beetje te verspreiden, waardoor de pictogrammen duidelijker werden.

Aanbevolen: