Skip to content

Python library for manipulating pronunciations using the International Phonetic Alphabet (IPA)

License

Notifications You must be signed in to change notification settings

rhasspy/gruut-ipa

Repository files navigation

Gruut IPA

Library for manipulating International Phonetic Alphabet (IPA) pronunciations.

Features include:

  • Getting the category and details of a phone, e.g. "open front unrounded vowel" for ɶ
  • Splitting IPA pronunciations into groups of:
    • Phones (/ˈt͡ʃuːz/ to ˈt͡ʃ uː z )
    • Phonemes (/kˈaʊ/ to k ˈaʊ for U.S. English)
  • Converting pronunciations between:

Supported Languages:

  • Arabic (ar)
  • Czech (cs-cz)
  • German (de-de)
  • U.S. English (en-us)
  • U.K. English (en-gb)
  • Spanish (es-es)
  • Persian/Farsi (fa)
  • Spanish (es-es)
  • Italian (it-it)
  • Luxembourgish (lb-lb)
  • Dutch (nl)
  • Portuguese (pt)
  • Russian (ru-ru)
  • Swahili (sw)

Installing

$ pip install gruut-ipa

Dependencies

  • Python 3.6 or higher

For command-line usage, you may also want:

Install these with:

$ sudo apt-get install espeak jq

Phones and Phonemes

IPA phones

Phones in IPA are composed of different components:

  • Letters
    • Non-combining Unicode characters that represent a distinct human sound (phone)
  • Suprasegmentals
    • Non-combining Unicode characters that represent language features above individual vowels or consonants
    • Stress (ˈˌ), elongation (ː), linking/ties (t͡s), and short/long breaks (| ‖) are suprasegmentals
  • Diacritics

See IPA Chart for more details.

Phonemes

While phones represent individual sounds, phonemes are the phonetic units of a language that meaningfully distinguish words. A phoneme may be realized by many different phones. For example, the /r/ in Standard German can be realized as a uvular fricative (χ/ʁ), a uvular approximant (ɹ), or a uvular tap or trill (ʀ/r).

A phoneme may also be composed of multiple phones, such as the dipthong in U.S. English (the "ow" in "cow").

Supported languages in gruut-ipa contain a phonemes.txt file in the gruut_ipa/data directory. This file has the following format:

<phoneme> <example> [<replace> ...]

where <phoneme> is a set of IPA letters, like ɶ or . The <example> is a word whose pronunciation contains the <phoneme>. After that, there are one or more optional <replace> strings that will be replaced with <phoneme>. The German /r/ example from above might be represented as:

r brot χ ʁ ɹ ʀ

Phonemes for a given language come from phonological analyses and from public databases. Ultimately, they are geared towards capturing pronunciations from Wiktionary.

Usage

Print JSON information about phones:

$ python3 -m gruut_ipa describe "ˈãː" | jq .
{
  "text": "ˈãː",
  "letters": "a",
  "stress": "primary",
  "height": "open",
  "placement": "front",
  "rounded": false,
  "type": "Vowel",
  "nasalated": true,
  "elongated": true
}

Split an IPA pronunciation into phones:

$ python3 -m gruut_ipa phones "ˈjɛs|ˈt͡ʃuːz aɪpiːeɪ‖"
ˈj ɛ s | ˈt͡ʃ uː z a ɪ p iː e ɪ ‖

Group phones into phonemes for a specific language:

$ python3 -m gruut_ipa phonemes en-us "/dʒʌst ə kaʊ/"
d͡ʒ ʌ s t ə k aʊ

Convert between IPA, espeak, and sampa:

