mirror of https://github.com/coqui-ai/TTS.git
22 KiB
22 KiB
None
<html lang="en">
<head>
</head>
</html>
This is to test TTS models with benchmark sentences for speech synthesis.
Before running this script please DON'T FORGET:
- to set file paths.
- to download related model files.
- download or clone related repos, linked below.
- setup the repositories.
python setup.py install
- to checkout right commit versions (given next to the model in the models page).
- to set the file paths below.
Repositories:
In [ ]:
%load_ext autoreload %autoreload 2 import os # you may need to change this depending on your system os.environ['CUDA_VISIBLE_DEVICES']='1' import sys import io import torch import tensorflow as tf print(tf.config.list_physical_devices('GPU')) import time import json import yaml import numpy as np from collections import OrderedDict import matplotlib.pyplot as plt plt.rcParams["figure.figsize"] = (16,5) import librosa import librosa.display from TTS.tf.models.tacotron2 import Tacotron2 from TTS.tf.utils.generic_utils import setup_model, load_checkpoint from TTS.utils.audio import AudioProcessor from TTS.utils.io import load_config from TTS.utils.synthesis import synthesis from TTS.utils.visual import visualize import IPython from IPython.display import Audio %matplotlib agg
In [ ]:
def tts(model, text, CONFIG, use_cuda, ap, use_gl, figures=True): t_1 = time.time() waveform, alignment, mel_spec, mel_postnet_spec, stop_tokens, inputs = synthesis(model, text, CONFIG, use_cuda, ap, None, None, False, CONFIG.enable_eos_bos_chars, use_gl, backend=BACKEND) if CONFIG.model == "Tacotron" and not use_gl: # coorect the normalization differences b/w TTS and the Vocoder. mel_postnet_spec = ap.out_linear_to_mel(mel_postnet_spec.T).T print(mel_postnet_spec.shape) print("max- ", mel_postnet_spec.max(), " -- min- ", mel_postnet_spec.min()) if not use_gl: waveform = vocoder_model.inference(torch.FloatTensor(mel_postnet_spec.T).unsqueeze(0)) mel_postnet_spec = ap._denormalize(mel_postnet_spec.T).T if use_cuda and not use_gl: waveform = waveform.cpu() waveform = waveform.numpy() waveform = waveform.squeeze() rtf = (time.time() - t_1) / (len(waveform) / ap.sample_rate) print(waveform.shape) print(" > Run-time: {}".format(time.time() - t_1)) print(" > Real-time factor: {}".format(rtf)) if figures: visualize(alignment, mel_postnet_spec, stop_tokens, text, ap.hop_length, CONFIG, ap._denormalize(mel_spec.T).T) IPython.display.display(Audio(waveform, rate=CONFIG.audio['sample_rate'], normalize=True)) os.makedirs(OUT_FOLDER, exist_ok=True) file_name = text.replace(" ", "_").replace(".","") + ".wav" out_path = os.path.join(OUT_FOLDER, file_name) ap.save_wav(waveform, out_path) return alignment, mel_postnet_spec, stop_tokens, waveform
In [ ]:
# Set constants ROOT_PATH = '../tf_model/' MODEL_PATH = ROOT_PATH + '/tts_tf_checkpoint_360000.pkl' CONFIG_PATH = ROOT_PATH + '/config.json' OUT_FOLDER = '/home/erogol/Dropbox/AudioSamples/benchmark_samples/' CONFIG = load_config(CONFIG_PATH) # Run FLAGs use_cuda = True # Set the vocoder use_gl = True # use GL if True BACKEND = 'tf'
In [ ]:
from TTS.utils.text.symbols import symbols, phonemes, make_symbols from TTS.tf.utils.convert_torch_to_tf_utils import tf_create_dummy_inputs c = CONFIG num_speakers = 0 r = 1 num_chars = len(phonemes) if c.use_phonemes else len(symbols) model = setup_model(num_chars, num_speakers, c) # before loading weights you need to run the model once to generate the variables input_ids, input_lengths, mel_outputs, mel_lengths = tf_create_dummy_inputs() mel_pred = model(input_ids, training=False)
In [ ]:
model = load_checkpoint(model, MODEL_PATH) # model = tf.function(model, experimental_relax_shapes=True) ap = AudioProcessor(**CONFIG.audio)
In [ ]:
# wrapper class to use tf.function class ModelInference(tf.keras.Model): def __init__(self, model): super(ModelInference, self).__init__() self.model = model @tf.function(input_signature=[tf.TensorSpec(shape=(None, None), dtype=tf.int32)]) def call(self, characters): return self.model(characters, training=False) model = ModelInference(model)
In [ ]:
# LOAD WAVERNN if use_gl == False: from parallel_wavegan.models import ParallelWaveGANGenerator, MelGANGenerator vocoder_model = MelGANGenerator(**VOCODER_CONFIG["generator_params"]) vocoder_model.load_state_dict(torch.load(VOCODER_MODEL_PATH, map_location="cpu")["model"]["generator"]) vocoder_model.remove_weight_norm() ap_vocoder = AudioProcessor(**VOCODER_CONFIG['audio']) if use_cuda: vocoder_model.cuda() vocoder_model.eval(); print(count_parameters(vocoder_model))
Comparision with https://mycroft.ai/blog/available-voices/¶
In [ ]:
sentence = "Bill got in the habit of asking himself “Is that thought true?” and if he wasn’t absolutely certain it was, he just let it go." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "The Commission also recommends" align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "As a result of these studies, the planning document submitted by the Secretary of the Treasury to the Bureau of the Budget on August thirty-one." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "The FBI now transmits information on all defectors, a category which would, of course, have included Oswald." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "they seem unduly restrictive in continuing to require some manifestation of animus against a Government official." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "and each agency given clear understanding of the assistance which the Secret Service expects." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
Other examples¶
In [ ]:
sentence = "Be a voice, not an echo." # 'echo' is not in training set. align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "It took me quite a long time to develop a voice, and now that I have it I'm not going to be silent." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "The human voice is the most perfect instrument of all." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "I'm sorry Dave. I'm afraid I can't do that." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "This cake is great. It's so delicious and moist." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
Comparison with https://keithito.github.io/audio-samples/¶
In [ ]:
sentence = "Generative adversarial network or variational auto-encoder." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "Scientists at the CERN laboratory say they have discovered a new particle." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "Here’s a way to measure the acute emotional intelligence that has never gone out of style." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "President Trump met with other leaders at the Group of 20 conference." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "The buses aren't the problem, they actually provide a solution." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "Generative adversarial network or variational auto-encoder." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "Basilar membrane and otolaryngology are not auto-correlations." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = " He has read the whole thing." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "He reads books." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "Thisss isrealy awhsome." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "This is your internet browser, Firefox." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "This is your internet browser Firefox." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "The quick brown fox jumps over the lazy dog." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "Does the quick brown fox jump over the lazy dog?" align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "Eren, how are you?" align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
Hard Sentences¶
In [ ]:
sentence = "Encouraged, he started with a minute a day." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "His meditation consisted of “body scanning” which involved focusing his mind and energy on each section of the body from head to toe ." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "Recent research at Harvard has shown meditating for as little as 8 weeks can actually increase the grey matter in the parts of the brain responsible for emotional regulation and learning . " align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "If he decided to watch TV he really watched it." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
sentence = "Often we try to bring about change through sheer effort and we put all of our energy into a new initiative ." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
# for twb dataset sentence = "In our preparation for Easter, God in his providence offers us each year the season of Lent as a sacramental sign of our conversion." align, spec, stop_tokens, wav = tts(model, sentence, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True)
In [ ]:
wavs = [] model.eval() model.decoder.prenet.eval() model.decoder.max_decoder_steps = 2000 # model.decoder.prenet.train() speaker_id = None sentence = '''This is App Store Optimization report. The first tab on the report is App Details. App details report is updated weekly and Datetime column shows the latest report update date. The widget displays the app icon, respective app version, visual assets on the store, app description, latest app update date on the Appstore/Google PlayStore and what’s new section. In App Details tab, you can see not only your app but all Delivery Hero apps since we think it can be inspiring to see the other apps, their description and screenshots. Product name is the actual app name on the AppStore or Google Play Store. Screenshot URLs column display the actual screenshots on the store for the current version. No resizing is done. If you click on the screenshot, you can see it in full-size. Current release date show the latest app update date when the query is run. Here we see that Appetito24 Android is updated to app version 4.6.3.2 on 28th of March. If the description is too long, clarisights is not able to display the full description; however, if you select description and current_release_date cells to copy and paste it to a text editor, you'll see the full description. If you scroll down in the widget, you can see the older app versions for the same apps. Or you can filter Datetime to see a specific timeframe and the apps’ Store presence back then. You can also filter for a specific app using Product Name. If the description is too long, clarisights is not able to display the full description; however, if you select description and current_release_date cells to copy and paste it to a text editor, you'll see the full description. ''' for s in sentence.split('\n'): print(s) align, spec, stop_tokens, wav = tts(model, s, CONFIG, use_cuda, ap, use_gl=use_gl, figures=True) wavs = np.concatenate([wavs, np.zeros(int(ap.sample_rate * 0.5)), wav])
In [ ]: