11
A reader that owns the audio

TomeVoice

A document reader with a serious text-to-speech engine — Android and Windows — that controls the gap between words.

Dart ttsebook-readerepuboffline-first
click to turn
A sentence, spoken

Word-gap injection on derived timings. Replayed from the documented audio pipeline.

Two contracts
ingestionEPUB · PDF · DOCXTXT · MD · HTMLrole at ingest document modelContract Ablock → sentence → wordformat-native anchors engine adaptersAndroid · WinRTPiper · Kokoronever speak() synthesis resultContract BPCM + word timingssource, labelled audio pipelinetrim → stretch → gappauses → gaintimings remapped readerhighlight overlaysentence cursor playerlookaheadown buffer NOTHING LEAVES THE DEVICE neural voices downloaded on demand · no account

Every format becomes one document model. Every engine returns PCM plus word timings. Neither side knows what a PDF is.

Contract B — never speak()
SynthesisResult
  pcm            mono samples
  wordTimings    char range → frame range
  source         engineReported
                 | modelDurations
                 | aligned
                 | estimated

pipeline, in order
  1  edge trim
  2  time stretch
  3  word-gap injection
  4  punctuation pauses
  5  sentence pause
  6  gain

highlighting reads the
post-processed timings.

Stage order is load-bearing. Stretch after the gaps and the gaps stretch too. Estimated timings are labelled, and the UI falls back to the sentence rather than highlighting the wrong word.

The hard part

Neural voices return no word timings — only samples. Highlighting and gap injection both depend on them, so they are derived in stages and honestly labelled. System voices hand timings over for free.

The best-sounding open model is too heavy for cheap phones. Kokoro is device-gated and never the default. PDF is not a text format: reconstructing reading order from glyph positions is the largest cost in the document pipeline, and it is never perfect, so the product lets users correct it.

Licence as architecture

GPL-3.0 was not a formality. eSpeak-NG, Piper’s engine and the best pitch/time library are all GPL. Matching their licence turned three blockers into ordinary dependencies.

Status, honestly

You can use it. The audio-engine spike is proven on a real device. The app opens EPUB, TXT and Markdown from the library and reads them aloud sentence by sentence, with the same word-gap, pause and speed controls.

APKs still come from CI — there is no local Flutter install. DRM-protected books are permanently out of scope.

The surface
2platforms
GPL-3.0licence
PCMnever speak()
0accounts

Android APK with the screen off; a Windows exe with media keys. Nothing leaves the device.

Outcome

TomeVoice

Chapter 12
ValoBot

Valorant esports intelligence — live match, team and player data from VLR.gg, paired with CYPHER, an analyst grounded in it.

continue
11 — TomeVoice
scroll · drag · ← →