317 lines
14 KiB
Plaintext
317 lines
14 KiB
Plaintext
|
Metadata-Version: 2.1
|
|||
|
Name: gruut-ipa
|
|||
|
Version: 0.13.0
|
|||
|
Summary: Library for manipulating pronunciations using the International Phonetic Alphabet (IPA)
|
|||
|
Home-page: https://github.com/rhasspy/gruut-ipa
|
|||
|
Author: Michael Hansen
|
|||
|
Author-email: mike@rhasspy.org
|
|||
|
Classifier: Programming Language :: Python :: 3
|
|||
|
Classifier: Programming Language :: Python :: 3.6
|
|||
|
Classifier: Programming Language :: Python :: 3.7
|
|||
|
Classifier: Programming Language :: Python :: 3.8
|
|||
|
Classifier: Programming Language :: Python :: 3.9
|
|||
|
Classifier: License :: OSI Approved :: MIT License
|
|||
|
Requires-Python: >=3.6
|
|||
|
Description-Content-Type: text/markdown
|
|||
|
License-File: LICENSE
|
|||
|
Requires-Dist: dataclasses ; python_version<"3.7"
|
|||
|
|
|||
|
# Gruut IPA
|
|||
|
|
|||
|
Library for manipulating [International Phonetic Alphabet](https://en.wikipedia.org/wiki/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:
|
|||
|
* IPA
|
|||
|
* [espeak](https://github.com/espeak-ng/)
|
|||
|
* [sampa](https://www.phon.ucl.ac.uk/home/sampa/)
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
```sh
|
|||
|
$ pip install gruut-ipa
|
|||
|
```
|
|||
|
|
|||
|
## Dependencies
|
|||
|
|
|||
|
* Python 3.6 or higher
|
|||
|
|
|||
|
For command-line usage, you may also want:
|
|||
|
|
|||
|
* [espeak](https://github.com/espeak-ng/)
|
|||
|
* [jq](https://stedolan.github.io/jq/)
|
|||
|
|
|||
|
Install these with:
|
|||
|
|
|||
|
```sh
|
|||
|
$ sudo apt-get install espeak jq
|
|||
|
```
|
|||
|
|
|||
|
## Phones and Phonemes
|
|||
|
|
|||
|
![IPA phones](img/ipa.png)
|
|||
|
|
|||
|
Phones in IPA are composed of different components:
|
|||
|
|
|||
|
* Letters
|
|||
|
* [Non-combining](https://en.wikipedia.org/wiki/Character_(computing)#Terminology) Unicode characters that represent a distinct human sound (phone)
|
|||
|
* Suprasegmentals
|
|||
|
* [Non-combining](https://en.wikipedia.org/wiki/Character_(computing)#Terminology) Unicode characters that represent language features above individual vowels or consonants
|
|||
|
* Stress (ˈˌ), elongation (ː), linking/ties (t͡s), and short/long breaks (| ‖) are suprasegmentals
|
|||
|
* Diacritics
|
|||
|
* [Combining characters](https://en.wikipedia.org/wiki/Combining_character) that provide additional information about a phone's pronunciation, such as [nasalation](https://en.wikipedia.org/wiki/Nasalization)
|
|||
|
|
|||
|
See [IPA Chart](https://www.ipachart.com/) 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](https://en.wikipedia.org/wiki/Standard_German_phonology) 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](https://en.wikipedia.org/wiki/Diphthong) `aʊ` 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:
|
|||
|
|
|||
|
```text
|
|||
|
<phoneme> <example> [<replace> ...]
|
|||
|
```
|
|||
|
|
|||
|
where `<phoneme>` is a set of IPA letters, like `ɶ` or `aʊ`. 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:
|
|||
|
|
|||
|
```text
|
|||
|
r brot χ ʁ ɹ ʀ
|
|||
|
```
|
|||
|
|
|||
|
Phonemes for a given language come from [phonological analyses](https://en.wikipedia.org/wiki/Template:Language_phonologies) and from [public databases](https://phoible.org/). Ultimately, they are geared towards capturing pronunciations from [Wiktionary](https://www.wiktionary.org/).
|
|||
|
|
|||
|
## Usage
|
|||
|
|
|||
|
Print JSON information about phones:
|
|||
|
|
|||
|
```sh
|
|||
|
$ 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:
|
|||
|
|
|||
|
```sh
|
|||
|
$ 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:
|
|||
|
|
|||
|
```sh
|
|||
|
$ python3 -m gruut_ipa phonemes en-us "/dʒʌst ə kaʊ/"
|
|||
|
d͡ʒ ʌ s t ə k aʊ
|
|||
|
```
|
|||
|
|
|||
|
Convert between IPA, [espeak](https://github.com/espeak-ng/), and [sampa](https://www.phon.ucl.ac.uk/home/sampa/):
|
|||
|
|
|||
|
```sh
|
|||
|
$ 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:
|
|||
|
|
|||
|
```sh
|
|||
|
$ 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](https://github.com/gooofy/zamia-speech) (`en-us/zamia`)
|
|||
|
* Swahili (`sw`)
|
|||
|
* [ALFFA](http://alffa.imag.fr/) (`sw/alffa`)
|
|||
|
|
|||
|
Convert from IPA to alternative phoneme set:
|
|||
|
|
|||
|
```sh
|
|||
|
$ 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:
|
|||
|
|
|||
|
```sh
|
|||
|
$ 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](https://github.com/espeak-ng/) pronounce IPA. You may need to `apt-get install espeak` first.
|
|||
|
|
|||
|
```sh
|
|||
|
$ 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:
|
|||
|
|
|||
|
```sh
|
|||
|
$ 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](https://stedolan.github.io/jq/):
|
|||
|
|
|||
|
```sh
|
|||
|
$ 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<trl> | B\\ | voiced bilabial trill |
|
|||
|
| r | r<trl> | 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.
|