282 lines
9.3 KiB
Python
282 lines
9.3 KiB
Python
|
#!/usr/bin/env python3
|
|||
|
"""Tests for phonemization"""
|
|||
|
import unittest
|
|||
|
|
|||
|
from gruut import sentences
|
|||
|
|
|||
|
# Translation from https://omniglot.com for:
|
|||
|
# My hovercraft is full of eels.
|
|||
|
|
|||
|
|
|||
|
class PhonemizerTestCase(unittest.TestCase):
|
|||
|
"""Test cases for phonemization"""
|
|||
|
|
|||
|
def test_ar(self):
|
|||
|
"""Arabic test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("حَوّامتي مُمْتِلئة", "ar"),
|
|||
|
[
|
|||
|
("حَوَّامَتُي", ["ħ", "a", "u", "aː", "m", "t", "iː"]),
|
|||
|
("مُمْتِلِئَة", ["m", "u", "m", "t", "i", "l", "i", "ʔ", "i"],),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_cs(self):
|
|||
|
"""Czech test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("Moje vznášedlo je plné úhořů.", "cs-cz"),
|
|||
|
[
|
|||
|
("Moje", ["m", "o", "j", "ɛ"]),
|
|||
|
("vznášedlo", ["v", "z", "n", "aː", "ʃ", "ɛ", "d", "l", "o"]),
|
|||
|
("je", ["j", "ɛ"]),
|
|||
|
("plné", ["p", "l", "n", "ɛː"]),
|
|||
|
("úhořů", ["uː", "ɦ", "o", "r̝", "uː"]),
|
|||
|
(".", ["‖"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_de_us(self):
|
|||
|
"""German test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("Mein Luftkissenfahrzeug ist voller Aale.", "de_DE"),
|
|||
|
[
|
|||
|
("Mein", ["m", "aɪ̯", "n"]),
|
|||
|
(
|
|||
|
"Luftkissenfahrzeug",
|
|||
|
[
|
|||
|
"l",
|
|||
|
"ʊ",
|
|||
|
"f",
|
|||
|
"t",
|
|||
|
"k",
|
|||
|
"ɪ",
|
|||
|
"s",
|
|||
|
"z",
|
|||
|
"ɛ",
|
|||
|
"n",
|
|||
|
"f",
|
|||
|
"a",
|
|||
|
"ʁ",
|
|||
|
"t",
|
|||
|
"s",
|
|||
|
"ɔ",
|
|||
|
"ɔʏ̯",
|
|||
|
"k",
|
|||
|
],
|
|||
|
),
|
|||
|
("ist", ["ɪ", "s", "t"]),
|
|||
|
("voller", ["v", "ɔ", "l", "l", "ɐ"]),
|
|||
|
("Aale", ["ʔ", "aː", "l", "ə"]),
|
|||
|
(".", ["‖"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_en_us(self):
|
|||
|
"""English test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("My hovercraft is full of eels.", "en_US"),
|
|||
|
[
|
|||
|
("My", ["m", "ˈaɪ"]),
|
|||
|
("hovercraft", ["h", "ˈʌ", "v", "ɚ", "k", "ɹ", "ˌæ", "f", "t"],),
|
|||
|
("is", ["ˈɪ", "z"]),
|
|||
|
("full", ["f", "ˈʊ", "l"]),
|
|||
|
("of", ["ə", "v"]),
|
|||
|
("eels", ["ˈi", "l", "z"]),
|
|||
|
(".", ["‖"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_es(self):
|
|||
|
"""Spanish test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("Mi aerodeslizador está lleno de anguilas.", "es_ES"),
|
|||
|
[
|
|||
|
("Mi", ["m", "i"]),
|
|||
|
(
|
|||
|
"aerodeslizador",
|
|||
|
[
|
|||
|
"a",
|
|||
|
"e",
|
|||
|
"ɾ",
|
|||
|
"o",
|
|||
|
"d",
|
|||
|
"e",
|
|||
|
"s",
|
|||
|
"l",
|
|||
|
"i",
|
|||
|
"θ",
|
|||
|
"a",
|
|||
|
"d",
|
|||
|
"o",
|
|||
|
"ɾ",
|
|||
|
],
|
|||
|
),
|
|||
|
("está", ["e", "s", "t", "a"]),
|
|||
|
("lleno", ["ʎ", "e", "n", "o"]),
|
|||
|
("de", ["d", "e"]),
|
|||
|
("anguilas", ["a", "n", "g", "i", "l", "a", "s"]),
|
|||
|
(".", ["‖"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_fa(self):
|
|||
|
"""Farsi test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("هاورکرافت من پر مارماهى است", "fa"),
|
|||
|
[
|
|||
|
(
|
|||
|
"هاورکرافت",
|
|||
|
["h", "ɒː", "v", "æ", "ɾ", "k", "æ", "ɾ", "ɒː", "f", "t", "e̞"],
|
|||
|
),
|
|||
|
("من", ["m", "æ", "n"],),
|
|||
|
("پر", ["p", "o", "ɾ"]),
|
|||
|
("مارماهى", ["m", "ɒː", "ɾ", "æ", "m", "ɒː", "h", "e̞", "l"]),
|
|||
|
("است", ["æ", "s", "t"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_fr(self):
|
|||
|
"""French test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("Mon aéroglisseur est plein d'anguilles.", "fr_FR"),
|
|||
|
[
|
|||
|
("Mon", ["m", "ɔ̃", "n"]),
|
|||
|
("aéroglisseur", ["a", "e", "ʁ", "ɔ", "ɡ", "l", "i", "s", "œ", "ʁ"],),
|
|||
|
("est", ["ɛ"]),
|
|||
|
("plein", ["p", "l", "ɛ̃"]),
|
|||
|
("d'anguilles", ["d", "ɑ̃", "ɡ", "i", "j"]),
|
|||
|
(".", ["‖"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_it(self):
|
|||
|
"""Italian test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("Il mio hovercraft è pieno di anguille.", "it_IT"),
|
|||
|
[
|
|||
|
("Il", ["i", "l"]),
|
|||
|
("mio", ["ˈm", "i", "o"],),
|
|||
|
("hovercraft", ["o", "v", "e", "r", "k", "r", "a", "f", "t"]),
|
|||
|
("è", ["ɛ"]),
|
|||
|
("pieno", ["ˈp", "j", "ɛ", "n", "o"]),
|
|||
|
("di", ["ˈd", "i"]),
|
|||
|
("anguille", ["a", "n", "ɡ", "w", "i", "l", "l", "e"]),
|
|||
|
(".", ["‖"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_lb(self):
|
|||
|
"""Luxembourgish test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes(
|
|||
|
"An der Zäit hunn sech den Nordwand an d’Sonn gestridden.", "lb_LB"
|
|||
|
),
|
|||
|
[
|
|||
|
("An", ["ɑ", "n"]),
|
|||
|
("der", ["d", "ɐ"],),
|
|||
|
("Zäit", ["ʦ", "æːɪ", "t"]),
|
|||
|
("hunn", ["h", "u", "n"]),
|
|||
|
("sech", ["z", "ə", "ɕ"]),
|
|||
|
("den", ["d", "ə", "n"]),
|
|||
|
("Nordwand", ["n", "o", "ʀ", "d", "v", "ɑ", "n", "t"]),
|
|||
|
("an", ["ɑ", "n"]),
|
|||
|
("d'Sonn", ["d", "z", "o", "n"]),
|
|||
|
("gestridden", ["g", "ə", "ʃ", "t", "ʀ", "i", "d", "ə", "n"]),
|
|||
|
(".", ["‖"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_nl(self):
|
|||
|
"""Dutch test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("Mijn luchtkussenboot zit vol paling.", "nl"),
|
|||
|
[
|
|||
|
("Mijn", ["m", "ɛi", "n"]),
|
|||
|
(
|
|||
|
"luchtkussenboot",
|
|||
|
["ˈl", "ʏ", "x", "t", "k", "ʏ", "s", "ə", "n", "ˌb", "o", "t"],
|
|||
|
),
|
|||
|
("zit", ["z", "ɪ", "t"]),
|
|||
|
("vol", ["v", "ɔ", "l"]),
|
|||
|
("paling", ["p", "a", "l", "ɪ", "ŋ"]),
|
|||
|
(".", ["‖"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_pt(self):
|
|||
|
"""Portuguese test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("O meu hovercraft está cheio de enguias.", "pt"),
|
|||
|
[
|
|||
|
("O", ["u"]),
|
|||
|
("meu", ["m", "ew"],),
|
|||
|
("hovercraft", ["o", "v", "e", "ɹ", "k", "ɾ", "ɐ", "f", "t", "ʃ"]),
|
|||
|
("está", ["e", "s", "t", "ɐ"]),
|
|||
|
("cheio", ["ʃ", "ej", "u"]),
|
|||
|
("de", ["d", "ʒ", "i"]),
|
|||
|
("enguias", ["ẽ", "ɡ", "j", "ɐ", "s"]),
|
|||
|
(".", ["‖"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_ru(self):
|
|||
|
"""Russian test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("Моё судно на воздушной подушке полно угрей.", "ru_RU"),
|
|||
|
[
|
|||
|
("Моё", ["m", "o", "j", "oː"]),
|
|||
|
("судно", ["s", "uː", "d", "n", "o"],),
|
|||
|
("на", ["n", "aː"]),
|
|||
|
("воздушной", ["v", "o", "z", "d", "uː", "ʂ", "n", "o", "j"]),
|
|||
|
("подушке", ["p", "o", "d", "uː", "ʂ", "kʲ", "e"]),
|
|||
|
("полно", ["p", "oː", "l", "n", "o"]),
|
|||
|
("угрей", ["u", "ɡ", "rʲ", "eː", "j"]),
|
|||
|
(".", ["‖"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_sv(self):
|
|||
|
"""Swedish test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("Min svävare är full med ål.", "sv_SE"),
|
|||
|
[
|
|||
|
("Min", ["m", "iː", "n"]),
|
|||
|
("svävare", ["²s", "v", "'ɛː", "v", "a", "r", "ɛ"],),
|
|||
|
("är", ["ɛː", "r"]),
|
|||
|
("full", ["f", "ɵ", "l"]),
|
|||
|
("med", ["m", "eː", "d"]),
|
|||
|
("ål", ["oː", "l"]),
|
|||
|
(".", ["‖"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
def test_sw(self):
|
|||
|
"""Swahili test"""
|
|||
|
self.assertEqual(
|
|||
|
get_phonemes("Gari langu linaloangama limejaa na mikunga.", "sw"),
|
|||
|
[
|
|||
|
("Gari", ["ɠ", "ɑ", "ɾ", "i"]),
|
|||
|
("langu", ["l", "ɑ", "ᵑg", "u"],),
|
|||
|
(
|
|||
|
"linaloangama",
|
|||
|
["l", "i", "n", "ɑ", "l", "ɔ", "ɑ", "ᵑg", "ɑ", "m", "ɑ"],
|
|||
|
),
|
|||
|
("limejaa", ["l", "i", "m", "ɛ", "ʄ", "ɑ", "ɑ"]),
|
|||
|
("na", ["n", "ɑ"]),
|
|||
|
("mikunga", ["m", "i", "k", "u", "ᵑg", "ɑ"]),
|
|||
|
(".", ["‖"]),
|
|||
|
],
|
|||
|
)
|
|||
|
|
|||
|
|
|||
|
def get_phonemes(text, lang):
|
|||
|
"""Return (text, phonemes) for each word"""
|
|||
|
sentence = next(sentences(text, lang=lang))
|
|||
|
return [(w.text, w.phonemes) for w in sentence if w.phonemes]
|
|||
|
|
|||
|
|
|||
|
# -----------------------------------------------------------------------------
|
|||
|
|
|||
|
if __name__ == "__main__":
|
|||
|
unittest.main()
|