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)