Skip to content

TG SpeechBox with phoneme editor, NVDA Addon, SAPI5, Linux, Android, iOS, Mac OS, version 310 beta 7

Pre-release
Pre-release

Choose a tag to compare

@tgeczy tgeczy released this 22 Jul 17:49

TGSpeechBox v3.10 Beta 7 — the engine learns what time is

Every beta so far has been about what the engine says — formants,
fricatives, bursts. This one is about when. Three timing fixes landed
in the DSP and frontend that together change how the engine behaves
across the whole rate dial, and especially at the slow end: 5–25%
speech rates, where braille-parallel readers, language learners, and
anyone easing into synthetic speech actually live. If you've ever
slowed TGSpeechBox down and thought it got smeary, ghosty, or vague —
this is your beta. And if you never touch slow rates: your normal-rate
audio is bit-identical this release. Not "should sound the same" —
byte-for-byte identical output, verified. The timing fixes engage only
below 100% rate.

Also in here: word-final /t/ and /d/ are audible again, the 11025 Hz
whistle is gone (#104), Wear OS is now officially a supported home, and
the Android package meets Google Play's Android 16 target requirement
ahead of the August deadline.

The slow-rate phantom echo — found, explained, dead

The report: at very slow rates, words like "able" played a ghostly
echo of the previous sound between syllables — the tail of the "ay"
bleeding into where the "b" should be.

The cause was a beauty. When the engine inserts a stop closure (the
brief quiet moment inside a /b/, /d/, /g/), the closure frame borrows
the previous phoneme's pitch-model state so the melody doesn't hiccup.
But it was accidentally borrowing something else too: the previous
phoneme's formant ramp targets. In the DSP, those targets override
everything — so the closure's spectrum never moved to the closure. It
stayed parked on the vowel you just heard. Amplitude dropped as
commanded (−18 dB), but the sound shape was still the old vowel: a
quiet, sustained copy of the previous phoneme, sitting inside every
voiced stop closure. We measured it directly: the closure in "able"
commanded formants at 1100/2150 Hz and rendered 1947/2695 Hz — the
diphthong's, unmoved.

At normal speed that closure is ~20 ms and nobody hears it. At 7%
speed it stretches to ~283 ms of audible ghost. That's the echo.

The fix stops closure frames from inheriting formant targets, with
trip-wire tests locked around it (verified failing against the old
code). Two happy side effects: the same bug lived in the fricative-to-
stop taper (also fixed), and the code that positions a closure's
formants at the stop's own articulation point — real place-of-
articulation cues — had been silently dead under the stale targets.
It's live now, at every speed.

Transitions now live in absolute time

Digging around the echo turned up something more fundamental. Every
transition length in the engine scaled with the rate dial: slow the
speech to 7% and a 25 ms crossfade became 357 ms. The Klatt-lineage
synthesizers (DECtalk, KLSYN) never do this, and for good reason —
transitions model articulator movement, and your mouth doesn't move
in slow motion when you speak slowly. Slow speech means longer steady
sounds, not slower lips.

Two changes, layered:

  • Transitions cap at 130 ms absolute. Below 100% rate, no
    crossfade stretches past 130 ms no matter how slow you go. Formant
    glides stay smooth; segment onsets stop smearing across their
    neighbors.

  • Amplitude switches faster than formants glide. Within those long
    transitions, loudness changes (voicing coming on, frication cutting
    off) now complete within 45 ms while the vowel color keeps gliding
    across the full transition — the lineage rule that amplitude is
    near-instant while formants take articulatory time. Measured on
    "able" at 7%: voicing onset after the /b/ tightened from 38 ms to
    20 ms, and the word's final /l/ now ends in 32 ms instead of
    smearing out over 78.

The net effect at slow rates is hard to overstate: sounds arrive
instead of oozing, word endings are defined, and the ghost-of-the-
previous-phoneme quality is entirely gone. Ear-validated across
English, Hungarian, and Spanish at 15% and 7%.

Word-final /t/ and /d/ are back

Reported by Vsevolod: word-final stops ("cat", "bad") had their
release bursts swallowed. The closure before a word-final stop was
draining the engine to dead silence, so the burst had nothing to land
in — and a burst with no context reads as nothing at all. The closure
now keeps a small noise floor alive through the gap and the release
burst is audible again. Voiceless finals (/t/, /k/, /p/) are fixed;
voiced /d/ gets a second pass in a future beta — if final /d/ still
sounds softer than you'd like, that's known and on the list.

The 11025 Hz whistle is gone (#104)

At the 11025 Hz sample rate, the sixth parallel formant landed on the
resonator clamp ceiling as one narrow pole and rang out as a pure
whistle over sibilants. It now sits spread just below the ceiling —
the high-frequency shelf survives, the tone does not. Reported by
@gregodejesus2, fixed with a regression test the same day. This
release ships it to sideload and store builds.

Wear OS: officially yes

Beta 6 turned out to run beautifully on watches — TGSpeechBox installs
on Wear OS, registers as a system TTS engine, drives TalkBack, and the
full app UI works on the watch screen. It has been the daily-driver
engine on a Pixel Watch 2 here for a while now, where it comes through
those tiny wrist speakers clearer than the commercial alternative set
to 16 kHz — the same low-sample-rate and clarity work from the last
two betas paying off on the hardest speaker in the roster. Nothing
watch-specific needed changing: minSdk 26 covers Wear OS 3.5 and up.
Play Store watch distribution is being set up; sideloading works
today. If you run TGSpeechBox on a watch, we'd love to hear about it.

Housekeeping: Android 16 target

Google Play requires apps to target Android 16 by August 31. This
build does (versionCode 352 targets SDK 36, built on AGP 8.9.3), and
the native libraries have been 16 KB-page-aligned since Beta 6's
toolchain, so the modern-Android checklist is fully green. Nothing
user-visible — this is the "your updates keep flowing past August"
commit.

Credit where due

The transition-timing rules in this beta came out of the primary
literature — Klatt (1980), Klatt & Klatt (1990), and the DECtalk
design lineage. Thanks to Christopher Toth, (@ctoth) whose meticulous research
notes on that lineage helped point us at the right questions to ask.
And the day's detective work rode on tooling built in earlier cycles:
the frame-stream dumps that separate frontend from DSP guilt in one
render caught this bug in minutes.

What we need from you

  • Slow-rate listeners: set your rate somewhere between 5% and 25%
    and listen to words with b/d/g in the middle — "able", "table",
    "anybody". The ghost between syllables should be gone and endings
    should feel defined. Tell us if any echo-like artifact survives
    anywhere.
  • Vsevolod and anyone who noticed weak finals: "cat", "take",
    "bad" at your normal rate — are the endings back?
  • 11025 Hz users: sibilants should have no whistle riding on top.
  • Watch wearers: any Wear OS device, any experience report — this
    is a brand-new platform for us and every data point matters.

Deferred (carried forward)

  • Voiced word-final /d/ round two
  • endCb1/2/3 per-phoneme bandwidth evolution (Stevens 1998)
  • Croatian #99 items; Spanish "siguiente" /ʝ/ split (#20)
  • /o-ɣ-o/ Kingston perceptual integration trap (diálogo)

A note on the model this round

This entire beta — the echo hunt from first repro to root cause, the
two timing changes, nine new regression tests, and the Android 16
packaging — was one early morning's session with Fable 5. The echo went from
"I hear something weird at slow rates" to committed-with-tests in
about two hours, because the measurement said exactly where to look:
LPC on the ghost matched the previous vowel's formants, not the
closure's, and that one number named the guilty code path. Slow,
methodical, and this time also fast.

Links

Join the Test

— Tamas + Claudeo (Fable 5, 1M context)