Eenvoudige spraakherkenning met Edge Impulse

Keyword spotting (KWS) is een vorm van spraakherkenning dat specifieke vooraf gedefinieerde woorden of wake-up zinnen (zoals ‘Hé Google’) kan herkennen in een geluidsopname door een microcomputer zonder dat een volledige vertaling hiervoor nodig is. Het is een laagdrempelige ‘altijd-aan-uit’ techniek om iets aan te sturen via stemassistentie zoals in een kleine robot en draagbare apparaatjes die hiervoor weinig programmatuur vereisen maar met korte uitgesproken ‘bevelen’ zijn te bedienen.

Edge Impulse is een software-tool om op een gemakkelijke en snelle manier spraak kernwoorden aan te leren. Door een gesproken woord op te nemen en dit herhaaldelijk opnieuw uit te spreken zal het programma met behulp van machine learning technieken, dit na deze trainingsperiode automatisch herkennen en een resultaat-signaal geven. Hiermee kan men dan een verdere actie ondernemen.


Keyword spotting met Edge Impulse: Verzamelen, trainen en implementeren

Keyword spotting met Edge Impulse: Verzamelen, trainen en implementeren
Keyword spotting met Edge Impulse: Verzamelen, trainen en implementeren

We kennen allemaal de spraakopdrachten voor slimme apparaten, zoals “Alexa”, “Hey Siri” of “OK Google”. Maar hoe werkt dit eigenlijk? Dit proces heet keyword spotting of audioclassificatie en is een machine learning-techniek die hoorbare gebeurtenissen, met name spraak, kan herkennen, zelfs in de aanwezigheid van achtergrondgeluid of omgevingsgeluid.

Keyword Spotting

Laten we leren hoe je een model maakt voor het herkennen van sleutelwoorden met Edge Impulse. We verzamelen audiogegevens via microfoons, gebruiken signaalbewerking om de belangrijkste info eruit te halen, en trainen een diep neuraal netwerk dat kan herkennen of je sleutelwoord in een bepaald geluidsfragment gehoord is. Uiteindelijk zetten we het systeem op een embedded apparaat en kijken we hoe goed het werkt. Aan het einde van deze tutorial weet u hoe u audio kunt classificeren met Edge Impulse.

Er is ook een video-versie van deze tutorial . U kunt het eindproject bekijken, inclusief alle data, signaalverwerking en machine learning blokken, bij .

Voorwaarden

Voor deze tutorial hebt u een ondersteund apparaat en de Edge Impulse CLI nodig. Als uw apparaat zichtbaar is onder Devices in Edge Impulse Studio, zoals te zien in Figuur 1, kunt u doorgaan.

Devices tab with the device connected to the remote management interface.
Figuur 1. Devices tabblad met het apparaat verbonden met de remote management interface.

Je eerste data verzamelen

Uw eerste taak is om een goed sleutelwoord te bedenken. Dat kan uw naam zijn, een actie of zelfs een grom, het is uw feestje. Let erop dat sommige sleutelwoorden moeilijker te onderscheiden zijn dan andere, en vooral sleutelwoorden met maar één lettergreep (zoals “one”) kunnen tot valse positieven leiden (bijvoorbeeld als u “gone” zegt). Daarom gebruiken Apple, Google en Amazon allemaal minstens drielettergrepige sleutelwoorden (“Hey Siri”, “OK Google”, “Alexa”). Een goede optie is “Hello world”.

Om uw eerste data in Edge Impulse te verzamelen, ga naar Data acquisition, stel uw sleutelwoord in als label, samplelengte op 10 seconden, de sensor op microphone, en de frequentie op 16 kHz (Figuur 2). Klik dan op Start sampling en blijf uw sleutelwoord herhalen (met even pauze).

Figure 2: Recording your keyword from Edge Impulse Studio
Figuur 2. Opnemen van je sleutelwoord vanuit Edge Impulse Studio.

