Ik verbeterde de software voor spraakassistenten, want die van Google was niet goed genoeg

Iedereen is de afgelopen jaren wel in contact gekomen met voice assistants zoals Siri, Google Assistant of misschien zelfs Alexa. Maar die dingen werken natuurlijk niet vanzelf. Toen we bij het Creative Lab met interactieve audio aan de slag gingen, ontdekte ik dat de flow voor dialogen die Google aanbiedt voor haar voice assistant niet volstaat voor complexe verhaalstructuren. Daarom bouwde ik voor Creative Lab zelf iets.

Creative Lab
Published in
5 min readApr 27, 2020

--

Bij het Creative Lab zetten we wel vaker experimenten met nieuwe digitale vertelvormen op poten, maar ons recente project rond interactieve audio was een uitzonderlijk proefstuk. Op een halfjaar tijd klommen we van de absolute basis op naar drie eigen prototypes: een interactief sprookje, een kookassistent en zelfs een trivia quiz.

Hier las je misschien al over in de blogpost van mijn collega Anouk, waarin ze onze tips voor het maken van toepassingen voor de Google Assistant deelt. Maar voordat je je toepassing met de wereld kan delen, moet er vaak op technisch vlak nog het een en het ander geregeld worden.

Die “slimme” assistenten kunnen heel goed simpele commando’s uitvoeren zoals:

  • “Wat is de hoofdstad van Turkije?”
  • “Speel het laatste album van Jeff Buckley.”
  • “Stuur een bericht naar mijn vriendin.”

Maar met complexere situaties hebben ze de grootste moeite. Als je bijvoorbeeld een vliegtuigticket zou willen boeken naar Berlijn, dan kan je het volgende zeggen:

  • “Ok Google, boek een vliegtuigticket naar Berlijn.”

Je zou niet willen dat Google op dat moment een willekeurig ticket boekt. Google weet niet wanneer je wil gaan, voor hoelang, met hoeveel personen en of je alleen reist of met de plaatselijke volleybalploeg.

Voor zulke situaties bestaan er frameworks zoals DialogFlow (van Google). Dit is een heel handige tool die met AI bepaalt wat je wil doen (intent mapping), gestructureerde data eruit haalt (entity mapping) en de nodige bijvragen blijft stellen (slot filling) tot je bot alle informatie heeft om de vlucht vast te leggen.

Een voorbeeldje van slot filling. Grijs is de gebruiker en geel is de assistent.

DialogFlow werkt goed in situaties als hierboven, maar onze lat lag voor dit project hoger. Tijdens één van onze experimenten, de kookbot van Jeroen Meus, liep ik al snel tegen een hele hoop beperkingen aan.

Onze bot was opgedeeld in een intro, ingrediënten overlopen, en het recept zelf. De verschillende onderdelen mooi mappen en bijhouden waar je je bevindt, is bijna onmogelijk met DialogFlow. Mocht je dapper zijn en het toch proberen, eindig je met een rommeltje.

Voorbeeld van zo’n rommeltje, tijdens een ander experiment.

The (finite) state machine

Ik begon noodgedwongen zelf code te schrijven, want dit moest makkelijker kunnen. Toen ik mijn hoofd zat te breken op een structuur om zulke complexe flows in te beschrijven, moest ik denken aan iets wat ik had geleerd toen ik nog een veel saaiere job had en de software voor parkeerbarelen programmeerde: the (finite) state machine.

Heel kort: wanneer een programma een state machine gebruikt, dan kan het zich altijd maar in één staat bevinden. Het programma kan doorgaan naar een andere state door middel van transities. Laat mij dat even illustreren met een fysisch element: water. Dat heeft ook altijd maar één state (vloeibaar, ijs, damp of plasma) tegelijk, en om van de ene naar de andere over te gaan zijn er transities (vb. verdampen, condenseren of bevriezen):

State machine voor water

Toegepast op een voice assistant wil dat zeggen dat je jezelf tijdens het hele gesprek in een state bevindt. Elke state geeft op zijn beurt aan wat de volgende wordt, en kan dit laten afhangen van bepaalde factoren, zoals wat je net hebt geantwoord.

De geboorte van VoiceMachine

Ik schreef dus zo’n state machine en voegde nog extra functionaliteiten toe, zoals de mogelijkheid om informatie het hele gesprek te onthouden (memory), zodat beslissingen in het begin van het gesprek (“Heb je het graag pikant?”) de rest kunnen beïnvloeden (“Voeg dan nog maar een pepertje extra toe.”).

Nu volgt een stukje code, maar ik beloof dat het niet te ingewikkeld is.

Een simpel voorbeeldje van een bot.

Nadat mijn state machine de eerste keer zijn nut bewezen had, besloot ik eraan te blijven schaven tot ik voldoende tevreden was om het te delen met de rest van de wereld. Als ronkende naam koos ik VoiceMachine.

VoiceMachine is bewust heel generiek. Zie het als een hoop bakstenen waar je zelf je huis mee moet bouwen, niet als een prefab vierkantshoeve. In tegenstelling tot DialogFlow doet VoiceMachine bijvoorbeeld geen intent of entity mapping. Maar zulke zaken kan je makkelijk zelf toevoegen.

Het voorbeeld hierboven is heel simpel, maar ondertussen hebben we VoiceMachine ook gebruikt voor extreem complexe projecten, zoals het sprookje Roodkapje (75 states). Om daar door de bomen het bos (en de grote boze wolf) te blijven zien, voegde ik een uitbreiding toe die heel je state machine kan visualiseren. Zo kun je poepsimpel fouten opsporen.

Een heel klein stuk van Roodkapje.

Er zitten nog leuke dingen in mijn VoiceMachine die het aangenamer maken om bots te schrijven voor Google Assistant, maar die moet je zelf maar ontdekken op de projectpagina. Daar staat ook uitgelegd hoe je makkelijk zelf met dit framework aan de slag gaat.

Laat ons ook gerust weten als je zelf iets maakt met VoiceMachine!

--

--