Een artikel door Ludmila Menert en Wanda Peters van het ReadSpeaker team

“Waarom klinkt dit woord goed als het los wordt voorgelezen, maar slecht als het in een zin voorkomt?”

Onze producten zetten online tekst naar spraak om. Soms zijn klanten ontevreden met hoe een woord wordt uitgesproken. Bovenstaande vraag wordt dan regelmatig gesteld. Om die vraag te beantwoorden, leggen we eerst uit hoe mensen spraakklanken combineren in hun spraak. Daarna lichten we toe hoe onze software daarmee omgaat. De vraag impliceert dat een woord altijd hetzelfde klinkt, of het nu los of in een zin wordt gebruikt. Maar is dat wel zo? Als je goed luistert naar de natuurlijke spraak, hoor je al snel dat de uitspraak van een woord steeds een beetje verschilt. Dat komt doordat de uitspraak van een woord deels afhankelijk is van zijn omringende klanken. Onze articulatoren, waaronder onze tong, lippen, tanden en harde gehemelte, zijn daar verantwoordelijk voor. Ze anticiperen al op de volgende klank die we willen uitspreken of behouden kenmerken van de vorige klank. Zodoende wordt elke spraakklank een beetje beïnvloed door zijn ‘klank-omgeving’. Dit effect noemen we coarticulatie. Neem bijvoorbeeld de laatste klank in “van”. Die klinkt in het losse woord natuurlijk als een “n”, maar in “van belang” is het haast een “m”. Ten tweede is de uitspraak van een woord afhankelijk van zijn plek in de zin. Neem nu de naam “Jan”. Als je “Jan” los uitspreekt, wordt de klinker relatief lang aangehouden en daalt de toonhoogte. Wanneer je “Jan” combineert met een achternaam, zoals in “Jan Jansen”, is “Jan” niet meer het laatste woord dat je uitspreekt. De “a” wordt dan korter en de toonhoogte blijft constant. Ten derde worden klanken soms helemaal weggelaten tijdens lopende spraak. Zeg bijvoorbeeld eens “vastdraait”. Als je dit woord vlug uitspreekt, laat je de “t” misschien wel helemaal weg. Dit verschijnsel heet elisie. Woorden klinken dus anders afhankelijk van de woorden die eraan voorafgaan of erop volgen en afhankelijk van hun positie in de zin. Al zijn wij ons er niet van bewust, deze verschillen helpen ons om spraak te verstaan. Terwijl we luisteren naar lopende spraak, houdt ons brein automatisch rekening met fenomenen als coarticulatie en elisie, zodat we begrijpen wat de spreker zegt. Als hier bij de productie van kunstmatige spraak geen rekening mee werd gehouden, zou het resultaat onnatuurlijk klinken, bijna onverstaanbaar zelfs. Het is dus niet mogelijk om tekst-naar-spraak te maken door los opgenomen woorden simpelweg achter elkaar te plakken. Hoe maken we dan natuurlijk klinkende synthetische spraak? Door stukjes spraak uit onze database aan elkaar te plakken. De database bestaat uit ongeveer 20.000 zinnen die we met een stemacteur hebben opgenomen, waaruit fragmenten worden gebruikt bij het genereren van nieuwe zinnen. De lengte van de fragmenten die we gebruiken varieert. Soms zijn het hele zinnen en soms hebben ze slechts de lengte van een halve spraakklank. Deze halve klanken (halve klinkers of halve medeklinkers) noemen we units. Elke unit in de database is heel precies gelabeld, zodat de spraakklanken en hun eigenschappen beschreven zijn. Wanneer we een geschreven tekst omzetten in spraak, selecteert onze software welke fragmenten uit de database moeten worden geplukt om het best klinkende resultaat te bereiken. Deze stukjes spraak worden aaneengeschakeld om nieuwe spraak te vormen. Stel dat er toevallig een zin gesynthetiseerd moet worden die precies hetzelfde is geformuleerd als een zin die onze stemacteur heeft voorgelezen. Dan wordt de hele voorgelezen zin (een fragment) uit de database gebruikt. De gesynthetiseerde zin zal dan ook 100% natuurlijk klinken in de tekst-naar-spraak output. Meestal moeten echter veel kortere fragmenten gecombineerd worden, die oorspronkelijk niet achter elkaar waren gesproken, vaak individuele units. De taak van de software is de units uit de database te selecteren die het beste gecombineerd kunnen worden tot vloeiende spraak. De software zoekt telkens een unit waarvan de oorspronkelijke context zo veel mogelijk past bij de context in de geschreven tekst. Met andere woorden: de software zoekt een unit waarvan de nadruk, beklemtoning, omringende klanken en woord- en zinspositie het meest lijken op de klank die nodig is in de te genereren spraak. Waar mogelijk selecteert de software reeksen units die in de opnames ook achter elkaar werden uitgesproken. In die gevallen zijn de gebruikte fragmenten groter dan één unit. En, hoe beter de units en fragmenten uit de database matchen met de geschreven tekst, hoe gladder we ze aan elkaar kunnen plakken en hoe vloeiender de gegenereerde spraak zal klinken.


Figuur 1: Afbeelding die in beeld brengt hoe het woord “love” uit “Words love each other" gegenereerd wordt. De zes benodigde halve spraakklanken komen uit drie verschillende zinnen. De eerste vier komen uit “His love for her”. De eerste helft van de “v” in “love” komt uit "It was a love match". De tweede helft van deze spraakklank komt uit het woord “five” in de zin “Five was enough".

Figuur 1: Schematische weergave van hoe halve spraakklanken gebruikt worden in tekst-naar-spraak software


Als het goed is, klinken met onze tekst-naar-spraak technologie gegenereerde woorden altijd natuurlijk. Het valt dan niet op dat de woorden telkens weer een beetje anders worden uitgesproken. Luisteraars merken het alleen wanneer er iets mis is met de uitspraak van een woord. Hoe verbeteren we die uitspraak? Ten eerste checken we of de tekst-naar-spraak software het losse woord goed uitspreekt. Misschien “weet” onze software niet wat de correcte uitspraak van het woord is. Dat is onwaarschijnlijk, maar komt wel voor bij buitenlandse woorden en ongebruikelijke namen. Wat vaker voorkomt is dat woorden wel goed klinken als ze los worden gebruikt, maar niet goed klinken in een bepaalde zin. Sommige klanten komen daar zelf al achter en vragen ons: “Waarom klinkt dit woord goed als het los wordt voorgelezen, maar slecht als het in een zin voorkomt?” Een rare of verkeerde uitspraak ontstaat doordat onze software fragmenten selecteert die niet goed genoeg passen. De klinker is bijvoorbeeld te kort of te lang of een lettergreep wordt te veel of te weinig beklemtoond. Ook kan er een hapering (glitch) zitten op de overgang van de ene naar de andere klank. Soms ontbreken perfect passende fragmenten, maar soms maakt de software een ongelukkige keuze. Om de precieze oorzaak op te sporen, onderzoeken we niet alleen het woord, maar ook de zin waarin de fout zit. We vergelijken dan de context van alle fragmenten die de software heeft geselecteerd met de geschreven tekst. Zodra we het probleem hebben gevonden, verbeteren we de uitspraak. Als je meer wilt weten over hoe tekst-naar-spraak software werkt, vind je de volgende artikelen misschien ook interessant: