Skip to content

Releases: maxwhipw/marmalade-tts-android-engines

v29: Pocket TTS (English, 2026-09), faster to install

Choose a tag to compare

@maxwhipw maxwhipw released this 13 Oct 04:05

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

Choose a tag to compare

@maxwhipw maxwhipw released this 11 Oct 04:17

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 .ort format for ARM:
    • gen.ort: the iSTFTNet vocoder. Its InstanceNorm layers take statistics from genstats/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

Choose a tag to compare

@maxwhipw maxwhipw released this 10 Oct 11:03

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-09 weights (CC-BY-4.0), taken
    from kyutai/pocket-tts-without-voice-cloning and 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

Choose a tag to compare

@maxwhipw maxwhipw released this 10 Oct 05:25

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 .ort format for ARM:
    • gen.ort — the iSTFTNet vocoder. Its InstanceNorm layers take per-voice statistics from genstats/<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-data copy 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)

Choose a tag to compare

@maxwhipw maxwhipw released this 04 Oct 02:24

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.md in the app repo.
  • German-only; the app phonemizes it through its own espeak-ng de path, so the bundle ships no lexicon-zh.txt or openjtalk_dic.

Download 166.0 MB.

sha256: 8ab002715bd8922ab9c14d2b1818b79a498f842b0c0e2f9a8b39ff541c06c726

v24: Jenny (Dioco) English VITS voice pack

Choose a tag to compare

@maxwhipw maxwhipw released this 04 Oct 02:22

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, with MODEL_CARD and PROVENANCE.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.md in the app repo.

Download 58.4 MB.

sha256: 56392403ed64cd4f6bb316322904cab04b695cb1324581efd9d3a115c7c9f261

v23: Kokoro selectively-quantized int8 — 46% smaller, same quality, faster

Choose a tag to compare

@maxwhipw maxwhipw released this 02 Aug 04:11

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

Choose a tag to compare

@maxwhipw maxwhipw released this 11 Jul 21:24

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-data regenerated from the espeak-ng 1.52.0 source tag (the exact tag pinned as the app's third_party/espeak-ng submodule 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)

Choose a tag to compare

@maxwhipw maxwhipw released this 09 Jun 04:32

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 — sha256 3a3ed2810afbae1f963f4f4e3ebde767c2d3c7c622cc544f23170f0ca755b452 (97 MB compressed, 217 MB installed)

v20: Kitten Direct Mini — voice-order fix

Choose a tag to compare

@maxwhipw maxwhipw released this 28 May 07:09

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).