$ python3 -m gruut_ipa convert ipa espeak "mʊmˈbaɪ"
[[mUm'baI]]

$ python3 -m gruut_ipa convert espeak ipa "[[D,Is Iz sVm f@n'EtIk t'Ekst 'InpUt]]"
ðˌɪs ɪz sʌm fɘnˈɛtɪk tˈɛkst ˈɪnpʊt

Chain commands together:

$ python3 -m gruut_ipa convert espeak ipa "[[k'aU]]" | \
    python3 -m gruut_ipa phonemes en-us --keep-stress
k ˈaʊ

Alternative Phoneme Sets

Some languages have multiple phoneme sets available:

  • U.S. English (en-us)
    • CMUDict (en-us/cmudict)
    • Zamia (en-us/zamia)
  • Swahili (sw)

Convert from IPA to alternative phoneme set:

$ python3 -m gruut_ipa convert ipa en-us/cmudict "h ɛ l ˈoʊ w ˈɚ l d"
HH EH0 L OW1 W ER1 L D

Convert from alternative phoneme set to IPA:

$ python3 -m gruut_ipa convert en-us/cmudict ipa "HH EH0 L OW1 W ER1 L D"
h ɛ l ˈoʊ w ˈɚ l d

Scripts

Use the speak-ipa script to have espeak pronounce IPA. You may need to apt-get install espeak first.

$ echo '/hɛloʊ wɝld/' | bin/speak-ipa en-us -s 60 -w 'hello world.wav'
$ aplay 'hello world.wav'

Phones

Supported IPA phones can be printed with:

$ python3 -m gruut_ipa print
{"text": "i", "letters": "i", "stress": "none", "height": "close", "placement": "front", "rounded": false, "type": "Vowel", "nasalated": false, "elongated": false, "description": "close front unrounded vowel", "espeak": "i", "sampa": "i"}
{"text": "y", "letters": "y", "stress": "none", "height": "close", "placement": "front", "rounded": true, "type": "Vowel", "nasalated": false, "elongated": false, "description": "close front rounded vowel", "espeak": "y", "sampa": "y"}
...

A nice table can be generated with jq:

$ python3 -m gruut_ipa print | \
    jq -r '. | "\(.text)\t\(.espeak)\t\(.sampa)\t\(.description)"'

Converted to Markdown:

IPA eSpeak Sampa Description
i i i close front unrounded vowel
y y y close front rounded vowel
ɨ i" 1 close central unrounded vowel
ʉ u" } close central rounded vowel
ɯ u- M close back unrounded vowel
u u u close back rounded vowel
ɪ I I near-close near-front unrounded vowel
ʏ I. Y near-close near-front rounded vowel
ʊ U U near-close near-back rounded vowel
e e e close-mid front unrounded vowel
ø Y 2 close-mid front rounded vowel
ɘ @ @\ close-mid central unrounded vowel
ɵ @. 8 close-mid central rounded vowel
ɤ o- 7 close-mid back unrounded vowel
o o o close-mid back rounded vowel
ɛ E E open-mid front unrounded vowel
œ W 9 open-mid front rounded vowel
ɜ V" 3 open-mid central unrounded vowel
ɞ O" 3\ open-mid central rounded vowel
ʌ V V open-mid back unrounded vowel
ɔ O O open-mid back rounded vowel
æ a { near-open front unrounded vowel
ɐ V 6 near-open central unrounded vowel
a a a open front unrounded vowel
ɶ W & open front rounded vowel
ɑ A A open back unrounded vowel
ɒ A. Q open back rounded vowel
m m m voiced bilabial nasal
ɱ M F voiced labio-dental nasal
n n n voiced alveolar nasal
ɳ n. n` voiced retroflex nasal
ŋ N N voiced velar nasal
ɴ n" N\ voiced uvular nasal
p p p voiceless bilabial plosive
b b b voiced bilabial plosive
t t t voiceless alveolar plosive
d d d voiced alveolar plosive
ʈ t. t` voiceless retroflex plosive
ɖ d. d` voiced retroflex plosive
c c c voiceless palatal plosive
ɟ J J\ voiced palatal plosive
k k k voiceless velar plosive
ɡ g g voiced velar plosive
g g g voiced velar plosive
q q q voiceless uvular plosive
ɢ G G\ voiced uvular plosive
ʡ >\ voiceless pharyngeal plosive
ʔ ? ? voiceless glottal plosive
p͡f pf pf voiceless labio-dental affricate
b͡v bv bv voiced dental affricate
t̪͡s ts t_ds voiceless dental affricate
t͡s ts ts voiceless alveolar affricate
d͡z dz dz voiced alveolar affricate
t͡ʃ tS tS voiceless post-alveolar affricate
d͡ʒ dZ dZ voiced post-alveolar affricate
ʈ͡ʂ tS ts` voiceless retroflex affricate
ɖ͡ʐ dz dz` voiced retroflex affricate
t͡ɕ tS; ts\ voiceless palatal affricate
d͡ʑ dZ; dz\ voiced palatal affricate
k͡x k k_x voiceless velar affricate
ɸ F p\ voiceless bilabial fricative
β B B voiced bilabial fricative
f f f voiceless labio-dental fricative
v v v voiced labio-dental fricative
θ T T voiceless dental fricative
ð D D voiced dental fricative
s s s voiceless alveolar fricative
z z z voiced alveolar fricative
ʃ S S voiceless post-alveolar fricative
ʒ Z Z voiced post-alveolar fricative
ʂ s. s` voiceless retroflex fricative
ʐ z. z` voiced palatal fricative
ç C C voiceless palatal fricative
x x x voiceless velar fricative
ɣ Q G voiced velar fricative
χ X X voiceless uvular fricative
ʁ g" R voiced uvular fricative
ħ H X\ voiceless pharyngeal fricative
h h h voiceless glottal fricative
ɦ h<?> h\ voiced glottal fricative
w w w voiced bilabial approximant
ʋ v# v\ voiced labio-dental approximant
ɹ r r\ voiced alveolar approximant
ɻ r. r\` voiced retroflex approximant
j j j voiced palatal approximant
ɰ Q M\ voiced velar approximant
voiced labio-dental flap
ɾ * 4 voiced alveolar flap
ɽ *. r` voiced retroflex flap
ʙ b B\ voiced bilabial trill
r r r voiced alveolar trill
ʀ r" R\ voiced uvular trill
l l l voiced alveolar lateral-approximant
ɫ l 5 voiced alveolar lateral-approximant
ɭ l. l` voiced retroflex lateral-approximant
ʎ l^ L voiced palatal lateral-approximant
ʟ L L\ voiced velar lateral-approximant
ə @ @ schwa
ɚ 3 @` r-coloured schwa
ɝ 3 @` r-coloured schwa
ɹ̩ r- r\̩ voiced alveolar approximant

If you see anything wrong or missing, please let me know.

About

Python library for manipulating pronunciations using the International Phonetic Alphabet (IPA)

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages