import unittest from TTS.tts.utils.text.characters import BaseCharacters, Graphemes, IPAPhonemes, create_graphemes, create_phonemes from TTS.tts.utils.text.phonemizers import ESpeak, Gruut, JA_JP_Phonemizer, ZH_CN_Phonemizer from TTS.tts.utils.text.tokenizer import TTSTokenizer EXAMPLE_TEXT = "Recent research at Harvard has shown meditating for as little as 8 weeks can actually increase, the grey matter in the parts of the brain responsible for emotional regulation and learning!" class TestEspeakPhonemizer(unittest.TestCase): def setUp(self): self.phonemizer = ESpeak(language="en-us") self.EXPECTED_PHONEMES = "ɹ|ˈiː|s|ə|n|t ɹ|ɪ|s|ˈɜː|tʃ æ|t h|ˈɑːɹ|v|ɚ|d h|ɐ|z ʃ|ˈoʊ|n m|ˈɛ|d|ᵻ|t|ˌeɪ|ɾ|ɪ|ŋ f|ɔː|ɹ æ|z l|ˈɪ|ɾ|əl æ|z ˈeɪ|t w|ˈiː|k|s k|æ|n ˈæ|k|tʃ|uː|əl|i| ˈɪ|n|k|ɹ|iː|s, ð|ə ɡ|ɹ|ˈeɪ m|ˈæ|ɾ|ɚ|ɹ ɪ|n|ð|ə p|ˈɑːɹ|t|s ʌ|v|ð|ə b|ɹ|ˈeɪ|n ɹ|ɪ|s|p|ˈɑː|n|s|ə|b|əl f|ɔː|ɹ ɪ|m|ˈoʊ|ʃ|ə|n|əl ɹ|ˌɛ|ɡ|j|uː|l|ˈeɪ|ʃ|ə|n|| æ|n|d l|ˈɜː|n|ɪ|ŋ!" def test_phonemize(self): output = self.phonemizer.phonemize(EXAMPLE_TEXT, separator="|") self.assertEqual(output, self.EXPECTED_PHONEMES) # multiple punctuations text = "Be a voice, not an! echo?" gt = "biː ɐ vˈɔɪs, nˈɑːt ɐn! ˈɛkoʊ?" output = self.phonemizer.phonemize(text, separator="|") output = output.replace("|", "") self.assertEqual(output, gt) # not ending with punctuation text = "Be a voice, not an! echo" gt = "biː ɐ vˈɔɪs, nˈɑːt ɐn! ˈɛkoʊ" output = self.phonemizer.phonemize(text, separator="") self.assertEqual(output, gt) # extra space after the sentence text = "Be a voice, not an! echo. " gt = "biː ɐ vˈɔɪs, nˈɑːt ɐn! ˈɛkoʊ." output = self.phonemizer.phonemize(text, separator="") self.assertEqual(output, gt) def test_name(self): self.assertEqual(self.phonemizer.name(), "espeak") def test_get_supported_languages(self): self.assertIsInstance(self.phonemizer.supported_languages(), dict) def test_get_version(self): self.assertIsInstance(self.phonemizer.version(), str) def test_is_available(self): self.assertTrue(self.phonemizer.is_available()) class TestGruutPhonemizer(unittest.TestCase): def setUp(self): self.phonemizer = Gruut(language="en-us", use_espeak_phonemes=True, keep_stress=False) self.EXPECTED_PHONEMES = "ɹ|i|ː|s|ə|n|t| ɹ|ᵻ|s|ɜ|ː|t|ʃ| æ|ɾ| h|ɑ|ː|ɹ|v|ɚ|d| h|ɐ|z| ʃ|o|ʊ|n| m|ɛ|d|ᵻ|t|e|ɪ|ɾ|ɪ|ŋ| f|ɔ|ː|ɹ| æ|z| l|ɪ|ɾ|ə|l| æ|z| e|ɪ|t| w|i|ː|k|s| k|æ|ŋ| æ|k|t|ʃ|u|ː|ə|l|i| ɪ|ŋ|k|ɹ|i|ː|s, ð|ə| ɡ|ɹ|e|ɪ| m|æ|ɾ|ɚ| ɪ|n| ð|ə| p|ɑ|ː|ɹ|t|s| ʌ|v| ð|ə| b|ɹ|e|ɪ|n| ɹ|ᵻ|s|p|ɑ|ː|n|s|ᵻ|b|ə|l| f|ɔ|ː|ɹ| ɪ|m|o|ʊ|ʃ|ə|n|ə|l| ɹ|ɛ|ɡ|j|ʊ|l|e|ɪ|ʃ|ə|n| æ|n|d| l|ɜ|ː|n|ɪ|ŋ!" def test_phonemize(self): output = self.phonemizer.phonemize(EXAMPLE_TEXT, separator="|") self.assertEqual(output, self.EXPECTED_PHONEMES) # multiple punctuations text = "Be a voice, not an! echo?" gt = "biː ɐ vɔɪs, nɑːt ɐn! ɛkoʊ?" output = self.phonemizer.phonemize(text, separator="|") output = output.replace("|", "") self.assertEqual(output, gt) # not ending with punctuation text = "Be a voice, not an! echo" gt = "biː ɐ vɔɪs, nɑːt ɐn! ɛkoʊ" output = self.phonemizer.phonemize(text, separator="") self.assertEqual(output, gt) # extra space after the sentence text = "Be a voice, not an! echo. " gt = "biː ɐ vɔɪs, nɑːt ɐn! ɛkoʊ." output = self.phonemizer.phonemize(text, separator="") self.assertEqual(output, gt) def test_name(self): self.assertEqual(self.phonemizer.name(), "gruut") def test_get_supported_languages(self): self.assertIsInstance(self.phonemizer.supported_languages(), list) def test_get_version(self): self.assertIsInstance(self.phonemizer.version(), str) def test_is_available(self): self.assertTrue(self.phonemizer.is_available()) class TestJA_JPPhonemizer(unittest.TestCase): def setUp(self): self.phonemizer = JA_JP_Phonemizer() self._TEST_CASES = """ どちらに行きますか?/dochiraniikimasuka? 今日は温泉に、行きます。/kyo:waoNseNni,ikimasu. 「A」から「Z」までです。/e:karazeqtomadedesu. そうですね!/so:desune! クジラは哺乳類です。/kujirawahonyu:ruidesu. ヴィディオを見ます。/bidioomimasu. 今日は8月22日です/kyo:wahachigatsuniju:ninichidesu xyzとαβγ/eqkusuwaizeqtotoarufabe:tagaNma 値段は$12.34です/nedaNwaju:niteNsaNyoNdorudesu """ def test_phonemize(self): for line in self._TEST_CASES.strip().split("\n"): text, phone = line.split("/") self.assertEqual(self.phonemizer.phonemize(text, separator=""), phone) def test_name(self): self.assertEqual(self.phonemizer.name(), "ja_jp_phonemizer") def test_get_supported_languages(self): self.assertIsInstance(self.phonemizer.supported_languages(), dict) def test_get_version(self): self.assertIsInstance(self.phonemizer.version(), str) def test_is_available(self): self.assertTrue(self.phonemizer.is_available()) class TestZH_CN_Phonemizer(unittest.TestCase): def setUp(self): self.phonemizer = ZH_CN_Phonemizer() self._TEST_CASES = "" def test_phonemize(self): # TODO: implement ZH phonemizer tests pass def test_name(self): self.assertEqual(self.phonemizer.name(), "zh_cn_phonemizer") def test_get_supported_languages(self): self.assertIsInstance(self.phonemizer.supported_languages(), dict) def test_get_version(self): self.assertIsInstance(self.phonemizer.version(), str) def test_is_available(self): self.assertTrue(self.phonemizer.is_available())