Let op: Data verzamelen via een ontwikkelboard kan langzaam gaan; u kunt uw mobiele telefoon als sensor gebruiken, dat gaat veel sneller.

Daarna hebt u een sample zoals in Figuur 3, waarop u uw sleutelwoorden ziet, gescheiden door wat ruis.

Figure 3: 10 seconds of “Hello world” data
Figuur 3. 10 seconden “Hello world” data.

Deze data is nog niet geschikt voor machine learning. U moet de stukjes eruit knippen waar u het sleutelwoord zegt. Dit is belangrijk, want u wilt alleen het daadwerkelijke sleutelwoord labelen, niet per ongeluk ruis of onvolledige zinnen (zoals alleen “hello”). Gelukkig kan Edge Impulse Studio dit voor u doen. Klik op de drie puntjes (⋮) naast uw sample en kies Split sample.

Hebt u een kort sleutelwoord, zet dan Shift samples aan om de sample willekeurig in het venster te schuiven, en klik op Split. Nu hebt u losse samples van één seconde in uw dataset, zoals te zien in Figuur 4. Perfect!

Figure 4: Split sample automatically cuts out the interesting parts of an audio file.
Figuur 4. Split sample knipt automatisch de interessante stukken uit een audiobestand.

Je dataset maken

Nu u weet hoe u data verzamelt, kunt u nadenken over andere data die nodig is. Naast uw sleutelwoord hebt u ook audio nodig die niet uw sleutelwoord is, zoals achtergrondgeluid, een tv die aanstaat (noise-klasse), en mensen die andere woorden zeggen (unknown-klasse). Dit is belangrijk, want een machine learning model weet niet wat goed of fout is (tenzij dat uw sleutelwoorden zijn), het leert alleen van de data die u toevoegt. Hoe meer variatie in uw data, hoe beter het model werkt.

Voor elk van deze drie klassen (uw sleutelwoordnoise en unknown) wilt u ongeveer evenveel data verzamelen (gebalanceerde datasets werken beter), en voor een goed sleutelwoordmodel wilt u minstens 10 minuten per klasse (maar hoe meer, hoe beter).

Dus, verzamel 10 minuten aan samples, net als hierboven. De snelste manier is waarschijnlijk via uw telefoon: neem één minuut op, split daarna automatisch. Zorg dat u verschillende versies van het sleutelwoord hebt: laat familie en collega’s meedoen, neem hoge en lage stemmen op, en snelle en langzame sprekers.

Voor de noise en unknown datasets kunt u dit zelf opnemen, of u kunt uw leven makkelijker maken door onze dataset met allerlei achtergrondgeluiden en willekeurige woorden te gebruiken, die we hier voor u hebben gemaakt .

Figure 5: Importing the noise and unknown data into your project
Figuur 5. Het importeren van noise en unknown data in je project.

Om deze data te importeren, ga naar Data acquisition, klik op het Upload-icoontje, en kies wat noise of unknown samples (er zijn 25 minuten per klasse, maar u kunt ook minder kiezen), en klik op Begin upload, zoals te zien in Figuur 5. De data wordt automatisch gelabeld en aan uw project toegevoegd.

Je dataset opnieuw balanceren

Hebt u alle trainingsdata verzameld via de Collect data widget, dan staan al uw sleutelwoorden in de Training dataset. Dat is niet handig, want u wilt 20% van uw data apart houden om uw machine learning model te valideren. Ga hiervoor naar het Dashboard en kies Perform train/test split. Dan wordt uw data automatisch gesplitst tussen training (80%) en testen (20%). Daarna ziet u iets als in Figuur 6 en Figuur 7.

Training and testing data
Figuur 6. Trainingsdata met een gelijke verdeling over de drie klassen.
Figuur 7. Testdata, ook met een gelijke verdeling over de drie klassen.

Je impulse ontwerpen

