Naar de inhoud
Yappy Downloaden
Taal: nl

het stuk dat niemand anders laat zien

Van geschreven naar gesproken.

Voorlezen is geen letters spellen: het is interpreteren. '1492' zeg je 'veertienhonderd tweeënnegentig'; 'Hendrik VIII' zeg je 'Hendrik de Achtste', maar 'Louis XIV' zeg je in het Frans 'Louis quatorze'; 'EL CID' is geen Romeins cijfer; FBI spell je letter voor letter, NASA niet. Voordat er ook maar één lettergreep gesynthetiseerd wordt, zet Yappy de tekst om in een leesscript: de partituur van wat de stem echt gaat zeggen.

De scriptmaker

Probeer het hier meteen uit: dit is dezelfde Rust-code als in de app, gecompileerd voor je browser.

Het script verschijnt hier, met de omgezette stukken onderstreept.

Twaalf klussen in één keer.

Data

„24/5/1533” wordt voluit gezegd, met de volgorde en het geslacht van elke taal.

Tijden

„14:05” wordt gezegd zoals een mens het zegt, niet zoals een klok het leest.

Bedragen

„€ 3,50” wordt gezegd als „drie euro vijftig”, met het meervoud dat erbij hoort.

Percentages

“7%” zeg je als “zeven procent”, en “0,5%” wordt geen “nul komma vijf”.

Eenheden

“230 °C” zeg je als “tweehonderddertig graden Celsius”.

Rangtelwoorden

“3e” wordt “derde”, met het juiste geslacht en de juiste verbuiging waar die er zijn.

Romeinse cijfers met beleid

“hoofdstuk IV” is een hoofdtelwoord, “Hendrik VIII” is een rangtelwoord, en “MIX” is geen getal.

Spellen of lezen

De FBI spreek je letter voor letter uit; NASA lees je als één woord. Hoe het klinkt bepaalt de regel, niet een lijst.

Afkortingen

“enz.”, “p.”, “19e eeuw”: elke taal heeft zijn eigen tabel.

Grote getallen

Met de RBNF-grammatica’s van Unicode CLDR, geslacht en verbuiging inbegrepen.

31 talen

Dezelfde regels, met de grammatica van elke taal. Zonder met de hand gemaakte lijsten.

Het ritme

Koppen ademen nadat ze zijn uitgesproken; lijsten slaan hun maat. Pauzes horen thuis in het script, niet in het toeval.

Veelgestelde vragen

Wat zijn RBNF-grammatica’s?
RBNF staat voor Rule-Based Number Format: de regels waarmee Unicode CLDR beschrijft hoe een getal in elke taal wordt uitgesproken. Het is geen tabel van duizend woorden, maar een grammatica. Daarom weet het dat het Spaans “doscientas páginas” zegt en niet “doscientos páginas”, dat het Russisch telwoorden verbuigt en dat het Frans tot negentig telt in twintigtallen. Yappy interpreteert ze in puur Rust, zonder met de hand gemaakte lijsten.
Waarom heb je een scriptgenerator nodig? Doet de stem het niet gewoon zelf?
Nee, en dat is opzettelijk. Het spraakmodel van Yappy werkt op tekenniveau: het spreekt precies uit wat er geschreven staat. Dat maakt het snel en licht, maar het betekent ook dat het “1492” cijfer voor cijfer zal proberen uit te spreken. In zo’n model is normalisatie de uitspraak. De scriptgenerator is het onderdeel dat elk getal, elke afkorting en elk symbool omzet in de woorden die een mens zou zeggen.
In hoeveel talen werkt het?
In de 31 talen die de stem spreekt, elk met zijn eigen regels: de volgorde van datums, de verbinding tussen getal en valuta, de rangtelwoorden, de afkortingen en de Romeinse cijfers. “eeuw XV” heet in het Spaans “siglo quince” en in het Engels “fifteenth century”; “Louis XIV” is “Louis quatorze” en niet “Louis fourteenth”. Dezelfde twaalf taken, eenendertig grammatica’s.
Waarom valt de karaoke altijd precies op het juiste woord?
Want het script is niet zomaar omgezette tekst: het bewaart de koppeling tussen wat er staat en wat er gezegd wordt. Als de stem “duizend vierhonderd tweeënnegentig” uitspreekt, weet het script dat die vier woorden uit de vier cijfers van “1492” komen, en de onderstreping valt er precies bovenop zonder te verschuiven. Dat is het verschil tussen de tekst belichten en hem raden.
Een woord wordt verkeerd uitgesproken. Kan ik dat corrigeren?
Er is op dit moment nog geen gebruikerswoordenboek voor uitspraak. Omdat het model tekens leest, is de snelste oplossing het woord in de editor zo te schrijven als het klinkt en het daarna weer te beluisteren. Gaat het om een algemeen patroon (een afkorting, een acroniem, een eenheid), meld het dan in de issues op GitHub: de tabellen van de scriptgenerator groeien met zulke gevallen.
Is de scriptgenerator op deze pagina dezelfde als die in de app?
Precies dezelfde code, gecompileerd naar WebAssembly zodat die in je browser draait. Wat je hier typt, verlaat je tabblad niet. En omdat het hele project open is, kun je de regels één voor één nalezen in de repository.

Het script is de helft van het verhaal; de andere helft hoor je.

Voorbeeld beluisteren