From d19dfac8a353175849d2a84720e6001983ca4d05 Mon Sep 17 00:00:00 2001 From: liamb Date: Fri, 5 May 2023 11:21:06 +1000 Subject: [PATCH 01/11] adds elevenlabs --- TTS/elevenlabs.py | 46 +++++++++++++++++++++++++++++++++++++ requirements.txt | 3 ++- utils/.config.template.toml | 4 +++- video_creation/voices.py | 2 ++ 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 TTS/elevenlabs.py diff --git a/TTS/elevenlabs.py b/TTS/elevenlabs.py new file mode 100644 index 0000000..4a7bfd2 --- /dev/null +++ b/TTS/elevenlabs.py @@ -0,0 +1,46 @@ +import random + +from elevenlabs import generate, save + +from utils import settings + + +class elevenlabs: + def __init__(self): + self.max_chars = 5000 + self.voices = ["Adam", "Antoni", "Arnold", "Bella", "Domi", "Elli", "Josh", "Rachel", "Sam"] + + def run( + self, + text: str, + filepath: str, + random_voice=False, + ): + voice_name = settings.config["settings"]["tts"]["elevenlabs_voice_name"] + if voice_name == "": + voice_name = "Bella" + raise ValueError( + "set elevenlabs name value to a valid value, switching to default voice (Bella)" + ) + if random_voice: + voice_name = self.randomvoice() + + if settings.config["settings"]["tts"]["elevenlabs_api_key"]: + api_key = settings.config["settings"]["tts"]["elevenlabs_api_key"] + else: + api_key = None + print("set elevenlabs api key value to a valid value or quota will be limited") + + audio = generate( + api_key=api_key, + text=text, + voice=voice_name, + model="eleven_monolingual_v1" + ) + save( + audio=audio, + filename=f"{filepath}" + ) + + def randomvoice(self): + return random.choice(self.voices) diff --git a/requirements.txt b/requirements.txt index 22d3d7f..88f4f45 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,4 +19,5 @@ unidecode==1.3.2 spacy==3.4.1 torch==1.12.1 transformers==4.25.1 -ffmpeg-python==0.2.0 \ No newline at end of file +ffmpeg-python==0.2.0 +elevenlabs==0.2.10 \ No newline at end of file diff --git a/utils/.config.template.toml b/utils/.config.template.toml index b2fa1d4..58ff86e 100644 --- a/utils/.config.template.toml +++ b/utils/.config.template.toml @@ -42,7 +42,9 @@ background_thumbnail_font_size = { optional = true, type = "int", default = 96, background_thumbnail_font_color = { optional = true, default = "255,255,255", example = "255,255,255", explanation = "Font color in RGB format for the thumbnail text" } [settings.tts] -voice_choice = { optional = false, default = "tiktok", options = ["streamlabspolly", "tiktok", "googletranslate", "awspolly", "pyttsx", ], example = "tiktok", explanation = "The voice platform used for TTS generation. This can be left blank and you will be prompted to choose at runtime." } +voice_choice = { optional = false, default = "tiktok", options = ["elevenlabs", "streamlabspolly", "tiktok", "googletranslate", "awspolly", "pyttsx", ], example = "tiktok", explanation = "The voice platform used for TTS generation. This can be left blank and you will be prompted to choose at runtime." } +elevenlabs_voice_name = { optional = false, default = "Bella", example = "Bella", explanation = "The voice used for elevenlabs" } +elevenlabs_api_key = { optional = true, example = "21f13f91f54d741e2ae27d2ab1b99d59", explanation = "Elevenlabs API key" } aws_polly_voice = { optional = false, default = "Matthew", example = "Matthew", explanation = "The voice used for AWS Polly" } streamlabs_polly_voice = { optional = false, default = "Matthew", example = "Matthew", explanation = "The voice used for Streamlabs Polly" } tiktok_voice = { optional = true, default = "en_us_001", example = "en_us_006", explanation = "The voice used for TikTok TTS" } diff --git a/video_creation/voices.py b/video_creation/voices.py index 425f589..cd75f06 100644 --- a/video_creation/voices.py +++ b/video_creation/voices.py @@ -7,6 +7,7 @@ from TTS.TikTok import TikTok from TTS.aws_polly import AWSPolly from TTS.engine_wrapper import TTSEngine from TTS.pyttsx import pyttsx +from TTS.elevenlabs import elevenlabs from TTS.streamlabs_polly import StreamlabsPolly from utils import settings from utils.console import print_table, print_step @@ -19,6 +20,7 @@ TTSProviders = { "StreamlabsPolly": StreamlabsPolly, "TikTok": TikTok, "pyttsx": pyttsx, + "ElevenLabs": elevenlabs } From 066f657134cccc50fed23f9877f9053412253744 Mon Sep 17 00:00:00 2001 From: liamb13 <69778531+liamb13@users.noreply.github.com> Date: Sat, 6 May 2023 04:17:48 +1000 Subject: [PATCH 02/11] Update TTS/elevenlabs.py Co-authored-by: Simon <65854503+OpenSourceSimon@users.noreply.github.com> --- TTS/elevenlabs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TTS/elevenlabs.py b/TTS/elevenlabs.py index 4a7bfd2..837ddc9 100644 --- a/TTS/elevenlabs.py +++ b/TTS/elevenlabs.py @@ -29,7 +29,7 @@ class elevenlabs: api_key = settings.config["settings"]["tts"]["elevenlabs_api_key"] else: api_key = None - print("set elevenlabs api key value to a valid value or quota will be limited") + print("You didn't set an Elevenlabs API key! Trying without API key, but you'll probably hit an error.") audio = generate( api_key=api_key, From facae5efd5df77afacb5e48f7080fa09260ae0ce Mon Sep 17 00:00:00 2001 From: liamb13 <69778531+liamb13@users.noreply.github.com> Date: Sat, 6 May 2023 04:18:48 +1000 Subject: [PATCH 03/11] Update utils/.config.template.toml Co-authored-by: Simon <65854503+OpenSourceSimon@users.noreply.github.com> --- utils/.config.template.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/.config.template.toml b/utils/.config.template.toml index 58ff86e..aadedd2 100644 --- a/utils/.config.template.toml +++ b/utils/.config.template.toml @@ -42,7 +42,7 @@ background_thumbnail_font_size = { optional = true, type = "int", default = 96, background_thumbnail_font_color = { optional = true, default = "255,255,255", example = "255,255,255", explanation = "Font color in RGB format for the thumbnail text" } [settings.tts] -voice_choice = { optional = false, default = "tiktok", options = ["elevenlabs", "streamlabspolly", "tiktok", "googletranslate", "awspolly", "pyttsx", ], example = "tiktok", explanation = "The voice platform used for TTS generation. This can be left blank and you will be prompted to choose at runtime." } +voice_choice = { optional = false, default = "tiktok", options = ["elevenlabs", "streamlabspolly", "tiktok", "googletranslate", "awspolly", "pyttsx", ], example = "tiktok", explanation = "The voice platform used for TTS generation. " } elevenlabs_voice_name = { optional = false, default = "Bella", example = "Bella", explanation = "The voice used for elevenlabs" } elevenlabs_api_key = { optional = true, example = "21f13f91f54d741e2ae27d2ab1b99d59", explanation = "Elevenlabs API key" } aws_polly_voice = { optional = false, default = "Matthew", example = "Matthew", explanation = "The voice used for AWS Polly" } From 685f8c4ddd4cf8e1e630ced3e8d1085010e2c9c8 Mon Sep 17 00:00:00 2001 From: liamb Date: Sat, 6 May 2023 04:35:29 +1000 Subject: [PATCH 04/11] format like other tts engines --- TTS/elevenlabs.py | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/TTS/elevenlabs.py b/TTS/elevenlabs.py index 837ddc9..03c8aff 100644 --- a/TTS/elevenlabs.py +++ b/TTS/elevenlabs.py @@ -4,26 +4,34 @@ from elevenlabs import generate, save from utils import settings +voices = [ + "Adam", + "Antoni", + "Arnold", + "Bella", + "Domi", + "Elli", + "Josh", + "Rachel", + "Sam", +] class elevenlabs: def __init__(self): self.max_chars = 5000 - self.voices = ["Adam", "Antoni", "Arnold", "Bella", "Domi", "Elli", "Josh", "Rachel", "Sam"] + self.voices = voices - def run( - self, - text: str, - filepath: str, - random_voice=False, - ): - voice_name = settings.config["settings"]["tts"]["elevenlabs_voice_name"] - if voice_name == "": - voice_name = "Bella" - raise ValueError( - "set elevenlabs name value to a valid value, switching to default voice (Bella)" - ) + def run(self, text, filepath, random_voice: bool = False): if random_voice: - voice_name = self.randomvoice() + voice = self.randomvoice() + else: + if not settings.config["settings"]["tts"]["elevenlabs_voice_name"]: + print(f"Please set the config variable ELEVENLABS_VOICE_NAME to a valid voice. options are: {voices}. Using random voice.") + voice = self.randomvoice() + else: + voice = str( + settings.config["settings"]["tts"]["elevenlabs_voice_name"] + ).capitalize() if settings.config["settings"]["tts"]["elevenlabs_api_key"]: api_key = settings.config["settings"]["tts"]["elevenlabs_api_key"] @@ -34,7 +42,7 @@ class elevenlabs: audio = generate( api_key=api_key, text=text, - voice=voice_name, + voice=voice, model="eleven_monolingual_v1" ) save( From 815c4b2a2e4eb8d9ceea924ffae3248a4d2be26f Mon Sep 17 00:00:00 2001 From: liamb Date: Sat, 6 May 2023 04:37:16 +1000 Subject: [PATCH 05/11] throw error on no api --- TTS/elevenlabs.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/TTS/elevenlabs.py b/TTS/elevenlabs.py index 03c8aff..2da8e8e 100644 --- a/TTS/elevenlabs.py +++ b/TTS/elevenlabs.py @@ -36,8 +36,9 @@ class elevenlabs: if settings.config["settings"]["tts"]["elevenlabs_api_key"]: api_key = settings.config["settings"]["tts"]["elevenlabs_api_key"] else: - api_key = None - print("You didn't set an Elevenlabs API key! Trying without API key, but you'll probably hit an error.") + raise ValueError( + "You didn't set an Elevenlabs API key! Please set the config variable ELEVENLABS_API_KEY to a valid API key." + ) audio = generate( api_key=api_key, From 473dacdbfc26d72302228eb2d16fdf92bb6ec06d Mon Sep 17 00:00:00 2001 From: liamb13 <69778531+liamb13@users.noreply.github.com> Date: Sat, 13 May 2023 10:31:02 +1000 Subject: [PATCH 06/11] Update elevenlabs.py --- TTS/elevenlabs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TTS/elevenlabs.py b/TTS/elevenlabs.py index 2da8e8e..af5dbec 100644 --- a/TTS/elevenlabs.py +++ b/TTS/elevenlabs.py @@ -18,7 +18,7 @@ voices = [ class elevenlabs: def __init__(self): - self.max_chars = 5000 + self.max_chars = 2500 self.voices = voices def run(self, text, filepath, random_voice: bool = False): @@ -48,7 +48,7 @@ class elevenlabs: ) save( audio=audio, - filename=f"{filepath}" + filename=filepath ) def randomvoice(self): From 270e725e4083918b15f4624624cc6a104ae9ad65 Mon Sep 17 00:00:00 2001 From: liamb13 <69778531+liamb13@users.noreply.github.com> Date: Sun, 21 May 2023 20:42:12 +1000 Subject: [PATCH 07/11] Update TTS/elevenlabs.py Co-authored-by: Simon <65854503+OpenSourceSimon@users.noreply.github.com> --- TTS/elevenlabs.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/TTS/elevenlabs.py b/TTS/elevenlabs.py index af5dbec..e24873b 100644 --- a/TTS/elevenlabs.py +++ b/TTS/elevenlabs.py @@ -25,9 +25,6 @@ class elevenlabs: if random_voice: voice = self.randomvoice() else: - if not settings.config["settings"]["tts"]["elevenlabs_voice_name"]: - print(f"Please set the config variable ELEVENLABS_VOICE_NAME to a valid voice. options are: {voices}. Using random voice.") - voice = self.randomvoice() else: voice = str( settings.config["settings"]["tts"]["elevenlabs_voice_name"] From 51d0486866d1d52f15444f45ae998b3d686f75aa Mon Sep 17 00:00:00 2001 From: liamb13 <69778531+liamb13@users.noreply.github.com> Date: Sun, 21 May 2023 20:42:23 +1000 Subject: [PATCH 08/11] Update TTS/elevenlabs.py Co-authored-by: Simon <65854503+OpenSourceSimon@users.noreply.github.com> --- TTS/elevenlabs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TTS/elevenlabs.py b/TTS/elevenlabs.py index e24873b..f427c07 100644 --- a/TTS/elevenlabs.py +++ b/TTS/elevenlabs.py @@ -41,7 +41,7 @@ class elevenlabs: api_key=api_key, text=text, voice=voice, - model="eleven_monolingual_v1" + model="eleven_multilingual_v1" ) save( audio=audio, From 9a90363f5672dfb17d2eb87e54b4d86afa1c5abb Mon Sep 17 00:00:00 2001 From: liamb13 <69778531+liamb13@users.noreply.github.com> Date: Sun, 21 May 2023 20:42:34 +1000 Subject: [PATCH 09/11] Update utils/.config.template.toml Co-authored-by: Simon <65854503+OpenSourceSimon@users.noreply.github.com> --- utils/.config.template.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/.config.template.toml b/utils/.config.template.toml index aadedd2..502406b 100644 --- a/utils/.config.template.toml +++ b/utils/.config.template.toml @@ -43,7 +43,7 @@ background_thumbnail_font_color = { optional = true, default = "255,255,255", ex [settings.tts] voice_choice = { optional = false, default = "tiktok", options = ["elevenlabs", "streamlabspolly", "tiktok", "googletranslate", "awspolly", "pyttsx", ], example = "tiktok", explanation = "The voice platform used for TTS generation. " } -elevenlabs_voice_name = { optional = false, default = "Bella", example = "Bella", explanation = "The voice used for elevenlabs" } +elevenlabs_voice_name = { optional = false, default = "Bella", example = "Bella", explanation = "The voice used for elevenlabs", options = ["Adam", "Antoni", "Arnold", "Bella", "Domi", "Elli", "Josh", "Rachel", "Sam", ] } elevenlabs_api_key = { optional = true, example = "21f13f91f54d741e2ae27d2ab1b99d59", explanation = "Elevenlabs API key" } aws_polly_voice = { optional = false, default = "Matthew", example = "Matthew", explanation = "The voice used for AWS Polly" } streamlabs_polly_voice = { optional = false, default = "Matthew", example = "Matthew", explanation = "The voice used for Streamlabs Polly" } From 6aef6666e0f52cae7e82bb8f1c60418002e948cc Mon Sep 17 00:00:00 2001 From: liamb13 <69778531+liamb13@users.noreply.github.com> Date: Wed, 24 May 2023 11:27:51 +1000 Subject: [PATCH 10/11] Update elevenlabs.py --- TTS/elevenlabs.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/TTS/elevenlabs.py b/TTS/elevenlabs.py index f427c07..93c6b5c 100644 --- a/TTS/elevenlabs.py +++ b/TTS/elevenlabs.py @@ -25,10 +25,9 @@ class elevenlabs: if random_voice: voice = self.randomvoice() else: - else: - voice = str( - settings.config["settings"]["tts"]["elevenlabs_voice_name"] - ).capitalize() + voice = str( + settings.config["settings"]["tts"]["elevenlabs_voice_name"] + ).capitalize() if settings.config["settings"]["tts"]["elevenlabs_api_key"]: api_key = settings.config["settings"]["tts"]["elevenlabs_api_key"] From 32ea522cd9e57b7d99f6cc044fd180e951a0cccf Mon Sep 17 00:00:00 2001 From: liamb13 <69778531+liamb13@users.noreply.github.com> Date: Sat, 27 May 2023 10:33:09 +1000 Subject: [PATCH 11/11] Update main.py Redact elevenlabs_api_key --- main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/main.py b/main.py index b7a1b7f..1e5101a 100755 --- a/main.py +++ b/main.py @@ -121,6 +121,7 @@ if __name__ == "__main__": shutdown() except Exception as err: config["settings"]["tts"]["tiktok_sessionid"] = "REDACTED" + config["settings"]["tts"]["elevenlabs_api_key"] = "REDACTED" print_step( f"Sorry, something went wrong with this version! Try again, and feel free to report this issue at GitHub or the Discord community.\n" f"Version: {__VERSION__} \n"