Met de dataset klaar, kunt u een impulse ontwerpen. Een impulse neemt de ruwe data, splitst deze in kleinere delen, gebruikt signaalverwerking om kenmerken eruit te halen, en gebruikt dan een leermodule om nieuwe data te classificeren. Signaalverwerking geeft altijd dezelfde uitkomst voor dezelfde input, en maakt ruwe data makkelijker om te verwerken, terwijl leermodules leren van eerdere ervaringen.

Voor deze tutorial gebruiken we het MFCC signaalverwerkingsblok. MFCC staat voor Mel-frequency cepstral coefficients. Dat klinkt ingewikkeld, maar het is eigenlijk gewoon een manier om ruwe audio, waar veel overbodige informatie in zit, om te zetten naar iets wat eenvoudiger te gebruiken is. Edge Impulse heeft veel andere audioblokken, zoals MFE en Spectrogram voor niet-spraak audio, maar het MFCC blok werkt goed voor spraak.

We sturen die simpele audio daarna naar een Neural Network blok, dat leert om het verschil tussen de drie klassen te herkennen.

In Studio, ga naar het tabblad Create impulse, voeg Audio (MFCC) en Classification blokken toe (Figuur 8). Laat de venstergrootte op 1 seconde (dat is de lengte van de audio in onze dataset) en klik op Save Impulse.

Figure 8: An impulse to classify human speech.
Figuur 8. Een impulse om menselijke spraak te classificeren.

Het MFCC blok instellen

Nu hebben we alle onderdelen en kunt u elk stuk apart instellen. Klik op het MFCC tabblad links in het menu. U ziet een pagina zoals Figuur 9.

Figure 9: MFCC block looking at an audio file
Figuur 9. MFCC blok bekijkt een audiobestand.

Op deze pagina stelt u het MFCC blok in, en kunt u zien hoe de data wordt omgezet. Rechts ziet u een visualisatie van de MFCC-output voor een stukje audio, dat heet een spectrogram. Een MFCC spectrogram is speciaal afgestemd op spraak (Edge Impulse heeft ook gewone spectrogrammen als u dat wilt).

In het spectrogram staat de verticale as voor de frequenties (hoeveel banden ziet u via het Number of coefficients veld, probeer maar!), en de horizontale as is tijd (via frame stride en frame length). De patronen die u ziet bevatten info over het type geluid. Bijvoorbeeld, het spectrogram in Figuur 10 laat “Hello world” zien, en Figuur 11 laat “On” zien. Deze verschillen zijn voor mensen lastig te omschrijven, maar voor een neuraal netwerk genoeg om het te leren herkennen.

MFCC Spectrograms
Figuur 10. MFCC spectrogram voor “Hello world”. Figuur 11. MFCC spectrogram voor “On”.

Het is leuk om uw data te bekijken en te zien wat voor spectrogrammen u krijgt. U kunt via het dropdown menu rechtsboven verschillende audiovoorbeelden kiezen om te visualiseren of met parameters spelen om te zien wat er verandert.

Ook ziet u onder het spectrogram de prestatie van het MFCC blok op uw microcontroller (Figuur 12). Dit is de tijd die een low-power microcontroller nodig heeft om een sample te analyseren.

Figure 12: On-device performance is updated automatically when you change parameters.
Figuur 12. De prestatie op het apparaat wordt automatisch bijgewerkt als je instellingen wijzigt.

U denkt misschien dat u daardoor maar twee of drie delen per seconde kunt classificeren, maar we bouwen het spectrogram continu op (want het heeft een tijdcomponent). Dat kost minder tijd, en u kunt dus vijf à zes keer per seconde luisteren naar gebeurtenissen, zelfs op een 40 MHz processor. Dit werkt al op alle volledig ondersteunde ontwikkelboards, en is makkelijk zelf te implementeren op uw eigen apparaat.

Kenmerken genereren

