diff --git a/tts/tacotron2_v1_early_fakeyou/vocodes_common.py b/tts/tacotron2_v1_early_fakeyou/vocodes_common.py index ab5b336..05e6b22 100644 --- a/tts/tacotron2_v1_early_fakeyou/vocodes_common.py +++ b/tts/tacotron2_v1_early_fakeyou/vocodes_common.py @@ -284,16 +284,21 @@ class FakeYouTt2Pipeline: len(self.tacotron_model_cache))) def infer(self, args): + # Model parameters assert('synthesizer_checkpoint_path' in args) assert('vocoder_type' in args) + assert('text_pipeline_type' in args) + # Optional mel scaling before vocodinng assert('use_default_mel_multiply_factor' in args) assert('maybe_custom_mel_multiply_factor' in args) - assert('text_pipeline_type' in args) + # Premium features + assert('max_decoder_steps' in args) + # User input assert('raw_text' in args) + # Output files assert('output_audio_filename' in args) assert('output_spectrogram_filename' in args) assert('output_metadata_filename' in args) - assert('max_decoder_steps' in args) LOGGER.info(f"raw inference text: {args['raw_text']}") diff --git a/tts/tacotron2_v1_early_fakeyou/vocodes_inference_updated.py b/tts/tacotron2_v1_early_fakeyou/vocodes_inference_updated.py new file mode 100755 index 0000000..d170a74 --- /dev/null +++ b/tts/tacotron2_v1_early_fakeyou/vocodes_inference_updated.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python + +""" +Vocodes Tacotron Inference Engine +This is a work in progress and is likely going to be slow for now. +""" + +# ========== ARGUMENTS (FAIL EARLY IF ABSENT) ========== + +import argparse + +parser = argparse.ArgumentParser(description='Run TTS inference') + +# Model parameters +parser.add_argument('--synthesizer_checkpoint_path', type=str, help='path the TTS synthesizer model', required=True) +parser.add_argument('--text_pipeline_type', type=str, help='', required=True) +parser.add_argument('--vocoder_type', type=str, help='', required=True) +parser.add_argument('--waveglow_vocoder_checkpoint_path', type=str, help='path the TTS vocoder model') +parser.add_argument('--hifigan_vocoder_checkpoint_path', type=str, help='path the TTS vocoder model') +parser.add_argument('--hifigan_superres_vocoder_checkpoint_path', type=str, help='path the TTS vocoder model') + +# Optional mel scaling before vocoding +parser.add_argument('--use_default_mel_multiply_factor', type=bool, help='', action='store_true') +parser.add_argument('--maybe_custom_mel_multiply_factor', type=int, help='') + +# Premium features +parser.add_argument('--max_decoder_steps', type=int, help='') + +# User input +parser.add_argument('--input_text_filename', type=str, help='path the file containing text to run', required=True) + +# Output files +parser.add_argument('--output_audio_filename', type=str, help='where to save result audio', required=True) +parser.add_argument('--output_spectrogram_filename', type=str, help='where to save result spectrogram', required=True) +parser.add_argument('--output_metadata_filename', type=str, help='where to save extra metadata', required=True) + +args = parser.parse_args() + + +# ========== IMPORTS ========== + +import sys +sys.path.append('waveglow/') +import shutil +import json + +import numpy as np +import torch + +from hparams import create_hparams +from model import Tacotron2 +from text import text_to_sequence +from denoiser import Denoiser + +from vocodes_common import FakeYouTt2Pipeline +from vocodes_common import print_gpu_info +from vocodes_common import parse_int_or_default + +# For metadata +import subprocess +import magic +import os + +from logger import LOGGER + + +# ========== PRINT GPU INFO ========== + +import tensorflow as tf +print("TensorFlow version: {}".format(tf.version.VERSION)) +print_gpu_info() + + +# ========== LOAD MODEL + SETUP ========== + +pipeline = FakeYouTt2Pipeline() + +# NB: Not sure if there was a historical decision to load the models first outside of the pipeline. +# Probably not, though. Seems like this could be cleaned up. +if args.vocoder_type == 'hifigan-superres': + pipeline.maybe_load_waveglow_model(args.waveglow_vocoder_checkpoint_path) +elif args.vocoder_type == 'waveglow': + pipeline.maybe_load_waveglow_model(args.hifigan_vocoder_checkpoint_path) + pipeline.maybe_load_waveglow_model(args.hifigan_superres_vocoder_checkpoint_path) +else: + raise Exception('Wrong vocoder type: {}'.format(args.vocoder_type)) + + +pipeline.maybe_load_tacotron_model_to_cache(args.synthesizer_checkpoint_path) + +# NB: 1000 is the default and is roughly 12 seconds. +max_decoder_steps = parse_int_or_default(args.max_decoder_steps, 1000) + +inference_args = { + 'raw_text': args.inference_text, + 'use_default_mel_multiply_factor': args.use_default_mel_multiply_factor, + 'maybe_custom_mel_multiply_factor': args.maybe_custom_mel_multiply_factor, + 'synthesizer_checkpoint_path': args.synthesizer_checkpoint_path, + 'vocoder_type': args.vocoder_type, + 'text_pipeline_type': args.text_pipeline_type, + 'output_audio_filename': args.output_audio_filename, + 'output_spectrogram_filename': args.output_spectrogram_filename, + 'output_metadata_filename': args.output_metadata_filename, + 'max_decoder_steps': max_decoder_steps, +} + +LOGGER.info(f"running inference with args: {inference_args}") + + +# ========== INFERENCE ========== + +pipeline.infer(inference_args) + diff --git a/tts/tacotron2_v1_early_fakeyou/vocodes_server.py b/tts/tacotron2_v1_early_fakeyou/vocodes_server.py index 1abb15f..08e838b 100755 --- a/tts/tacotron2_v1_early_fakeyou/vocodes_server.py +++ b/tts/tacotron2_v1_early_fakeyou/vocodes_server.py @@ -222,25 +222,31 @@ class ApiHandler(): LOGGER.info(f"TTS Request: {raw_data}") - # ========== RUST SERVICE ARGUMENTS ========== + # ========== RUST SERVICE ARGUMENTS (REQUEST PARAMETERS) ========== - # Request parameters + # Model parameters synthesizer_checkpoint_path = raw_data.get('synthesizer_checkpoint_path') text_pipeline_type = raw_data.get('text_pipeline_type') - use_default_mel_multiply_factor = raw_data.get('use_default_mel_multiply_factor') - maybe_custom_mel_multiply_factor = raw_data.get('maybe_custom_mel_multiply_factor') vocoder_type = raw_data.get('vocoder_type') waveglow_vocoder_checkpoint_path = raw_data.get('waveglow_vocoder_checkpoint_path') hifigan_vocoder_checkpoint_path = raw_data.get('hifigan_vocoder_checkpoint_path') hifigan_superres_vocoder_checkpoint_path = raw_data.get('hifigan_superres_vocoder_checkpoint_path') + + # Optional mel scaling before vocoding + use_default_mel_multiply_factor = raw_data.get('use_default_mel_multiply_factor') + maybe_custom_mel_multiply_factor = raw_data.get('maybe_custom_mel_multiply_factor') + + # Premium features + maybe_max_decoder_steps = raw_data.get('max_decoder_steps') + + # User input inference_text = raw_data.get('inference_text') + + # Output files output_audio_filename = raw_data.get('output_audio_filename') output_spectrogram_filename = raw_data.get('output_spectrogram_filename') output_metadata_filename = raw_data.get('output_metadata_filename') - # Temporarily optional request parameters - maybe_max_decoder_steps = raw_data.get('max_decoder_steps') - # Optional request parameters maybe_clear_synthesizer_checkpoint_path = \ raw_data.get('maybe_clear_synthesizer_checkpoint_path')