Spaces:
Sleeping
Sleeping
import sys | |
import argparse | |
import textwrap | |
parser = argparse.ArgumentParser(add_help=False, | |
formatter_class=argparse.RawTextHelpFormatter) | |
parser.add_argument("-q", "--quick", action="store_true", | |
help="skip checking the required library") | |
modes = parser.add_argument_group("action") | |
modes.add_argument("inputfile", metavar="TEXTFILE", | |
nargs='?', type=argparse.FileType(), default=sys.stdin, | |
help="read the text file (default: stdin)") | |
modes.add_argument("-l", "--list", action="store_true", | |
help="show the list of voices and exit") | |
modes.add_argument("-h", "--help", action="help", | |
help="show this help and exit") | |
selopts = parser.add_argument_group("voice selection") | |
selmodes = selopts.add_mutually_exclusive_group() | |
selmodes.add_argument("-n", "--name", | |
default="Arnold", | |
help="get a voice object by name (default: Arnold)") | |
selmodes.add_argument("-v", "--voice", type=int, metavar="NUMBER", | |
help="get a voice object by number (see --list)") | |
selopts.add_argument("-f", "--filter", action="append", metavar="KEY=VAL", | |
default=["use case=narration"], | |
help=textwrap.dedent('''\ | |
filter voices by labels (default: "use case=narration") | |
this option can be used multiple times | |
filtering will be disabled if the first -f has no "=" (e.g. -f "any") | |
''')) | |
outmodes = parser.add_argument_group("output") | |
outgroup = outmodes.add_mutually_exclusive_group() | |
outgroup.add_argument("-s", "--save", metavar="FILE", | |
default="audio.mp3", | |
help="save the TTS to a file (default: audio.mp3)") | |
outgroup.add_argument("-p", "--play", action="store_true", | |
help="play the TTS with ffplay") | |
args = parser.parse_args() | |
if not args.quick: | |
import importlib.util | |
if importlib.util.find_spec("elevenlabs") is None: | |
print("elevenlabs library is not installed, you can install it to your enviroment using 'pip install elevenlabs'") | |
sys.exit() | |
from elevenlabs import voices, generate, play, save | |
if args.filter and "=" in args.filter[0]: | |
voicelist = voices() | |
for f in args.filter: | |
label, value = f.split("=") | |
voicelist = filter(lambda x: x.labels.get(label) == value, voicelist) | |
voicelist = list(voicelist) | |
else: | |
voicelist = list(voices()) | |
if args.list: | |
for i, v in enumerate(voicelist): | |
print(str(i) + ": " + v.name + " " + str(v.labels)) | |
sys.exit() | |
if args.voice: | |
voice = voicelist[args.voice % len(voicelist)] | |
else: | |
voice = args.name | |
# if -n should consult -f, use the following | |
#voice = next(x for x in voicelist if x.name == args.name) | |
audio = generate( | |
text=str(args.inputfile.read()), | |
voice=voice | |
) | |
if args.play: | |
play(audio) | |
else: | |
save(audio, args.save) | |