De spectrogrammen die het MFCC blok maakt, worden doorgestuurd naar een neuraal netwerk-architectuur die goed is in het herkennen van patronen in zulke gegevens. Voordat we ons netwerk trainen, moeten we MFCC blokken genereren voor alle audio-delen. Klik daarvoor op het tabblad Generate features bovenaan, en dan op de paarse Generate features knop. Dit duurt een minuutje.

Daarna krijgt u een van de handigste functies in Edge Impulse: de Feature explorer (Figuur 13). Dit is een 2D-weergave van uw hele dataset, elk item heeft een kleur voor het label. U kunt inzoomen, rare uitschieters vinden (die in de verkeerde cluster zitten), en op items klikken om de sample te beluisteren. Zo kunt u controleren of uw dataset rare dingen bevat en of hij goed is voor machine learning (alles netjes gescheiden).

The feature explorer showing “Hello world”
Figuur 13. De feature explorer toont “Hello world” (blauw) tegenover “unknown” (groen) data.
Goede scheiding, dus de dataset is in orde.

Het neurale netwerk instellen

Nu alles verwerkt is, is het tijd om een neuraal netwerk te trainen. Neurale netwerken zijn algoritmes, een beetje gebaseerd op het menselijk brein, die patronen leren uit de trainingsdata. Het netwerk dat we trainen, krijgt het MFCC spectrogram als input en probeert te raden tot welke van de drie klassen het hoort: uw sleutelwoordnoise of unknown. Klik op Classifier links in het menu. U ziet dan iets als Figuur 14.

Figure 14: Neural network configuration.
Figuur 14. Configuratie van het neurale netwerk.

Een neuraal netwerk bestaat uit lagen virtuele “neuronen”, die u aan de linkerkant van de Classifier pagina ziet. Een input, bij ons dus een MFCC spectrogram, gaat de eerste laag in, die filtert en transformeert het volgens zijn interne staat. Die output gaat naar de volgende laag, enzovoorts, totdat uiteindelijk drie getallen overblijven: de kans dat het om uw sleutelwoordnoise of unknown gaat.

Tijdens het trainen wordt de interne staat van de neuronen aangepast zodat het netwerk de juiste output geeft. Dit werkt door trainingsdata te voeren, het resultaat te controleren, en het netwerk bij te stellen. Na duizenden keren trainen is uw netwerk klaar.

Een bepaalde indeling van lagen noemt men een architectuur. Verschillende architecturen zijn handig voor verschillende taken. De standaard architectuur van Edge Impulse werkt goed voor dit project, maar u kunt ook uw eigen architectuur instellen. U kunt zelfs custom neural network code schrijven met tools als TensorFlow of Keras (klik op de drie puntjes bovenaan de pagina).

Voor het trainen moet u een paar dingen aanpassen. Zet de Minimum confidence rating (op de Model testing pagina) op 0.6. Dat betekent dat het neuraal netwerk alleen voorspellingen doet als de kans boven 0.6 ligt (dus niet bij bijvoorbeeld 0.5).

Schakel ook Data augmentation in. Dan worden uw data tijdens het trainen telkens een beetje aangepast, bijvoorbeeld door ruis toe te voegen, tijd- of frequentiebanden weg te halen, of het tijdspad te vervormen. Zo werkt uw model beter in de praktijk en voorkomt u dat het te goed wordt op de trainingsdata (overfitting).

Nu alles goed staat, klikt u op Start training. U ziet veel tekst verschijnen bij Training output, dat mag u negeren. Het trainen duurt een paar minuten. Is het klaar, dan verschijnt Last training performance onderaan de pagina, zoals te zien in Figuur 15.

Figure 15: A trained machine learning model that can distinguish keywords!
Figuur 15. Een getraind machine learning model dat sleutelwoorden kan onderscheiden!

Gefeliciteerd, u hebt een neuraal netwerk getraind met Edge Impulse! Maar wat betekenen al die cijfers?

