Skip to content
Yappy Download
Language: en

the piece nobody else shows

From written to spoken.

Reading aloud is not spelling out: it is interpreting. “1492” is said “fourteen ninety-two”; “Henry VIII” is said “Henry the Eighth”, but “Louis XIV” in French is “Louis quatorze”; “EL CID” is not a Roman numeral; the FBI is spelled out and NASA is not. Before synthesising a single syllable, Yappy turns the text into a reading script: the score of what the voice is actually going to say.

The reading script

Try it right here: this is the same Rust that runs in the app, compiled for your browser.

The script will appear here, with the rewritten parts highlighted.

Twelve jobs in a single pass.

Dates

“24/5/1533” is said in full, in the order and gender each language uses.

Times

“14:05” is said the way a person would say it, not the way a clock displays it.

Currencies

“$3.50” is said “three dollars fifty”, with the right plural.

Percentages

“7%” is said “seven per cent”, and “0.5%” does not become “zero point five”.

Units

“230 °C” is said “two hundred and thirty degrees Celsius”.

Ordinals

“3rd” is said “third”, with the gender and declension where a language has them.

Roman numerals, with judgement

“20th century” is cardinal, “Henry VIII” is ordinal, and “EL CID” is not a number at all.

Acronyms by phonotactics

The FBI is spelled out; NASA is read. The rule follows how it sounds, not a hand-written list.

Abbreviations

“etc.”, “p.”, “Dr.”: every language has its own table.

Large numbers

Using the RBNF grammars of Unicode CLDR, gender and declension included.

31 languages

The same rules with each language's grammar. No hand-written lists.

The rhythm

Headings breathe after they are said; lists keep their beat. The pauses are part of the script, not of chance.

Frequently asked questions

What are RBNF grammars?
RBNF stands for Rule-Based Number Format: the rules Unicode CLDR uses to describe how a number is said in each language. It is not a list of a thousand words but a grammar, which is why it knows that Spanish needs “doscientas páginas” rather than “doscientos”, that Russian declines its numerals, and that French counts in twenties past eighty. Yappy interprets those grammars in pure Rust, with no hand-written lists.
Why is a reading script needed? Can't the voice work it out?
No, and that is by design. Yappy's voice model works at character level: it pronounces exactly what reaches it in writing. That makes it fast and small, but it means that if “1492” arrives, it will try to say that, character by character. In a model like this, normalisation is pronunciation. The reading script is the piece that turns every figure, acronym and symbol into the words a person would actually say.
How many languages does it cover?
All 31 the voice speaks, each with its own rules: date order, the connector in currencies, ordinals, abbreviations and Roman numerals. “Siglo XV” is “siglo quince” in Spanish and “fifteenth century” in English; “Louis XIV” is “Louis quatorze”, never “Louis fourteenth”. The same twelve jobs, thirty-one grammars.
Why does the karaoke always land on the right word?
Because the script is not just transformed text: it keeps the map between what is written and what is said. When the voice pronounces “fourteen ninety-two”, the script knows those three words came from the four digits of “1492”, and the highlight sits on them without drifting. That is the difference between lighting up a text and guessing at it.
A word comes out wrong. Can I fix it?
There is no user pronunciation dictionary today. Since the model reads characters, the quick route is to spell the word the way it sounds in the editor and listen again. And if what fails is a general pattern (an abbreviation, an acronym, a unit), say so in the GitHub issues: the script's tables grow from cases like that.
Is the script on this page the same one the app uses?
The same code, compiled to WebAssembly so it runs in your browser. Whatever you type here never leaves your tab. And since the whole project is open, you can read the rules one by one in the repository.

The script is half the story; the other half is heard.

Hear a sample