Updated xttscli.py script to handle multiple texts, absolute folder paths, and file input for text generation.
This commit is contained in:
+32
-19
@@ -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()
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user