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

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.

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).

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.

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!

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 sleutelwoord, noise 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 .

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.

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.

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.

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.

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.

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).

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 sleutelwoord, noise of unknown. Klik op Classifier links in het menu. U ziet dan iets als Figuur 14.

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 sleutelwoord, noise 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.

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).

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.

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