From 5bd1fb6b2c51735e811c185e5f2e4f92ab0121d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eren=20G=C3=B6lge?= Date: Mon, 10 Apr 2023 13:32:16 +0200 Subject: [PATCH 1/6] Fix API for voice conversion --- TTS/api.py | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/TTS/api.py b/TTS/api.py index 7376cfa4..460e9374 100644 --- a/TTS/api.py +++ b/TTS/api.py @@ -85,7 +85,7 @@ class CS_API: self.headers = {"Content-Type": "application/json", "Authorization": f"Bearer {self.api_token}"} if not self.api_token: raise ValueError( - "No API token found for 🐸Coqui Studio voices - https://coqui.ai.\n" + "No API token found for 🐸Coqui Studio voices - https://coqui.ai \n" "Visit 🔗https://app.coqui.ai/account to get one.\n" "Set it as an environment variable `export COQUI_STUDIO_TOKEN=`\n" "" @@ -274,7 +274,10 @@ class TTS: self.model_name = None if model_name: - self.load_tts_model_by_name(model_name, gpu) + if "tts_models" in model_name: + self.load_tts_model_by_name(model_name, gpu) + elif "voice_conversion_models" in model_name: + self.load_vc_model_by_name(model_name, gpu) if model_path: self.load_tts_model_by_path( @@ -565,19 +568,39 @@ class TTS: def voice_conversion( self, - sourve_wav: str, + source_wav: str, target_wav: str, ): """Voice conversion with FreeVC. Convert source wav to target speaker. + Args:`` + source_wav (str): + Path to the source wav file. + target_wav (str):` + Path to the target wav file. + """ + wav = self.voice_converter.voice_conversion(source_wav=source_wav, target_wav=target_wav) + return wav + + def voice_conversion_to_file( + self, + source_wav: str, + target_wav: str, + file_path: str = "output.wav", + ): + """Voice conversion with FreeVC. Convert source wav to target speaker. + Args: source_wav (str): Path to the source wav file. target_wav (str): Path to the target wav file. + file_path (str, optional): + Output file path. Defaults to "output.wav". """ - wav = self.synthesizer.voice_conversion(source_wav=sourve_wav, target_wav=target_wav) - return wav + wav = self.voice_conversion(source_wav=source_wav, target_wav=target_wav) + save_wav(wav=wav, path=file_path, sample_rate=self.voice_converter.vc_config.audio.output_sample_rate) + return file_path def tts_with_vc(self, text: str, language: str = None, speaker_wav: str = None): """Convert text to speech with voice conversion. From a49c1931d92cc046dd8c2684c43794ec01daa8a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eren=20G=C3=B6lge?= Date: Mon, 10 Apr 2023 13:33:42 +0200 Subject: [PATCH 2/6] Fixup --- TTS/utils/audio/processor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TTS/utils/audio/processor.py b/TTS/utils/audio/processor.py index 47fcc824..579f375c 100644 --- a/TTS/utils/audio/processor.py +++ b/TTS/utils/audio/processor.py @@ -711,7 +711,7 @@ class AudioProcessor(object): Args: filename (str): Path to the wav file. """ - return librosa.get_duration(path=filename) + return librosa.get_duration(filename=filename) @staticmethod def mulaw_encode(wav: np.ndarray, qc: int) -> np.ndarray: From 209f0a509a4f7ed2f99cf991220ba5d175d5fb4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eren=20G=C3=B6lge?= Date: Mon, 10 Apr 2023 13:37:47 +0200 Subject: [PATCH 3/6] Add voice conversion api tes --- tests/inference_tests/test_python_api.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/inference_tests/test_python_api.py b/tests/inference_tests/test_python_api.py index dbfca837..b9c0fcb3 100644 --- a/tests/inference_tests/test_python_api.py +++ b/tests/inference_tests/test_python_api.py @@ -93,3 +93,11 @@ class TTSTest(unittest.TestCase): tts = TTS() tts.load_tts_model_by_name("tts_models/multilingual/multi-dataset/your_tts") tts.tts_to_file("Hello world!", speaker_wav=cloning_test_wav_path, language="en", file_path=OUTPUT_PATH) + + def test_voice_conversion(self): # pylint: disable=no-self-use + tts = TTS(model_name="voice_conversion_models/multilingual/vctk/freevc24", progress_bar=False, gpu=False) + tts.voice_conversion_to_file( + source_wav=cloning_test_wav_path, + target_wav=cloning_test_wav_path, + file_path=OUTPUT_PATH, + ) From 76511972e95bf0c8025cff521a2d8de977133db1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eren=20G=C3=B6lge?= Date: Mon, 10 Apr 2023 14:03:08 +0200 Subject: [PATCH 4/6] Add freevc to the models list --- README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index baa52912..c06fd0a8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,13 @@ - ----- -### 📣 Clone your voice with a single click on [🐸Coqui.ai](https://app.coqui.ai/auth/signin) +## 🐸Coqui.ai News +- 📣 Coqui Studio API is landed on 🐸TTS. You can use the studio voices in combination with 🐸TTS models. [Example](https://github.com/coqui-ai/TTS/edit/dev/README.md#-python-api) +- 📣 Voice generation with prompts - **Prompt to Voice** - is live on Coqui.ai!! [Blog Post](https://coqui.ai/blog/tts/prompt-to-voice) +- 📣 Clone your voice with a single click on [🐸Coqui.ai](https://app.coqui.ai/auth/signin) +
+ +## ----- 🐸TTS is a library for advanced Text-to-Speech generation. It's built on the latest research, was designed to achieve the best trade-off among ease-of-training, speed and quality. 🐸TTS comes with pretrained models, tools for measuring dataset quality and already used in **20+ languages** for products and research projects. @@ -123,6 +126,9 @@ Underlined "TTS*" and "Judy*" are 🐸TTS models - HiFiGAN: [paper](https://arxiv.org/abs/2010.05646) - UnivNet: [paper](https://arxiv.org/abs/2106.07889) +### Voice Conversion +- FreeVC: [paper](https://arxiv.org/abs/2210.15418) + You can also help us implement more models. ## Install TTS From b8b9f09de53952a025793bbc50460e2f3c1a6d43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eren=20G=C3=B6lge?= Date: Mon, 10 Apr 2023 14:06:31 +0200 Subject: [PATCH 5/6] Fixup --- TTS/api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/TTS/api.py b/TTS/api.py index 460e9374..187fa748 100644 --- a/TTS/api.py +++ b/TTS/api.py @@ -345,6 +345,7 @@ class TTS: model_name (str): Model name to load. You can list models by ```tts.models```. gpu (bool, optional): Enable/disable GPU. Some models might be too slow on CPU. Defaults to False. """ + self.model_name = model_name model_path, config_path, _, _ = self.download_model_by_name(model_name) self.voice_converter = Synthesizer(vc_checkpoint=model_path, vc_config=config_path, use_cuda=gpu) From cbb592b295f74d6f646618c86334f5417e730e2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eren=20G=C3=B6lge?= Date: Mon, 10 Apr 2023 14:50:11 +0200 Subject: [PATCH 6/6] Fixup --- TTS/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TTS/api.py b/TTS/api.py index 187fa748..51bfff18 100644 --- a/TTS/api.py +++ b/TTS/api.py @@ -273,8 +273,8 @@ class TTS: self.csapi = None self.model_name = None - if model_name: - if "tts_models" in model_name: + if model_name is not None: + if "tts_models" in model_name or "coqui_studio" in model_name: self.load_tts_model_by_name(model_name, gpu) elif "voice_conversion_models" in model_name: self.load_vc_model_by_name(model_name, gpu)