#213·moonshine

German dict uses ʁ instead of r

Author: cryptomilkCreated Aug 5, 2026Updated Aug 6, 2026

dict.tsv always writes the German rhotic as ʁ. It does this in every position. Real German does not work that way.

wäre     -> ˈvɛːʁə
Zwerge   -> ˈt͡svɛʁɡə
Regina   -> ʁeˈɡiːna

espeak-ng never uses ʁ. It uses four different sounds instead. The sound depends on position.

$ espeak-ng -v de -q --ipa "Regina"
rˈeːɡiːnˌɑː
$ espeak-ng -v de -q --ipa "wäre"
vˈɛːrə
$ espeak-ng -v de -q --ipa "Zwerge"
tsvˈɛɾɡə
$ espeak-ng -v de -q --ipa "Wärter"
vˈɛɾtɜ
  • Plain r at the start of a syllable. This includes word-initial position ("Regina"). It also includes the position between two vowels ("wäre"). German syllable rules put a consonant between two vowels at the start of the next syllable.
  • Tap ɾ at the end of a syllable, right before another consonant. Example: "Zwerge" -> ɛɾɡ. Also the first r in "Wärter" -> ɛɾt.
  • A vowel, ɐ or ɜ, for the unstressed "-er" ending. Example: the second r in "Wärter" -> .

dict.tsv collapses all four into one symbol. This breaks a Kokoro voice (df_kerstin) fine-tuned on real espeak-ng output. We confirmed the cause directly. Its training script (kikiri-tts/scripts/prepare_dataset.py) calls misaki.espeak.EspeakG2P(language="de"). That call does not remap the rhotic at all. We checked misaki/espeak.py's e2m table. It only remaps affricates, not r/ɾ/ɐ/ɜ. So the model never saw ʁ in these positions during training.

Where it breaks

Confirmed by ear against df_kerstin:

  • ʁ between two vowels: clearly broken. "wäre", "Haare", "goren", "Floris", "anderem" all come out wrong. The ʁ sounds like a ch consonant. Extra syllables sometimes appear too. "wäre" sounds like "wärche". "Floris" sounds like "Florchis".
  • ʁ before a consonant: also broken, in short common words. "Zwerge", "Bärme", "Ärmel", "Gärten", "Wurf" all get the same ch-like mispronunciation. Some gain a whole extra garbled syllable. Example: "Gärten" sounds like "Gächtnä". In longer, less common words in the same position, the problem is fainter. Examples: "Augsburg", "Wismars", "Norberts". One listen even caught faint noise right after "Wismars"' final s. Severity varies. The underlying symbol mismatch is the same.
  • ʁ at the start of a syllable: sounds fine. This is true even in clusters like ///. Confirmed: "Regina", "Kraft", "Frau", "Drache", "Bringen" all sound correct as-is.

We first guessed this was about stress. It isn't. "Norberts" has a stressed ʁ in the same shape as "Zwerge". But it sounds fine. "anderem" has an unstressed ʁ. But it's broken. Position decides which sound applies. Stress does not.

Fix: pick the rhotic by position

Not a blanket "use r instead of ʁ". That would be wrong for the before-a-consonant case. That case needs tap ɾ, not r.

  • ʁ at the start of a syllable: leave it, or normalize to r/ɾ. Not broken either way.
  • ʁ after a vowel, before another vowel: use r.
  • ʁ after a vowel, before a consonant or word end: use tap ɾ.
  • Leave the dictionary's existing ɐ/ɐ̯ "-er" endings alone. They're already roughly correct.