From 0fb4cb2dc8f06f63e7e522f247b37b82201c7a63 Mon Sep 17 00:00:00 2001 From: Tasha Upchurch Date: Sun, 19 May 2024 11:40:09 -0400 Subject: [PATCH] Updated xttscli.py script to handle multiple texts, absolute folder paths, and file input for text generation. --- modules/xttscli.py | 51 +++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/modules/xttscli.py b/modules/xttscli.py index 062a974..dae6525 100644 --- a/modules/xttscli.py +++ b/modules/xttscli.py @@ -3,6 +3,7 @@ import torch.multiprocessing as mp from concurrent.futures import ProcessPoolExecutor, as_completed + def generate_xtts_for_text(text, file, lang, speaker): from TTS.api import TTS import torch @@ -20,29 +21,37 @@ def generate_xtts(**kwargs): import torch import ast import uuid + import os from concurrent.futures import ProcessPoolExecutor, as_completed torch.cuda.empty_cache() text = kwargs.get('text') folder = kwargs.get('folder', '.') + # make the folder absolute + folder = os.path.abspath(folder) lang = kwargs.get('lang', 'en') speaker = kwargs.get('speaker', '') - try: - texts = ast.literal_eval(text) - except SyntaxError: - texts = [text] + if isinstance(text, str): + if text != None and text.startswith("[") and text.endswith("]"): + try: + texts = ast.literal_eval(text) + except SyntaxError: + texts = [text] + elif isinstance(text, list): + texts = text o_files = [] - batch_size = 3 + batch_size = 2 with ProcessPoolExecutor(max_workers=batch_size) as executor: futures = [] for i, text in enumerate(texts): - ii = str(i).zfill(1 + len(str(1 + len(texts)))) - file_to_use = f"{folder}/tts_{ii}_{str(uuid.uuid4())}.wav" - future = executor.submit(generate_xtts_for_text, text, file_to_use, lang, speaker) - futures.append((future, file_to_use)) + if len(text)>1: + ii = str(i).zfill(1 + len(str(1 + len(texts)))) + file_to_use = f"{folder}/tts_{ii}_{str(uuid.uuid4())}.wav" + future = executor.submit(generate_xtts_for_text, text, file_to_use, lang, speaker) + futures.append((future, file_to_use)) for future, file_to_use in futures: future.result() @@ -53,8 +62,6 @@ def generate_xtts(**kwargs): return (o_files[0], o_files,) - - # def generate_xtts_for_text_advanced(text, file, lang, speaker): # from TTS.api import TTS # import torch @@ -70,25 +77,31 @@ def generate_xtts(**kwargs): # something = manager. - - - - - - def main(): + import os parser = argparse.ArgumentParser(description='Generate from given text.') parser.add_argument('--text', help='Text to generate for') parser.add_argument('--folder', type=str, default='.', help='output folder') parser.add_argument('--lang', type=str, default='en') parser.add_argument('--speaker', type=str, default='', help='Speaker wav use for generation') + parser.add_argument('--file', type=str, default="", help='newline seperated file.') args = parser.parse_args() kwargs = vars(args) - print(f"Generating with the following arguments: {kwargs}") + # test if file is set if it is open it + if kwargs['file'] is not None: + with open(kwargs['file']) as f: + kwargs['text'] = f.read().split('\n') + + # make sure the speaker file exists + if kwargs['speaker'] is not None: + if not os.path.exists(kwargs['speaker']): + raise ValueError(f"Speaker file {kwargs['speaker']} does not exist.") + generated_files = generate_xtts(**kwargs) print(f"Generated files: {generated_files}") + if __name__ == "__main__": - main() \ No newline at end of file + main()