A device voice now has a tier, or a reason it is never used, decided from what the browser exposes (its name, identifier and language) and the platform, never from `default` or `localService` alone (WebKit sets both on every voice): - Rejected: a voice that sends the words away (not on the device, "Online", "-network"), eSpeak, Linux speech-dispatcher, Apple's Eloquence voices (Eddy, Flo, Grandma...), novelty voices (Readium's list, and Fred, Junior, Kathy and Ralph) and Apple's super-compact voices. - Premium: Apple Premium (identifier, or its marker in the interface language), a local "(Natural)" voice, or one Readium rates high (Google's natural voices on ChromeOS among them). - Enhanced: Apple Enhanced, or an Android speech engine's voice (Android Chrome lists them under localized names, so the platform comes in). - Basic: Apple compact, Microsoft's desktop voices (David, Zira, Mark...), other "Chrome OS" voices, anything unknown. rank_voices orders a language's usable voices by tier, then the region asked for, the language's usual region, Readium's order. choose_voice gives the person's chosen voice while the device has it, else the best that may speak unasked (premium or enhanced), else none. SystemVoice gains the identifier (voiceURI); Platform reads the user agent (iPadOS Safari says it is a Mac: touch points tell them apart). earlier_choice keeps the old ranking, to keep the voice of someone who was speaking with it; the app still uses it until the next commit. The facts come from Readium Speech v0.13.0 (npm latest; its json/ is byte-identical to v0.11.0's), voice data CC0 and code BSD-3-Clause. third_party/readium-speech/generate.py reads the pinned commit's files, checks their digest, and writes them as Rust tables (access-core/src/voice/readium.rs): nothing is fetched at run time. Tests use voice lists as iPad and Mac Safari, Mac Chrome, Windows Chrome and Edge, ChromeOS, Android Chrome and Linux give them. Co-Authored-By: Claude Opus 5.5 <[email protected]>
22 lines
1.5 KiB
Text
22 lines
1.5 KiB
Text
The AAC reference app chooses which of a device's own voices may speak for a
|
|
person (access-core, src/voice.rs). Part of what it goes by is what Readium
|
|
Speech documents about the voices browsers expose: which are novelty or very
|
|
low quality voices, how Apple marks a voice's quality in its name, and, for
|
|
each language, the voices known and their quality, in Readium's order.
|
|
|
|
generate.py beside this file reads those facts at one pinned commit and
|
|
writes them into crates/access-core/src/voice/readium.rs as Rust tables, so
|
|
the app carries them in its own code. Nothing is fetched while the app runs,
|
|
and nothing about a person's voices leaves their device.
|
|
|
|
Readium Speech (@readium/speech v0.13.0), by the Readium Foundation.
|
|
Used: json/<language>.json for the app's languages, json/filters/novelty.json,
|
|
json/filters/veryLowQuality.json and json/localizedNames/apple.json, reduced
|
|
to voice names, quality and order (network voices left out).
|
|
The code is licensed under the BSD 3-Clause License: LICENSE.txt beside
|
|
this file (the project's LICENSE, verbatim at the same commit).
|
|
The voice data began as Hadrien Gardeur's web-speech-recommended-voices,
|
|
released under CC0 1.0 (https://github.com/HadrienGardeur/web-speech-recommended-voices).
|
|
Source: https://github.com/readium/speech (tag v0.13.0, commit
|
|
4a7b73dd37a736e6762497ea7d7bc773c0fe1a30, read 2026-10-04; its json/
|
|
is byte-identical to v0.11.0's), https://www.npmjs.com/package/@readium/speech
|