Phonemizer language coverage
dengjen-tts phonemizes text through three dedicated crates under crates/text/
(dengjen-espeak-phonemizer, dengjen-hebrew-phonemizer, dengjen-pinyin-phonemizer) that
Piper, Kokoro, and MeloTTS each call directly rather than through a shared Phonemizer trait
(see Architecture for why). Language support is therefore a property of
which phonemizer a voice manifest selects, not a single project-wide language list.
What’s actually wired up today
| Backend | Phonemizer | Language coverage |
|---|---|---|
Piper |
|
Whatever espeak-ng voice the manifest’s |
Piper |
|
None — raw passthrough, for voices already trained on phonemic/symbol text. |
Piper |
|
Hebrew only (Nakdimon diacritization + IPA; needs the |
Piper |
|
Mandarin Chinese only. |
Kokoro |
Derived from the selected voice’s name prefix, not manifest-configurable |
|
MeloTTS |
|
English, Spanish, French, Japanese, Korean. |
MeloTTS |
|
Mandarin Chinese, with real tone extraction (needs the |
MeloTTS’s pinyin path and Piper’s hebrew/pinyin paths are the only ones with dedicated,
tone- or diacritic-aware handling; espeak-backed paths get IPA phonemes only.
espeak-ng’s full language list
Piper’s espeak phoneme type and MeloTTS’s espeak phonemizer both accept any language/locale
code espeak-ng itself ships. The list below is extracted directly from
dengjen-espeak-rs-sys’s bundled `espeak-ng-data/lang/ (the actual fork this project vendors),
not from upstream espeak-ng documentation, so it reflects what’s really available at runtime:
ab, af, am, an, ar, as, az, ba, be, bg, bn, bpy, bs, ca, ca-ba, ca-nw, ca-va, chr, cmn, cmn-Latn-pinyin, crh, cs, cv, cy, da, de, el, en, en-029, en-GB-scotland, en-GB-x-gbclan, en-GB-x-gbcwmd, en-GB-x-rp, en-Shaw, en-US, en-US-nyc, eo, es, es-419, et, eu, fa, fa-Latn, fi, fo, fr, fr-BE, fr-CH, ga, gd, gn, grc, gu, hak, haw, he, hi, hr, ht, hu, hy, hyw, ia, id, io, is, it, ja, jbo, ka, kaa, kk, kl, kn, ko, kok, ku, ky, la, lb, lfn, lt, ltg, lv, mi, mk, ml, mn, mr, ms, mt, mto, my, nb, nci, ne, nl, nog, om, or, pa, pap, piqd, pl, ps, pt, pt-BR, py, qdb, qu, quc, qya, ro, ru, ru-cl, ru-LV, rup, sd, shn, si, sjn, sk, sl, smj, sq, sr, sv, sw, ta, te, th, ti, tk, tn, tr, tt, ug, uk, ur, uz, vi, vi-VN-x-central, vi-VN-x-south, xex, yue, yue-Latn-jyutping
|
This is espeak-ng’s own capability, not a dengjen-tts guarantee. dengjen-tts’s own test suite only exercises English voices end-to-end; any other language on this list will phonemize (espeak-ng supports it), but whether a given Piper or MeloTTS ONNX voice — trained on some specific language’s phoneme set — actually produces intelligible speech from that phonemization is untested by this project and depends entirely on the voice model itself. |
Japanese phonemizer for Kokoro (optional)
Kokoro was trained on misaki phonemes, and eSpeak’s Japanese output approximates them poorly. The
japanese Cargo feature on dengjen-tts-kokoro (forwarded as --features japanese by the CLI,
gRPC, C API and Python frontends) phonemizes j* presets with jpreprocess, a Rust rewrite of
OpenJTalk, and misaki’s katakana-to-phoneme table. Without the feature, j* presets use eSpeak.
The feature needs a jpreprocess-format NAIST-jdic dictionary, which the binary does not bundle.
Download naist-jdic-jpreprocess.tar.gz from the jpreprocess v0.15.0 release (the dictionary
version must match the crate version), extract it, and set DENGJEN_JA_DICT_DIR to the extracted
directory. With the variable unset, a Kokoro config that lists j* voices still loads, and
synthesizing with a j* preset fails with an error naming the variable; other presets are
unaffected. A variable pointing at a directory that is not a valid, matching dictionary fails the
load with an error naming the variable.
Symbols that Kokoro’s vocabulary lacks are remapped (g to ɡ, palatalized consonants to
consonant + ʲ, labialized kw/gw to kᵝ/ɡᵝ), because the tokenizer drops unknown symbols
silently. Pitch accent is not
encoded in the phonemes, matching misaki.