From 103971c8936db6e69df08797d46741c29b44e482 Mon Sep 17 00:00:00 2001 From: Eren Golge Date: Fri, 29 Mar 2019 15:42:46 +0100 Subject: [PATCH] text processing updates with tests --- tests/text_processing_tests.py | 38 +++++++++++++++++++++++++++++++++- utils/text/__init__.py | 22 +++++++++++--------- utils/text/cleaners.py | 2 +- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/tests/text_processing_tests.py b/tests/text_processing_tests.py index 16ebb7db..82052323 100644 --- a/tests/text_processing_tests.py +++ b/tests/text_processing_tests.py @@ -12,6 +12,42 @@ def test_phoneme_to_sequence(): gt = "^ɹiːsənt ɹɪsɜːtʃ æt hɑːɹvɚd hɐz ʃoʊn mɛdᵻteɪɾɪŋ fɔːɹ æz lɪɾəl æz eɪt wiːks kæn æktʃuːəli ɪnkɹiːs, ðə ɡɹeɪ mæɾɚɹ ɪnðə pɑːɹts ʌvðə bɹeɪn ɹɪspɑːnsəbəl fɔːɹ ɪmoʊʃənəl ɹɛɡjuːleɪʃən ænd lɜːnɪŋ!" assert text_hat == gt + # multiple punctuations + text = "Be a voice, not an! echo?" + sequence = phoneme_to_sequence(text, text_cleaner, lang) + text_hat = sequence_to_phoneme(sequence) + gt = "^biː ɐ vɔɪs, nɑːt ɐn! ɛkoʊ?" + print(text_hat) + print(len(sequence)) + assert text_hat == gt + + # not ending with punctuation + text = "Be a voice, not an! echo" + sequence = phoneme_to_sequence(text, text_cleaner, lang) + text_hat = sequence_to_phoneme(sequence) + gt = "^biː ɐ vɔɪs, nɑːt ɐn! ɛkoʊ" + print(text_hat) + print(len(sequence)) + assert text_hat == gt + + # original + text = "Be a voice, not an echo!" + sequence = phoneme_to_sequence(text, text_cleaner, lang) + text_hat = sequence_to_phoneme(sequence) + gt = "^biː ɐ vɔɪs, nɑːt ɐn ɛkoʊ!" + print(text_hat) + print(len(sequence)) + assert text_hat == gt + + # extra space after the sentence + text = "Be a voice, not an! echo. " + sequence = phoneme_to_sequence(text, text_cleaner, lang) + text_hat = sequence_to_phoneme(sequence) + gt = "^biː ɐ vɔɪs, nɑːt ɐn! ɛkoʊ." + print(text_hat) + print(len(sequence)) + assert text_hat == gt + def test_text2phone(): 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!" @@ -19,4 +55,4 @@ def test_text2phone(): gt = "ɹ|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|ɪ|ŋ|!" lang = "en-us" phonemes = text2phone(text, lang) - assert gt == phonemes \ No newline at end of file + assert gt == phonemes diff --git a/utils/text/__init__.py b/utils/text/__init__.py index 32474a55..37bc35f6 100644 --- a/utils/text/__init__.py +++ b/utils/text/__init__.py @@ -31,19 +31,21 @@ def text2phone(text, language): ph = ph[:-1] # skip the last empty character # Replace \n with matching punctuations. if len(punctuations) > 0: - for punct in punctuations[:-1]: - ph = ph.replace('| |\n', '|'+punct+'| |', 1) - try: - ph = ph[:-1] + punctuations[-1] - except: - print(text) + # if text ends with a punctuation. + if text[-1] == punctuations[-1]: + for punct in punctuations[:-1]: + ph = ph.replace('| |\n', '|'+punct+'| |', 1) + try: + ph = ph + punctuations[-1] + except: + print(text) + else: + for punct in punctuations: + ph = ph.replace('| |\n', '|'+punct+'| |', 1) return ph def phoneme_to_sequence(text, cleaner_names, language): - ''' - TODO: This ignores punctuations - ''' sequence = [_phonemes_to_id['^']] clean_text = _clean_text(text, cleaner_names) phonemes = text2phone(clean_text, language) @@ -80,7 +82,7 @@ def text_to_sequence(text, cleaner_names): Returns: List of integers corresponding to the symbols in the text ''' - sequence = [] + # sequence = [] sequence = [_phonemes_to_id['^']] # Check for curly braces and treat their contents as ARPAbet: while len(text): diff --git a/utils/text/cleaners.py b/utils/text/cleaners.py index bb07b2ff..581633a2 100644 --- a/utils/text/cleaners.py +++ b/utils/text/cleaners.py @@ -56,7 +56,7 @@ def lowercase(text): def collapse_whitespace(text): - return re.sub(_whitespace_re, ' ', text) + return re.sub(_whitespace_re, ' ', text).strip() def convert_to_ascii(text):