Blogpost

Wat er gebeurt als je een robot emoties probeert te laten begrijpen

2026-02-27 · 6 min leestijd

crosswordroboticsemotion recognitionhri

Tijdens mijn bachelor thesis wilde ik een vraag onderzoeken die eigenlijk vrij simpel klinkt, maar in de praktijk best complex blijkt: kun je een interactie met een robot verbeteren door rekening te houden met de emoties van de gebruiker?

Het idee kwam voort uit eerdere ervaring met een robotproject tijdens een vak. Dat voelde meteen interessant, juist omdat het zo tastbaar is: je bouwt niet alleen iets dat “werkt”, maar iets dat echt met mensen in gesprek gaat. En eerlijk is eerlijk, het is ook gewoon gaaf om met een robot te werken, zelfs als het een kleine is. In dit project werkte ik met de Alpha Mini. Tegelijkertijd zie je dat veel bestaande robotinteracties nog vrij rigide zijn. Met de komst van large language models verandert dat, omdat dialoog ineens veel flexibeler en contextgevoeliger kan worden. De vraag werd dus: als we die flexibiliteit combineren met real-time emotieherkenning, kunnen we dan een interactie maken die natuurlijker en adaptiever aanvoelt?

Een belangrijk onderdeel van het project was het ontwerpen van een goede interactiescenario. Dat bleek verrassend lastig. Je zoekt iets waarbij gebruikers genoeg praten, maar ook emoties laten zien tijdens de interactie. Veel bestaande studies gebruiken vrij simpele of korte taken, maar dat past niet goed bij de mogelijkheden van moderne AI-systemen. Ik wilde juist een situatie waarin de interactie zich over tijd ontwikkelt.

Uiteindelijk kwam ik uit op een crossword-puzzel waarbij de robot als assistent fungeert. Dat werkte goed om meerdere redenen. Ten eerste zijn crosswords van nature lastig: je moet net dat ene woord weten, en als je het niet weet, loop je vast. Tegelijk verschilt die moeilijkheid sterk per persoon, afhankelijk van hun kennis. Dat maakt het een ideale setting voor adaptief gedrag. De robot kan bijvoorbeeld subtiele hints geven aan een ervaren gebruiker, terwijl hij bij iemand anders meer richting geeft. Daarnaast biedt het onderwerp ruimte voor kleine stukjes gesprek, bijvoorbeeld over landen of algemene kennis, wat de interactie levendiger maakt.

Vanuit technisch perspectief groeide het project al snel uit tot een volledige multimodale pipeline. De robot verzamelde continu input via spraak, gezichtsuitdrukkingen en de staat van de puzzel. Deze signalen werden gecombineerd en gebruikt als input voor een language model, dat vervolgens bepaalde wat de robot moest zeggen en hoe. Daarmee ontstond een systeem waarin perceptie, redenering en generatie samenkomen in één loop.

Een van de grootste uitdagingen zat in emotieherkenning. Het is heel eenvoudig om een standaard model te gebruiken dat een gezicht indeelt in een paar categorieën zoals “blij” of “boos”. Maar in de praktijk zijn emoties veel subtieler. Mensen laten vaak geen duidelijke expressies zien tijdens een gesprek, en veel informatie zit juist in kleine signalen of in de stem.

Daarom heb ik eerst gekeken naar een meer geavanceerde aanpak met een multimodaal model dat niet alleen naar het gezicht kijkt, maar ook naar tekst en audio. Het idee was dat zo’n model rijkere, tekstuele beschrijvingen van emoties kon geven, die direct bruikbaar zijn in een prompt voor een language model. In theorie ideaal, maar in de praktijk liep dit vast op performance en infrastructuur. Het model was te zwaar om lokaal real-time te draaien, en een cloud-oplossing bracht weer latency en privacyproblemen met zich mee.

Dat was ook het moment waarop ik tegen een klassieker aanliep die eigenlijk elke developer wel een keer meemaakt. Ik had het model eindelijk werkend op een cloud server, helemaal blij dat het draaide… en vergat vervolgens die server weer uit te zetten. Wat eerst een prima oplossing leek, veranderde vrij snel in een onnodig dure les.

