def text2phone(text, language, use_espeak_phonemes=False, keep_stress=False): """Convert graphemes to phonemes. Parameters: text (str): text to phonemize language (str): language of the text Returns: ph (str): phonemes as a string seperated by "|" ph = "ɪ|g|ˈ|z|æ|m|p|ə|l" """ # TO REVIEW : How to have a good implementation for this? if language == "zh-CN": ph = chinese_text_to_phonemes(text) return ph if language == "ja-jp": ph = japanese_text_to_phonemes(text) return ph if not gruut.is_language_supported(language): raise ValueError( f" [!] Language {language} is not supported for phonemization.") # Use gruut for phonemization ph_list = [] for sentence in gruut.sentences(text, lang=language, espeak=use_espeak_phonemes): for word in sentence: if word.is_break: # Use actual character for break phoneme (e.g., comma) if ph_list: # Join with previous word ph_list[-1].append(word.text) else: # First word is punctuation ph_list.append([word.text]) elif word.phonemes: # Add phonemes for word word_phonemes = [] for word_phoneme in word.phonemes: if not keep_stress: # Remove primary/secondary stress word_phoneme = IPA.without_stress(word_phoneme) word_phoneme = word_phoneme.translate(GRUUT_TRANS_TABLE) if word_phoneme: # Flatten phonemes word_phonemes.extend(word_phoneme) if word_phonemes: ph_list.append(word_phonemes) # Join and re-split to break apart dipthongs, suprasegmentals, etc. ph_words = ["|".join(word_phonemes) for word_phonemes in ph_list] ph = "| ".join(ph_words) return ph
def text2phone(text, language, use_espeak_phonemes=False): """Convert graphemes to phonemes. Parameters: text (str): text to phonemize language (str): language of the text Returns: ph (str): phonemes as a string seperated by "|" ph = "ɪ|g|ˈ|z|æ|m|p|ə|l" """ # TO REVIEW : How to have a good implementation for this? if language == "zh-CN": from TTS.tts.utils.text.chinese_mandarin.phonemizer import ( chinese_text_to_phonemes, ) ph = chinese_text_to_phonemes(text) return ph if language == "ja-jp": from TTS.tts.utils.text.japanese.phonemizer import japanese_text_to_phonemes ph = japanese_text_to_phonemes(text) return ph if gruut.is_language_supported(language): # Use gruut for phonemization ph_list = [] for sentence in gruut.sentences(text, lang=language, espeak=use_espeak_phonemes): for word in sentence: if word.is_break: # Use actual character for break phoneme (e.g., comma) if ph_list: ph_list[-1].append(word.text) else: ph_list.append([word.text]) elif word.phonemes: # Remove stress from word phonemes word_phonemes = [] for word_phoneme in word.phonemes: word_phonemes.append( IPA.without_stress(word_phoneme).translate( GRUUT_TRANS_TABLE)) if word_phonemes: ph_list.append(word_phonemes) # Join and re-split to break apart dipthongs, suprasegmentals, etc. ph_words = ["|".join(word_phonemes) for word_phonemes in ph_list] ph = "| ".join(ph_words) return ph raise ValueError( f" [!] Language {language} is not supported for phonemization.")
def text2phone(text, language, use_espeak_phonemes=False): """Convert graphemes to phonemes. Parameters: text (str): text to phonemize language (str): language of the text Returns: ph (str): phonemes as a string seperated by "|" ph = "ɪ|g|ˈ|z|æ|m|p|ə|l" """ # TO REVIEW : How to have a good implementation for this? if language == "zh-CN": ph = chinese_text_to_phonemes(text) return ph if language == "ja-jp": ph = japanese_text_to_phonemes(text) return ph if gruut.is_language_supported(language): # Use gruut for phonemization phonemizer_args = { "remove_stress": True, "ipa_minor_breaks": False, # don't replace commas/semi-colons with IPA | "ipa_major_breaks": False, # don't replace periods with IPA ‖ } if use_espeak_phonemes: # Use a lexicon/g2p model train on eSpeak IPA instead of gruut IPA. # This is intended for backwards compatibility with TTS<=v0.0.13 # pre-trained models. phonemizer_args["model_prefix"] = "espeak" ph_list = gruut.text_to_phonemes( text, lang=language, return_format="word_phonemes", phonemizer_args=phonemizer_args, ) # Join and re-split to break apart dipthongs, suprasegmentals, etc. ph_words = ["|".join(word_phonemes) for word_phonemes in ph_list] ph = "| ".join(ph_words) # Fix a few phonemes ph = ph.translate(GRUUT_TRANS_TABLE) return ph raise ValueError(f" [!] Language {language} is not supported for phonemization.")
def text2phone(text, language): """Convert graphemes to phonemes. Parameters: text (str): text to phonemize language (str): language of the text Returns: ph (str): phonemes as a string seperated by "|" ph = "ɪ|g|ˈ|z|æ|m|p|ə|l" """ # TO REVIEW : How to have a good implementation for this? if language == "zh-CN": ph = chinese_text_to_phonemes(text) return ph if language == "ja-jp": ph = japanese_text_to_phonemes(text) return ph raise ValueError(f" [!] Language {language} is not supported for phonemization.")
def test_japanese_text_to_phonemes(self): for line in _TEST_CASES.strip().split("\n"): text, phone = line.split("/") self.assertEqual(japanese_text_to_phonemes(text), phone)