Skip to content
jp edited this page Jun 28, 2026 · 6 revisions

Voices

Candela ships four local voice families wrapped in VoxSherpa-TTS (an in-process neural-TTS engine that re-projects k2-fsa/sherpa-onnx plus the Piper, Kokoro, KittenTTS, and Supertonic wrappers into a single Android AAR — no second APK, no TextToSpeech framework, no engine-binding handshake), plus one optional cloud backend:

Voice families

Piper (local, in-process)

  • Size: ~14–30 MB per voice
  • Speakers: one per model
  • Strength: fast, low memory, good on slow devices (Tab A7 Lite class)
  • Best: all the en_US Piper voices for English serial fiction
  • Count: 45 voices in catalog

Kokoro (local, in-process)

  • Size: ~330 MB total (multi-speaker model)
  • Speakers: dozens of speakers in a single model
  • Strength: more expressive intonation, better long-form pacing
  • Best: when you have a tablet or modern phone and want premium quality
  • Count: 53 speakers in catalog

KittenTTS (local, in-process — shipped v0.5.36, #119)

  • Size: ~24 MB (shared model across 8 en_US speakers)
  • Speakers: 8 en_US speakers from one shared model
  • Strength: lightest tier — designed for slow devices where Piper-high struggles. The "first chapter in 10 seconds" voice family.
  • Best: entry-level Android phones, very-slow-CPU situations, "first install just wants to hear the thing read aloud"
  • Count: 8 speakers in catalog

Supertonic 3 (local, in-process — newest, live since v1.2.3)

  • Size: ~139 MB of model files, downloaded on first use (#1236)
  • Speakers: 10 en_US speakers (5 female, 5 male) from a shared model
  • Strength: the newest neural family — a step up in naturalness. The engine was wired in v1.2.0 (#1191); the voices went live once the SupertonicEngine synthesizer was enabled and its models were hosted in v1.2.3–v1.2.4 (#1237 / #1236).
  • Best: modern phones and tablets that want the latest-quality English narration

Azure HD (cloud, BYOK)

  • Size: zero — synthesis is remote
  • Speakers: Dragon HD generative tier (4 voices) + HD Neural across en-US/en-GB/en-AU/en-IN/en-CA (16 voices)
  • Strength: studio-grade quality on any device, no local synthesis cost
  • Cost: ~$30 / 1M characters, billed by Microsoft to your Azure subscription. Candela shows a per-chapter cost estimate before playing.
  • Setup: Settings → Voice & Playback → Azure → key + region. Hit Test connection.
  • Fallback: if your key fails or the network drops mid-chapter, playback falls back to your selected local voice for the rest of the chapter — never just stops on you.
  • Count: 20 voices in catalog

Voice catalog

The flat reference of every voice lives at the Voice catalog wiki page. The narrative version is on the Voices page of the website. Local-engine voices download on demand from the voices-v2 release — no bundled weights in the APK.

Voice library UI

Settings → Voice library (top-level entry post-v0.5.42, no longer nested inside Voice & Playback). Engine-grouped picker:

  • Piper section — alphabetical by voice name
  • Kokoro section — by speaker
  • KittenTTS section — 8 en_US speakers from one shared model
  • Azure HD section — only visible after key + region setup
  • ★ Starred — your favorites at the top, regardless of engine

Tap a voice to install (download + extract for local; just select for Azure). Star toggle to favorite. Tap to preview before committing.

Per-voice tuning

Speed: 0.5×–4× (#194 widened from 2× cap). Pitch: ±20%. Both have per-voice defaults (#195, shipped) — tweak speed/pitch on a voice and the values stick when you switch back to it.

Per-voice lexicon override (#197, shipped) — long-press the brass voice-settings icon on the play screen → Advanced expander. IPA pronunciation dictionaries per voice for the names that always come out wrong. Entries persist across reinstalls when InstantDB sync is on.

Kokoro phonemizer-lang override (shipped) — pin Kokoro to a specific language tag when the auto-detected one mispronounces proper nouns. Per-voice setting in the same Advanced expander.

Punctuation cadence: a slider in Settings → Performance controls how much extra silence to insert at sentence-terminal punctuation (. , ? ! ; :). Neural TTS engines rarely breathe at sentence boundaries; this slider compensates (#90 / #109). On Kokoro, the same slider also drives the model's silence_scale parameter for within-sentence pauses (#196) — one slider, three engines, consistent feel.

Buffer slider: how many sentences of PCM to render-ahead. Default 64; experimental zone unlocks up to 3000 chunks (#138). Higher = smoother on slow voices but eats RAM.

PCM cache (v0.5.47–v0.5.49)

The full PCM-cache series shipped across the v0.5.47–v0.5.49 line: streaming-tee writes the synthesized PCM to disk while it plays; cache-hit playback replays from disk on subsequent listens without re-synthesizing; background pre-render warms the next chapter ahead of time; Settings UI in Settings → Performance lets you size the cache and choose eviction priority; status icons show per-chapter cache state in the chapter list. The result: slow voices are gapless on replay and warm-ahead reads end up free.

Tier 3 multi-engine (Settings → Performance)

For slow hardware that struggles with single-engine Piper-high or Kokoro:

  • Engines — 1–8 VoxSherpa instances running in parallel.
  • Threads / engine — thread-pool size per instance.

Each engine adds ~50 MB memory pressure (Kokoro). Bump engines first; bump threads second. The producer thread is pinned to URGENT_AUDIO priority so it doesn't get descheduled by background work mid-chapter.

Adding a voice

The voice catalog is published as a GitHub release on voices-v2. Adding a voice means dropping new model files in that release, tagging a release, and bumping the catalog cursor in Candela (core-playback/.../VoiceCatalog.kt). The script at scripts/voices/refresh-voices-v2.sh handles the diff-and-upload; the VoiceCatalog.kt edit is a deliberate human review.

A monthly drift-detection workflow (.github/workflows/voice-catalog-check.yml) opens an issue when upstream k2-fsa adds voices we haven't picked up.

For the operational details, see the website's Voices page.

Clone this wiki locally