Repository navigation
Releases: maxwhipw/marmalade-tts-android-engines
Release list
v29: Pocket TTS (English, 2026-09), faster to install
pocket-tts-en-v2026_09-mixed.tar.gz, 118,458,315 bytes,
sha256 dd276be0eff361f58ce1ef7ef3dd56c3cbeca1616892c172b7b45bf1f874f647
(224,998,077 bytes unpacked). Downloaded by Marmalade TTS when you install or
update Pocket on the Engines screen.
What's in it
The same files as v27, repacked: the tar inside is v27's
pocket-tts-en-v2026_09-mixed.tar.bz2, byte for byte, now compressed with
gzip instead of bzip2. The model, the ten voices, the ready-made voice
embeddings and their licences are unchanged; see the v27 release for what the
bundle holds. Phones unpack gzip much faster than bzip2, so the install
finishes sooner after the download. The download is 13.8 MB larger than
v27's.
A Pocket already installed from v27 has the same files and needs no update.
Licences and attribution: LICENSES/pocket-tts.md, NOTICE.md and
CREDITS.md in the Marmalade TTS repository.
v28: Kokoro German streams, with a lighter text model — first sound about 3× sooner
Re-spin of the Kokoro German bundle only (other bundles unchanged; apps referencing earlier assets are unaffected).
kokoro-de-v1_0.tar.gz, 153,045,045 bytes,
sha256 3a479a5076776376f9cc583e6c67aa28b60c964bb4ff378cdcb84df93afffe3e.
Downloaded by Marmalade TTS when you install or update Kokoro German on the Engines screen.
What's in it
- The int8
model.onnx(183 MB) is replaced by the same model cut into parts so the app can stream it, in ONNX Runtime's.ortformat for ARM:gen.ort: the iSTFTNet vocoder. Its InstanceNorm layers take statistics fromgenstats/thorsten.bin, fitted to the vocoder's own activations on German text.planner-rest.ort: durations, pitch, the vocoder's front and the harmonic source.textenc.ort: Thorsten's own ALBERT text encoder with mixed int8 weights (the feed-forward expansion stays fp32). Nothing was retrained.
- Against the unsplit model, on 57 held-out German lines, timing differs by 0.04 frames per phoneme (96% unchanged) and pitch by 1.8 Hz on average; Whisper word error rates are unchanged within a word or two.
- On a Pixel 6a (screen off), first sound fell from 2.4 s to 0.8 s on everyday German sentences and from 2.7 s to 1.0 s on long paragraphs. Load time fell from 2.8 s to 1.0 s, and peak memory is 40–160 MB lower. Rendering takes about 55% more processor time per minute of speech.
- Download 166 → 153 MB; installed 183 → 171 MB.
- Needs Marmalade TTS 1.2.0 or later; earlier versions keep using v25.
Everything else (voices.bin, tokens.txt, model-format.txt, MODEL_CARD) is byte-identical to v25; PROVENANCE.md gains a section on the streaming parts.
v27: Pocket TTS (English, 2026-09): five new voices, ready-made voices
pocket-tts-en-v2026_09-mixed.tar.bz2, 104,703,288 bytes,
sha256 00cf24b87111de48717c26a4dcc126f2c80de056b061d5de888dac653f8b1cdf
(224,998,077 bytes unpacked). Downloaded by Marmalade TTS when you install or
update Pocket on the Engines screen.
What's in it
- Model: Kyutai's Pocket TTS
english_2026-09weights (CC-BY-4.0), taken
fromkyutai/pocket-tts-without-voice-cloningand converted to ONNX. The
main transformer is quantized to 8-bit integers and the other graphs stay
32-bit float. The main transformer and the audio decoder size their working
memory to each sentence. - Voices (10): Alba (Alba Mackenna, Kyutai, CC-BY-4.0); Azelma, Eponine
and Fantine (CSTR VCTK Corpus, University of Edinburgh, CC-BY-4.0); Javert
(Unmute voice donation, CC0); and, new in this release, Mary, Rita, Stephen
and Ramone (Kyutai Unmute voice donations, CC0) and Jenny (the Jenny (Dioco)
dataset; its licence requires the voice be called "Jenny"). Marius is no
longer included. - Ready-made voices: each voice's embedding ships precomputed
(voice_cache/<voice>.emb), so the phone doesn't have to prepare a voice
the first time it's used.
Licences and attribution: LICENSES/pocket-tts.md, NOTICE.md and
CREDITS.md in the Marmalade TTS repository.
v26: Kokoro streams, with a lighter text model — first sound about 2.5× sooner
Re-spin of the Kokoro bundle only (other bundles unchanged; apps referencing v21–v25 assets are unaffected).
- kokoro-direct-v1_0.tar.gz — the int8
model.onnx(150 MB) is replaced by the same model cut into parts so the app can stream it, in ONNX Runtime's.ortformat for ARM:gen.ort— the iSTFTNet vocoder. Its InstanceNorm layers take per-voice statistics fromgenstats/<voice>.bin(all 53 voices), fitted to the vocoder's own activations.planner-rest.ort— durations, pitch, the vocoder's front and the harmonic source.textenc.ort— Kokoro's ALBERT text encoder with mixed int8 weights (the feed-forward expansion stays fp32). Used for every language but English.textenc-en.ort— a 3.5M-weight English text encoder trained for Marmalade to reproduce ALBERT's output from the same phoneme tokens. It was trained on Kokoro's own ALBERT outputs over public-domain PG-19 books and CC0 Common Voice sentences, with no audio. Apache-2.0.
- Against the unsplit model, timing differs by 0.14 frames per phoneme on English and at most 0.10 elsewhere, and pitch by 3.6 Hz or less. All 8 languages were checked.
- On a Pixel 6a (screen off), first sound fell from 2.1 s to 0.8 s on everyday English sentences and from 3.7 s to 1.5 s in Spanish. Load time fell from 3.1 s to 1.0 s, and peak memory is 110–230 MB lower.
- The unused
phonemizer/espeak-ng-datacopy is dropped: the app reads the espeak-ng data built into it. - Download 194 → 195 MB; installed 306 MB, as before.
- Needs Marmalade TTS 1.2.0 or later; earlier versions keep using v23.
Everything else (voices.bin, tokens.txt, lexicon-zh.txt, model-format.txt, openjtalk_dic) is byte-identical to v23.
sha256: d7e2aff992264e2ea8b8b703aa9d6fc24ba7ef039633183f572dcc793cb31047
v25: Kokoro German engine (Thorsten)
Native German engine Kokoro German (kokoro-de-v1_0) for Marmalade TTS 1.1.0 and later.
- kokoro-de-v1_0.tar.gz — Thorsten-Voice/Kokoro, a German fine-tune of Kokoro-82M with one speaker (Thorsten), as a static QDQ int8 build:
model.onnx,voices.bin,tokens.txt,model-format.txt,MODEL_CARD,PROVENANCE.md. Models and data only; no executable code. - Apache-2.0 (Thorsten-Voice / Thorsten Müller). Details:
LICENSES/kokoro-de.mdin the app repo. - German-only; the app phonemizes it through its own espeak-ng
depath, so the bundle ships nolexicon-zh.txtoropenjtalk_dic.
Download 166.0 MB.
sha256: 8ab002715bd8922ab9c14d2b1818b79a498f842b0c0e2f9a8b39ff541c06c726
v24: Jenny (Dioco) English VITS voice pack
English VITS voice pack for the VITS Marmalade engine (Marmalade TTS 1.1.0 and later).
- en-jenny_dioco-medium.tar.gz — the "Jenny (Dioco)" English voice:
model.onnx+model.onnx.json, withMODEL_CARDandPROVENANCE.md. Models and data only; no executable code. - Weights by Bryce Beattie, trained on the Jenny dataset by dioco-group. Both carry custom attribution licenses; the voice must be credited "Jenny (Dioco)". Full texts:
LICENSES/vits-marmalade.mdin the app repo.
Download 58.4 MB.
sha256: 56392403ed64cd4f6bb316322904cab04b695cb1324581efd9d3a115c7c9f261
v23: Kokoro selectively-quantized int8 — 46% smaller, same quality, faster
Re-spin of the Kokoro bundle only (Kitten/Pocket bundles unchanged; apps referencing v21/v22 assets are unaffected).
- kokoro-direct-v1_0.tar.gz — the fp32
model.onnx(326 MB) is replaced by a selectively-quantized static QDQ int8 build of the same graph (150 MB): per-channel weights, calibrated on 32 texts × 3 voices, with a 118-node exclusion list derived from a per-node mel-loss sensitivity sweep (the vocoder's boundary convs, the ALBERT text encoder, and the last-upsample-stage resblock convs stay fp32; LSTMs are never quantized). - Ear-verified indistinguishable from fp32; measures below the mel-distance of already-shipping quantized TTS references.
- Faster than fp32 on x86 (−11% RTF); Android measurement in the app's debug quant bench.
- Download 360 → 194 MB; installed 481 → 306 MB.
Everything else in the bundle (voices.bin, tokens.txt, lexicon-zh.txt, openjtalk_dic, espeak-ng-data) is byte-identical to v22.
sha256: 8e8752c9ec937dd2842510b65a195ee48f2e2ddc7a2c69a478d281fefdd64770
v22: no executable code at rest — drop legacy libttsespeak.so; espeak-ng-data rebuilt from 1.52.0
Re-spin of the Kitten, Kitten Mini, and Kokoro bundles:
- Removed
phonemizer/<abi>/libttsespeak.so(both ABIs) from all three bundles. The app has compiled espeak-ng from source into the APK since v1.0.0-beta.1 and never loads the bundled library; bundles now contain only models and data — no executable code at rest. espeak-ng-dataregenerated from the espeak-ng 1.52.0 source tag (the exact tag pinned as the app'sthird_party/espeak-ngsubmodule and compiled into the APK). This closes the previous lib-1.52/data-1.51 version split.
Provenance: data built from https://github.com/espeak-ng/espeak-ng at tag 1.52.0 via the CMake data target on x86_64 Linux; dictionaries are architecture-independent. Verified against the 1.52.0 binary (--ipa smoke) and on-device.
Pocket TTS is unchanged — v21 remains current for it.
SHA-256:
- kitten-direct-v0_8.tar.gz
591e1e163f7804c9673c8d2b63d6eb5f43bb2f2b620580af84dd32c55b283199 - kitten-direct-mini-v0_8.tar.gz
603aad5ec2eac370b7d69338aa296e0de1276bae91487993f0a8a7d231f855e1 - kokoro-direct-v1_0.tar.gz
039b972081429b9770afc7867ff1874bd9dea39128b972c13853337a1b194ea7
v21: Pocket TTS English — 6 commercial-safe voices (drop cosette/jean)
Pocket TTS English v2026_04 — the v10 mixed bundle re-rolled with 6 commercial-safe voices (the two CC-BY-NC-4.0 voices removed for the public release).
Why
The upstream cosette (from the Expresso dataset) and jean (from the EARS dataset) reference voices are CC-BY-NC-4.0 (non-commercial only) per Kyutai's own pocket_tts/utils/utils.py voice→source map and the kyutai/tts-voices license-by-folder table. They cannot ship on a commercial store, so they are dropped from the shipped bundle.
Retained voices (all commercial-safe)
| Voice | Source | License |
|---|---|---|
alba |
Alba Mackenna | CC-BY-4.0 |
azelma |
VCTK (p303) | CC-BY-4.0 |
eponine |
VCTK (p262) | CC-BY-4.0 |
fantine |
VCTK (p244) | CC-BY-4.0 |
javert |
Unmute Voice Donation | CC0 |
marius |
Unmute Voice Donation | CC0 |
What changed vs v10
Byte-identical to v10 (sha d4faf0e0…, verified) except voices/cosette.wav + voices/jean.wav are removed and bundle.json#predefined_voices drops those two names. The model graphs, tokenizer, and all other voices are unchanged.
The Kyutai model code is MIT (not Apache-2.0); voices are per-voice as above.
Checksums
pocket-tts-en-v2026_04-mixed.tar.bz2— sha2563a3ed2810afbae1f963f4f4e3ebde767c2d3c7c622cc544f23170f0ca755b452(97 MB compressed, 217 MB installed)
v20: Kitten Direct Mini — voice-order fix
Fixes the wrong-voice bug in v19's Kitten Direct Mini bundle.
v19 split sherpa's flattened voices.bin in ls-alphabetical order, but sherpa concatenates the upstream voices.npz arrays in their native insertion order (male-first per pair: expr-voice-2-m, 2-f, 3-m, 3-f, …). Every per-voice .bin was therefore mapped to the wrong speaker.
v20 extracts each voice directly from the named upstream voices.npz (KittenML/kitten-tts-mini-0.8), using the displayName↔key mapping recovered by byte-matching the known-good nano Kitten Direct voices. Verified: all 8 voices distinct and name-correct; the flattened blob reconstructs exactly from the named arrays.
Mapping: Bella=2-f, Jasper=2-m, Luna=3-f, Bruno=3-m, Rosie=4-f, Hugo=4-m, Kiki=5-f, Leo=5-m. Otherwise identical to v19 (same ONNX, espeak-ng GPL-3.0 phonemizer, speed prior 1.0).