Aan het begin van het trainen wordt 20% van de trainingsdata apart gehouden voor validatie. Dat betekent dat deze data niet wordt gebruikt om het model te trainen, maar om te controleren hoe goed het model werkt. In het Last training performance paneel ziet u belangrijke info over uw model. Uw getallen kunnen verschillen van die in deze tutorial.

Links staat Accuracy, het percentage vensters dat goed is geclassificeerd. Hoe hoger, hoe beter, al zal 100% zelden voorkomen, en als dat wel zo is, is dat meestal een teken dat uw model te veel heeft geleerd van de trainingsdata (overfitting). U ontdekt dit straks bij het testen. Voor veel toepassingen is een score boven de 85% al heel goed.

De Confusion matrix is een tabel die laat zien hoeveel vensters juist en onjuist zijn geclassificeerd. Kijk per rij. Bijvoorbeeld: in het voorbeeld hierboven werden 96 van de helloworld delen als helloworld geclassificeerd, terwijl 10 als unknown of noise werden herkend. Dat is een prima resultaat.

In het On-device performance stuk ziet u cijfers over hoe het model waarschijnlijk werkt op uw device. Inferencing time is hoe lang het model nodig heeft voor één sample, Peak RAM usage hoeveel geheugen het kost.

Nieuwe data classificeren

De cijfers uit de vorige stap laten zien dat uw model goed werkt op de trainingsdata. Maar het is heel belangrijk dat u het model ook test met nieuwe, onbekende data voordat u het echt gaat inzetten. Zo voorkomt u dat het model te veel leert van de trainingsdata (overfitting).

Hiervoor gebruiken we die extra 20% van de data die in de Test set staat. Deze data heeft het model nog nooit gezien en hiermee controleert u of het model echt werkt op onbekende data. Om te testen, gaat u naar Model testing, en klikt u op Classify all (Figuur 16).

Figure 16: Model testing showing 88.62% accuracy on our test set
Figuur 16. Modeltesten met 88.62% nauwkeurigheid op onze testset.

Wilt u een verkeerde sample bekijken, klik dan op de drie puntjes (⋮) naast een sample en kies Show classification. U komt dan in het Live classification overzicht (Figuur 17), waar u de sample kunt vergelijken met uw trainingsdata. Zo controleert u of het echt een fout in het model is of dat het label verkeerd stond. U kunt hier het label aanpassen of de sample naar de trainingsset verplaatsen om uw model verder te verbeteren.

Figure 17: Inspecting a misclassified label. Here, the audio only says “Hello,” and thus this sample was mislabeled.
Figuur 17. Bekijken van een verkeerd gelabelde sample. Hier zegt de audio alleen “Hello”, dus het label was fout.

Misclassificaties en onzekere resultaten

Het is onvermijdelijk dat zelfs een goed getraind machine learning model soms fouten maakt. Als u een model in een app integreert, moet u er rekening mee houden dat het niet altijd het juiste antwoord geeft.

Als u bijvoorbeeld audio classificeert, kunt u meerdere vensters classificeren en het gemiddelde nemen. Dat geeft u een betere nauwkeurigheid dan ervan uitgaan dat elk individueel resultaat klopt.


Deployment naar uw apparaat

Nu het impulse is ontworpen, getraind en gevalideerd, kunt u dit model naar uw apparaat sturen. Zo werkt het model offline, met minimale vertraging en zo min mogelijk stroomverbruik. Edge Impulse kan het hele impulse, inclusief MFCC-algoritme, netwerkgewichten en classificatiecode, in één C++-bibliotheek inpakken die u in uw embedded software kunt opnemen.

Mobiele telefoon

Uw mobiele telefoon kan de gecompileerde impulse direct vanuit de mobiele client bouwen en downloaden. Scan de QR-code in het Edge Impulse project Dashboard, die opent dan de browser en voert de inferentie uit. Dit is een snelle manier om de werking te testen. Zie Deploying back to device op de Using your mobile phone pagina .

