From 07cbcf825c8837838229bb1b6952bd35191133eb Mon Sep 17 00:00:00 2001 From: Enno Hermann Date: Wed, 29 May 2024 09:52:18 +0200 Subject: [PATCH] fix(espeak_wrapper): read phonemize() input from file Avoids utf8 encoding issues on Windows when passing the text directly. Fixes https://github.com/coqui-ai/TTS/discussions/3761 --- TTS/tts/utils/text/phonemizers/espeak_wrapper.py | 10 +++++++++- tests/text_tests/test_phonemizer.py | 6 ++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/TTS/tts/utils/text/phonemizers/espeak_wrapper.py b/TTS/tts/utils/text/phonemizers/espeak_wrapper.py index 91fb93c7..a15df716 100644 --- a/TTS/tts/utils/text/phonemizers/espeak_wrapper.py +++ b/TTS/tts/utils/text/phonemizers/espeak_wrapper.py @@ -3,6 +3,8 @@ import logging import re import subprocess +import tempfile +from pathlib import Path from typing import Optional from packaging.version import Version @@ -184,7 +186,12 @@ class ESpeak(BasePhonemizer): if tie: args.append("--tie=%s" % tie) - args.append(text) + tmp = tempfile.NamedTemporaryFile(mode="w+t", delete=False, encoding="utf8") + tmp.write(text) + tmp.close() + args.append("-f") + args.append(tmp.name) + # compute phonemes phonemes = "" for line in _espeak_exe(self.backend, args): @@ -200,6 +207,7 @@ class ESpeak(BasePhonemizer): ph_decoded = re.sub(r"\(.+?\)", "", line) phonemes += ph_decoded.strip() + Path(tmp.name).unlink() return phonemes.replace("_", separator) def _phonemize(self, text: str, separator: str = "") -> str: diff --git a/tests/text_tests/test_phonemizer.py b/tests/text_tests/test_phonemizer.py index ca25b302..f9067530 100644 --- a/tests/text_tests/test_phonemizer.py +++ b/tests/text_tests/test_phonemizer.py @@ -116,6 +116,12 @@ class TestEspeakNgPhonemizer(unittest.TestCase): output = self.phonemizer.phonemize(text, separator="") self.assertEqual(output, gt) + # UTF8 characters + text = "źrebię" + gt = "ʑrˈɛbjɛ" + output = ESpeak("pl").phonemize(text, separator="") + self.assertEqual(output, gt) + def test_name(self): self.assertEqual(self.phonemizer.name(), "espeak")