espeak-phonemizer/espeak_phonemizer/__main__.py
2021-08-25 17:17:46 -04:00

132 lines
3.9 KiB
Python

"""Command-line interface to espeak_phonemizer"""
import argparse
import csv
import logging
import os
import sys
from . import Phonemizer
_LOGGER = logging.getLogger("espeak_phonemizer")
# -----------------------------------------------------------------------------
def main():
parser = argparse.ArgumentParser(prog="espeak_phonemizer")
parser.add_argument("-v", "--voice", help="eSpeak voice to use")
parser.add_argument(
"-p", "--phoneme-separator", help="Separator character between phonemes"
)
parser.add_argument(
"-w",
"--word-separator",
help="Separator string between words (cannot be used if --phoneme-separator is whitespace)",
)
parser.add_argument(
"--keep-punctuation",
action="store_true",
help="Keep clause-breaking punctuation characters (,;:.!?)",
)
parser.add_argument(
"--keep-language-flags",
action="store_true",
help="Keep language-switching flags",
)
parser.add_argument(
"--print-input", action="store_true", help="Print input text before phonemes"
)
parser.add_argument(
"--output-separator",
default=" ",
help="Separator string between input text and phonemes",
)
parser.add_argument(
"--no-stress",
action="store_true",
help="Remove primary/secondary stress markers",
)
parser.add_argument(
"--csv",
action="store_true",
help="Input and output is CSV. Phonemes are added as a final column",
)
parser.add_argument(
"--csv-delimiter", default="|", help="Delimiter in CSV input and output"
)
parser.add_argument("--version", action="store_true", help="Print version and exit")
parser.add_argument(
"--debug", action="store_true", help="Print DEBUG messages to the console"
)
args = parser.parse_args()
if args.debug:
logging.basicConfig(level=logging.DEBUG)
else:
logging.basicConfig(level=logging.INFO)
# -------------------------------------------------------------------------
if args.version:
# Print version and exit
from . import __version__
print(__version__)
sys.exit(0)
# -------------------------------------------------------------------------
assert args.voice, "Missing -v/--voice"
if args.word_separator:
assert (
args.phoneme_separator.strip()
), "Word separator cannot be used if phoneme separator is whitespace"
phonemizer = Phonemizer(default_voice=args.voice)
# CSV input/output
if args.csv:
csv_writer = csv.writer(sys.stdout, delimiter=args.csv_delimiter)
reader = csv.reader(sys.stdin, delimiter=args.csv_delimiter)
else:
csv_writer = None
reader = sys.stdin
if os.isatty(sys.stdin.fileno()):
print("Reading text from stdin...", file=sys.stderr)
for line in reader:
if args.csv:
text = line[-1]
else:
text = line.strip()
if not text:
continue
text_phonemes = phonemizer.phonemize(
text,
keep_clause_breakers=args.keep_punctuation,
phoneme_separator=args.phoneme_separator,
keep_language_flags=args.keep_language_flags,
no_stress=args.no_stress,
punctuation_separator=args.phoneme_separator or "",
)
if args.word_separator:
text_phonemes = args.word_separator.join(text_phonemes.split())
if args.csv:
assert csv_writer is not None
csv_writer.writerow((*line, text_phonemes))
else:
if args.print_input:
print(text, text_phonemes, sep=args.output_separator)
else:
print(text_phonemes)
# -----------------------------------------------------------------------------
if __name__ == "__main__":
main()