Los daarvan werd ook duidelijk dat engineering trade-offs minstens zo belangrijk zijn als modelkeuze. Uiteindelijk ben ik teruggegaan naar een eenvoudiger, lokaal model dat snel genoeg was voor real-time gebruik, ook al leverde dat minder rijke signalen op.

Een andere grote uitdaging was de fluency van de interactie. In een gesprek vallen vertragingen of slechte timing meteen op. Dingen als wanneer je bepaalt dat iemand is uitgepraat, hoe je voorkomt dat de robot door iemand heen praat, of hoe je omgaat met stiltes, bleken cruciaal voor hoe natuurlijk de interactie voelt. Het zijn geen complexe problemen op zich, maar samen bepalen ze wel of het systeem “werkt” als geheel.

Aan de kant van de dialoog gebruikte ik een prompt-gebaseerde aanpak waarbij één modelcall verantwoordelijk was voor zowel strategie als antwoord. De prompt bevatte informatie over de rol van de robot, de huidige puzzelstatus, de laatste user input en de gedetecteerde emotie. Het idee was dat het model zelf kon bepalen hoe het moest reageren, bijvoorbeeld door hints aan te passen op basis van frustratie of juist wat speelser te worden als de gebruiker positief reageerde.

In de praktijk liep dit tegen een bekende beperking aan: prompt complexiteit. Naarmate ik meer gedrag en regels toevoegde, werd de prompt steeds groter en moeilijker te controleren. Uiteindelijk probeerde één modelcall te veel tegelijk te doen: plannen, onthouden en formuleren. Dat resulteerde vaak in vrij repetitief of voorzichtig gedrag. Achteraf gezien zou een opgesplitste aanpak, met aparte stappen voor planning en generatie, waarschijnlijk beter werken.

De resultaten van het experiment waren interessant, maar ook eerlijk. Het systeem zelf functioneerde goed: gebruikers konden de puzzel oplossen, en de robot gaf bruikbare hints. De emotielaag had echter weinig zichtbaar effect. In de meeste gevallen werden emoties als “neutraal” geclassificeerd, waardoor het model weinig variatie had om op te reageren. Daardoor was er in de praktijk weinig verschil tussen de versie met en zonder emotieherkenning.

Toch bleek uit gecontroleerde tests dat het systeem wel degelijk anders reageert wanneer er variatie in emotie-input is. Die verschillen zaten vooral in toon en moeilijkheid van hints, minder in het soort actie dat werd gekozen. Het potentieel is er dus, maar wordt beperkt door de kwaliteit van de input.

Wat dit project voor mij extra waardevol maakte, was niet alleen het eindresultaat, maar ook het proces ernaartoe. Het was de eerste keer dat ik aan een project van deze omvang werkte, en daarin ben ik ook wel tegen mezelf aangelopen. Ik merkte dat ik soms te lang bleef hangen in papers lezen en dingen willen “perfect” begrijpen voordat ik verder ging. Ook heb ik tijd verloren door te lang door te bouwen aan ideeën of implementaties die uiteindelijk niet goed werkten. Juist daarin heb ik veel geleerd: wanneer je moet doorpakken, wanneer je iets moet loslaten, en hoe je beter afwegingen maakt tussen theorie en praktische haalbaarheid.

Gelukkig had ik tijdens dit project een begeleider die daar goed in meedacht en me hielp om het overzicht te houden en keuzes te maken. Dat heeft een grote rol gespeeld in hoe het project uiteindelijk is gelukt.

Wat ik uiteindelijk het meest heb geleerd, is dat het bouwen van dit soort systemen niet alleen draait om sterke modellen. Het gaat om hoe je ze integreert, welke keuzes je maakt in de architectuur, en hoe goed het geheel aansluit op hoe mensen daadwerkelijk interacteren. Voor mij was dit project ook een bevestiging dat ik juist dat stuk — het bouwen van systemen rondom AI — het interessantst vind.

Het project is uiteindelijk beoordeeld met een 9, wat voor mij vooral voelde als een bevestiging dat die combinatie van technisch bouwen, experimenteren en reflecteren precies is waar ik verder in wil groeien.