Geluid wordt getallen
Een microfoon meet luchtdruk, duizenden keren per seconde, en schrijft elke meting op als een getal. Meer is een opname niet: een heel lange lijst getallen die beschrijft hoe een membraan bewoog.
Het eerste wat een herkenner doet, is die lijst inkorten. Ruwe audio bevat veel meer detail dan spraak nodig heeft, dus het systeem hakt hem in korte plakjes, meestal een paar honderdsten van een seconde per stuk, en beschrijft elk plakje aan de hand van welke frequenties erin zitten en hoe sterk.
Wat je overhoudt is een compacte samenvatting van het geluid door de tijd heen. Volume, toonhoogte en de vorm van het geluid, plakje voor plakje. Een brommende koelkast staat er net zo goed in als jouw stem, want er is op dit punt nog niets gebeurd dat spraak van de rest scheidt.
Het model zoekt patronen die het eerder gezien heeft
Die samenvatting gaat naar het model, en dat is het deel dat mensen bedoelen als ze spraakherkenning zeggen.
Een model is een groot bestand met getallen dat ontstaat door oefenen: een systeem vele uren opgenomen spraak laten zien naast de juiste tekst, en die getallen bijstellen tot de koppeling tussen die twee betrouwbaar wordt. Niemand schrijft regels als “deze vorm betekent een s”. Het patroon wordt uit voorbeelden geleerd.
Wat eruit komt is geen zekerheid maar waarschijnlijkheid. Voor elk stuk geluid heeft het model een mening over welke klanken, en daarna welke woorden, er waarschijnlijk gezegd zijn.
Hart, hard, en vier kanten
Klank alleen is niet genoeg, want heel veel woorden klinken hetzelfde. “Hart” en “hard”. En dan is er nog de vraag waar een woord ophoudt: “vier kanten” en “vierkanten” bestaan uit precies dezelfde klanken.
Herkenners lossen dat op met context: de woorden die al gevallen zijn maken sommige volgende woorden veel waarschijnlijker dan andere. Het systeem beantwoordt eigenlijk twee vragen tegelijk, waar leek dat geluid op en wat zou hier logisch zijn, en het combineert die twee.
Dat verklaart een bekende ergernis. Spreek een hele zin in en hij komt er goed uit. Spreek één ongewoon woord los in en het gaat mis. Zonder context was er niets om op te leunen, dus moest de klank de hele beslissing dragen.
Het verklaart ook waarom je eigen namen en vaktaal lastig zijn. Een model dat op algemene spraak geoefend is, is de achternaam van je collega of de interne afkorting van je bedrijf nooit tegengekomen, dus zet het er iets gewoons voor in de plaats dat er ongeveer op lijkt. Zelf woorden toevoegen helpt daarom zo veel: je levert de context aan die ontbrak.
Waarom accenten en rumoer moeilijk zijn
Allebei komen ze van dezelfde plek.
Een model herkent waar het veel van gehoord heeft. Zat een bepaald accent dun in het oefenmateriaal, dan heeft het systeem minder ervaring om uit te putten en valt de uitkomst slechter uit. Dat zegt niets over het accent en alles over wat het model te zien kreeg.
Achtergrondgeluid is nog lastiger, want de microfoon vangt de kamer op samen met jou. Spraak en rumoer komen door elkaar in dezelfde getallen binnen, en het model moet uitzoeken welke stukken woorden waren. Een café, een auto, een ventilator, iemand anders die praat: het strijdt allemaal om dezelfde metingen.
Grotere modellen gaan met allebei doorgaans beter om, omdat ze meer ruimte hebben om ongewone gevallen te vertegenwoordigen. Daarom bieden apps überhaupt een keuze in maten aan, en daarom staat de grootste maat vaak aangeraden voor wie in rumoerige ruimtes werkt.
Waar de leestekens vandaan komen
Bijna niemand spreekt nog leestekens uit, dus het systeem moet ze verzinnen.
Dat doet het uit dezelfde twee bronnen als al het andere: uit het geluid, waar pauzes en een dalende toon op een grens wijzen, en uit de taal, waar de vorm van een zin aangeeft waar een komma hoort. Geen van beide is doorslaggevend, en daarom zijn de leestekens het deel dat er het vaakst een beetje naast zit, ook als elk woord klopt.
Er volgt ook een gewoonte uit. Praten in hele zinnen met natuurlijke pauzes geeft het systeem het akoestische bewijs dat het nodig heeft. Wegvallen aan het eind, halverwege opnieuw beginnen of vijf bijzinnen aan elkaar rijgen haalt precies de signalen weg waar het op leunde, en de leestekens gaan als eerste onderuit.
De wachttijd na je laatste zin
Het herkennen kan meestal pas beginnen als er iets te herkennen valt. Veel systemen wachten op een natuurlijke pauze en verwerken dan wat ze net gehoord hebben. Een lange zin levert dus een pauze aan het eind op, ruwweg evenredig aan hoe lang je praatte en hoe groot het model is.
Op een telefoon is dat gewoon zichtbaar. Een kleiner model levert de tekst eerder en verstaat af en toe iets verkeerd; een groter model laat je langer wachten en heeft meer goed. Er is geen instelling die je allebei geeft.
Bij een antwoord van vier woorden voel je die wachttijd als traagheid, want je hebt niets anders te doen dan kijken. Bij een alinea van vijf zinnen voel je hem nauwelijks, omdat je in die seconden toch al aan het nadenken bent over de volgende.
Server of telefoon
Het modelbestand kan op een server staan. Je telefoon neemt op, stuurt het omhoog, wacht, en krijgt tekst. Servers hebben geheugen, koeling en gespecialiseerde hardware, dus het model kan heel groot en heel bekwaam zijn, en het kan beter worden zonder dat jij een vinger uitsteekt.
Of het bestand staat op je eigen telefoon. Er wordt niets geüpload, er wordt op niets gewacht, en het herkennen werkt of je nu bereik hebt of niet. De grens is je hardware: een telefoon heeft een paar gigabyte geheugen dat met alles gedeeld wordt, geen ventilator, en een accu om te ontzien, dus het model moet klein genoeg zijn om snel te laden en klaar te zijn voordat je ongeduldig wordt.
Alles over privacy, over werken zonder verbinding en over snelheid volgt uit die ene keuze. Je kunt hem in een minuut aflezen bij elke app die je overweegt: zet het netwerk uit en kijk of er nog tekst verschijnt.
Wat je zelf in de hand hebt
Praat in hele zinnen en niet in losse woorden, want de context doet het werk dat de klank niet aankan. Houd de microfoon redelijk dichtbij en uit de wind, want rumoer mengt zich in het signaal en is er achteraf niet meer uit te halen. En voeg je eigen woordenschat toe als de app dat toestaat, want dat is het ene deel van het probleem dat je rechtstreeks kunt verhelpen.
Het herkennen werkt op wat de microfoon bereikte, niet op wat je bedoelde. Mompel je het eind van een woord, begin je halverwege een zin opnieuw, of laat je je stem zakken terwijl je je van de telefoon afdraait, dan is het bewijs voor die stukken zwakker en is dat in de uitkomst te zien.
Voor deze drie hoef je geen instelling om te zetten en niets binnen te halen. Ze veranderen alleen wat er bij de microfoon binnenkomt, en dat is de helft van de som.
Hoe LocalType die keuze maakt
LocalType draait het model op de telefoon, en de rest van het product volgt daaruit: inspreken dat werkt met de verbinding uit en dus ook offline, audio die nooit verstuurd wordt, geen account om aan te maken, en een keuze uit modelmaten zodat de afweging tussen snelheid en nauwkeurigheid van jou is en niet van ons. Die maten zijn 60, 190 en 539 MB, en om een idee van de schaal te geven: op een testtelefoon met 4 GB geheugen maakte de middelste in 4,1 seconden tekst van 6,9 seconden spraak.
Het betekent ook dat de grenzen hierboven net zo goed voor LocalType gelden als voor al het andere. Een telefoon draait een kleiner model dan een server kan draaien, de nauwkeurigheid is niet gelijk over alle achttien talen die het aankan, en een rumoerige kamer blijft een rumoerige kamer.