Voices by age
Status: built, 2026-10-14. This is the fourth product audit's finding 3, the voices part
(docs/audits/product-audit-2026-10e.md; 0.13 plan item 3, voices-by-age). Free voices for a
child and an older woman followed on 2026-10-16 (the sixth audit's plan item 12,
docs/audits/product-audit-2026-10f.md; "Voices of every age" below). The audit heard
voices that ignored age. Theo, ten, spoke as am_fenrir, a grown man's voice (133 Hz, "gravelly,
mid-pitched"), where a ten-year-old speaks near 250 Hz. Dad, "forties, a bushy beard", was
"nasal, very high". Walt, in his seventies and a man of few words, spoke "quick". A person's
pitch, pace and energy were drawn at random from the pattern's ranges, and an archetype's pitch
rule (the lead's -0.2 to 0.7) did not care who it was drawing.
What a person's voice is now
A person (a biped) speaks where people of their age and sex speak. Words that describe them lean
that, and Kokoro's nearest voice is moved there (voice.ts: voiceBand, drawVoice,
fitVoice).
- The band. Each age (child, teen, adult, older; a baby is a child and the elderly are older) and sex has a speaking pitch, low, middle and high. These are voice science's figures, rounded. A child of either sex is near 260 Hz (235 to 290), since the voice has not broken. A girl in her teens is near 212 and a boy near 135. A woman is near 198 and a man near 115. Hers falls a little with age (182) and his rises (122). A grown-up whose sex nothing says (no pronouns, no beard, no name that tells) is drawn one, half and half, and reads as their voice does; drawn from the middle of both, nearly all came out men. Someone drawn with no words reads as their archetype's voice: the veteran's deep one is a man's. Each age also has a pace (the binding's speed): a child 1.1, a teenager 1.05, an adult 1, someone older 0.9. Each has an energy too: 0.75, 0.65, 0.6 and 0.5.
- The lean. The words that describe them lean each dial (
voiceLean). Calm, laconic, shy, "few words", quiet or slowly make them two steps slower (0.08) and low-key (energy 0.25 to 0.4). Eager, excitable, talkative or "never stops talking" make them quicker and lively (0.8 to 0.95). Gruff, gravelly or husky put the pitch two semitones down, and squeaky or reedy put it two up. Husky, raspy or hoarse are a gravelly timbre, whiny a nasal one, and so on. Their words win. Where the words say nothing, their persona's traits and speech decide ("tells stories that go nowhere, slowly"). Someone drawn with no words at all leans as their archetype does: its description, and its own pitch, pace and energy rules, which now only lean within the band (ruledLean). The lead's pitch rule once made a bearded dad "very high". - The draw. Within that, a seeded draw wanders at most a semitone in pitch, 0.03 in pace and 0.05 in energy, so two people of one age and sex are not one voice.
- The voice. The nearest voice of their age and sex is bound (of either sex for a child; see
"Voices of every age"). It is then moved to their pitch: the binding's semitones take the voice's measured
pitch to theirs, at most four either way for anyone but a child (
fitVoice). Their pitch dial becomes the pitch heard, and their timbre the voice's own as measured (bright, warm, gravelly, breathy), unless their words give one. The casting note then says what is heard: the audit's dad was "nasal" by a draw. - A child's voice. A boy and a girl both get one of Kokoro's voices for a child, a blend near a young woman's pitch. It is raised the few semitones to a child's pitch (+4 or so, not a man's voice +11). The formant goes up three quarters of a unit, and all of it once the voice is raised four semitones: a child's vocal tract is about a sixth shorter than a woman's, its formants some three semitones higher. The voice is bright, never gravelly. A child taking a free voice in a cast takes one of the other voices for a child, then one of all of Kokoro's good ones, since the show's own high voices run out.
- The same everywhere. A described person (create_character, the reading's cast) and a drawn one (generate_characters) get this, as does a freed voice (one taken by another in the cast) and a varied one. A creature keeps its pattern's draw and its body's colouring. The character sampler is 1.8.0.
Voices of every age
Kokoro recorded grown people only: its women's voices sit at 150 to 215 Hz and sound like women in their twenties to forties, its men's at 85 to 160 Hz. Until 2026-10-16 a seven-year-old spoke in a young woman's voice raised four semitones, and a grandmother in a young woman's voice (the sixth product audit's plan item 12).
- Each voice's ages. Every voice in
adapters/voices.tssays the ages of the people it speaks for (VoiceDescriptor.ages). A woman's voice of Kokoro's speaks for a teenage girl and a woman. A man's speaks for a teenage boy (his voice broken), a man and an older man: a man's voice changes less with the years, and four semitones take it into his band. am_santa, by its name, speaks for an older man only. - Voices for a child and an older woman.
AGE_VOICESadds voices made for them, blends of Kokoro's own by weight, as a binding may already name one (af_bella:0.5,bf_alice:0.5). Kokoro mixes the voices' style vectors, so a blend is a voice of its own, not two read at once. A child's is a young woman's voice half and half with bf_alice, Kokoro's highest; it is raised into a child's pitch with a child's formant. An older woman's is a woman's voice with four parts in ten of af_nicole, Kokoro's breathiest: lower, less clear (harmonics-to-noise) and less voiced than a young woman's, as an older voice is. It is lowered into her band, and she speaks slower, as every older person does. Each blend is measured as the table's own voices are (tools/voices-measure.py --table), so its pitch and timbre come from the measurements, never the ear. Nothing here costs anything: they are Kokoro's own voices. - Casting by age. A person is cast from the voices of their age and sex (
ofAgeindrawVoice): the pattern's own voices of their age first, else Kokoro's, the blends among them. A teenager, an adult and an older man are cast as before, from the pattern's voices. A child and an older woman get one of the blends. A freed voice (freeVoice, when another in the cast has theirs) is one of their age first too: of the pattern's, then Kokoro's good ones, then any of Kokoro's for their age, and only then a voice of another age. A person whose sex is known never takes a voice of the other sex to be told apart: with every man's voice taken, a bearded man keeps his own, shared, rather than speak as a woman. - A voice like any other. A blend is read by Kokoro wherever it runs (
synth.py'sblend_parts; each of its voices is pinned inmodels.json), and Studio's Voice panel shows it as "A blend: Heart 60%, Nicole 40%".
When a voice is not of their age
A show with more children than Kokoro has voices for a child gives the rest a grown voice raised. A person can also choose one of Kokoro's own voices for a child or an older woman by hand in the Voice panel. A voice moved as far as it goes (four semitones) may also stop short of someone's band, such as a woman in a show whose pattern offers only men's voices. In those cases:
- Making them says so, in a note on the proposal (
voice.nothing_close,voiceNote): "This is a grown voice raised to a child's pitch, and may sound older than they are. A voice recorded in the booth, or a cloud voice, will sound younger." For an older woman: "This is a younger woman's voice, and may sound younger than she is." The note names no one. It points at the person's voice in their file, so a rename leaves it right; the first listening sheet's Theo was told "Finock Witherridge speaks in a grown voice", a drawn name. Claude reads it with the proposal, and the person sees it with the change. - The character studio's Voice panel says it under the voice while a Kokoro voice is chosen
(
RwVoicePanel.near_note_words): one of Kokoro's own voices for a child, or for an older woman by her pronouns, and a voice whose pitch slider is moved five semitones or more. A blend it takes as theirs. The note goes as soon as a cloud voice is picked. It is in Spanish too.
How it is measured
core/test/voices-corpus.test.ts makes 22 people from words, one at a time, on a blank show:
five children, five teenagers, six adults and six older people, ten of them said to be calm
or lively. It makes three casts of them too (Kitchen Science, Night Ferry, three children),
and draws two casts with generate_characters, one as a script introduces them (with ages) and
six with nothing said. Each person is scored:
- range: their pitch as heard is where their age and sex speak (the test's own, wider ranges);
- pace: children and teenagers quicker, older people slower, and the calm slower and the lively quicker than their age's middle;
- energy: the calm low-key, the lively lively;
- child: a child's voice is moved at most six semitones, is not gravelly and has a raised formant;
- said: the casting note says nothing wrong ("very high" for a man, "quick" for someone older, "deep" for a child), and its timbre is the voice's own;
- age: a child and an older woman speak in a voice made for their age;
- note: the note is said exactly when a child's or an older woman's voice is not one of their age;
- apart: no two in a cast speak alike.
Before the change the corpus scored 114 of 191: range 33 of 41, pace 29 of 41, energy 7 of 12,
child 4 of 10, said 9 of 41, note 27 of 41, apart 5 of 5. After the change it scores 191 of
191. With voices of every age it scores 205 of 205; without the voices for a child and an older
woman, 191 of 205 (age 0 of 14). words-cast's voiceage rule now says the same thing: a
child's voice is at 220 to 300 Hz, raised at most six semitones, and anyone else's is moved at
most four.
core/test/voices-by-age.test.ts makes the fresh shows' people from their words in one show:
Birthday Chaos's Sammy and Toby, both seven, and Carla, Sammy's mom, and Road Trip's Gran, in
her eighties. Each child is in a voice of their own made for a child, heard at a child's pitch
with a child's formant; Gran is in an older woman's, heard in her band and slower than the
children; Carla is in one of the show's own voices; and nothing is noted. It also checks that
every age has voices of each sex, that an older woman's voice measures lower, less clear and
less voiced than a young woman's, and that a freed voice keeps to the person's age and sex.
tools/voices-listen.ts makes Sammy, Gran, Walt (seventies, few words) and June (sixteen) from
words. Each says one line through Kokoro on this computer. The tool writes the take, a
spectrogram (0 to 4 kHz, the harmonics), the median pitch heard and tools/sing-check.py's
harmonics-to-noise, jitter, shimmer and centroid of the take, beside the casting. Run before and
after the voices of every age (2026-10-16): Sammy went from af_bella raised four semitones (241
Hz, "Kokoro has no child's voice") to af_jessica:0.5,bf_alice:0.5 raised three, with a child's
full formant (245 Hz, no note). Gran went from bf_emma lowered two semitones (160 Hz, "Kokoro
has no older woman's voice") to af_river:0.6,af_nicole:0.4 unshifted (163 Hz, no note), its
jitter and shimmer up (0.67% to 1.07%, 5.68% to 6.65%), as an older voice's are; its
harmonics-to-noise reads higher (8.54 to 9.96 dB), the shift having roughened the voice before,
while unshifted the blend is below bf_emma's (9.67 to 10.13 dB). Walt and June
are cast as before, June to af_bella, which Sammy no longer takes.