Bent u tevreden met die test, dan kunt u gaan deployen naar uw board. Om uw model te exporteren, klik op Deployment in het menu. Kies dan onder Configure deployment uw ontwikkelboard en klik op Build. Zo exporteert u het impulse en bouwt u een binaire die direct werkt op uw bord. Na het bouwen krijgt u een download. Sla dit bestand op uw computer op.

Flashen van het apparaat

Als u op de Build knop klikt, ziet u een pop-up met instructies om de binary op uw apparaat te zetten. Volg deze instructies. Daarna bent u klaar om te testen.

​Het model op het apparaat draaien

We kunnen verbinden met de nieuw geflashte firmware via de seriële poort. Open een terminal en voer uit:

$ edge-impulse-run-impulse –continuous


Serial Daemon

Als het apparaat niet via Wi-Fi maar via de Edge Impulse serial daemon is verbonden, moet u die daemon stoppen. Slechts één applicatie kan tegelijk verbinden met het ontwikkelboard.


Dit zal audio van de microfoon opnemen, de MFCC-code draaien, en daarna het spectrogram classificeren:

Edge Impulse impulse runner v1.9.1

[SER] Connecting to /dev/tty.usbmodem0004401658161

Predictions (DSP: 143 ms., Classification: 13 ms., Anomaly: 0 ms.):

    helloworld: 0.98828

    noise:              0.0039

    unknown:        0.00781

Goed bezig! U hebt data verzameld, een model getraind en het op een embedded apparaat gezet. U kunt nu LED’s aansturen, actuatoren activeren, of een bericht naar de cloud sturen als u het sleutelwoord zegt!


Slechte prestatie door onbalans in dataset?

Werkt uw model goed in Studio, maar herkent het uw sleutelwoord niet op uw apparaat in continuous mode? Dat komt waarschijnlijk doordat uw dataset niet in balans is (veel meer unknown/noise dan uw sleutelwoord) én onze moving average code om valse positieven te verminderen.

In continuous mode draaien we een moving average filter over de voorspellingen om valse positieven tegen te gaan. Bijvoorbeeld: als u drie classificaties per seconde doet, wordt uw sleutelwoord misschien drie keer herkend (bij het begin, midden en einde van het audiobestand). Is uw dataset ongebalanceerd (veel meer noise/unknown), dan herkent het model uw sleutelwoord meestal alleen in het “midden” venster, en dat wordt weggefilterd als vals positief.

U kunt dit oplossen door ofwel:

  • meer data van uw sleutelwoord toe te voegen
  • het moving average filter uit te zetten door in ei_run_classifier.h (in de edge-impulse-sdk directory) het volgende te verwijderen:

       for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
            result->classification[ix].value =
                run_moving_average_filter(&classifier_maf[ix], result->classification[ix].value);
        }

Let op: hierdoor kan het aantal valse positieven toenemen!


Verder gaan

Wilt u verder experimenteren en meer leren dan alleen deze tutorial? Probeer dan bijvoorbeeld:

Wat u gebouwd hebt

In deze tutorial zijn we door het hele proces gelopen om een sleutelwoord-herkenningssysteem te bouwen met Edge Impulse: data verzamelen, MFCC signaalverwerking toepassen, een neuraal netwerk trainen en het model op een embedded apparaat zetten. Hiermee hebt u de basis in handen voor voice-projecten en kunt u verder de diepte in met audioherkenning.


Vragen of opmerkingen?

Heeft u technische vragen of opmerkingen over dit artikel? Neem dan contact op met de auteur via het Edge Impulse-forum (forum.edgeimpulse.com) of met de redactie van Elektor via redactie@elektor.com


Opmerking van de redactie: Het artikel (250667-01) is verschenen in de door Edge Impulse samengestelde gastuitgave van Elektor uit 2025

bron : Keyword spotting met Edge Impulse: Verzamelen, trainen en implementeren | Elektor Magazine

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *