模型描述

Tacotron 2 和 WaveGlow 模型构成了一个文本到语音系统,使用户能够从原始文本记录合成自然的语音,无需任何附加的韵律信息。Tacotron 2 模型使用编码器-解码器架构从输入文本生成 Mel 频谱图。WaveGlow(也可通过 torch.hub 获取)是一个基于流的模型,它消耗 Mel 频谱图来生成语音。

本 Tacotron 2 模型的实现与论文中描述的模型有所不同。我们的实现使用 Dropout 而非 Zoneout 来正则化 LSTM 层。

示例

在下面的示例中

  • 从 torch.hub 加载预训练的 Tacotron2 和 Waveglow 模型
  • 给定输入文本(“Hello world, I missed you so much”)的张量表示,Tacotron2 生成 Mel 频谱图,如插图所示
  • Waveglow 根据 Mel 频谱图生成声音
  • 输出声音被保存在一个 ‘audio.wav’ 文件中

要运行示例,您需要安装一些额外的 Python 软件包。这些软件包用于文本和音频预处理,以及显示和输入/输出。

pip install numpy scipy librosa unidecode inflect librosa
apt-get update
apt-get install -y libsndfile1

加载在 LJ Speech 数据集上预训练的 Tacotron2 模型并准备进行推理

import torch
tacotron2 = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_tacotron2', model_math='fp16')
tacotron2 = tacotron2.to('cuda')
tacotron2.eval()

加载预训练的 WaveGlow 模型

waveglow = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_waveglow', model_math='fp16')
waveglow = waveglow.remove_weightnorm(waveglow)
waveglow = waveglow.to('cuda')
waveglow.eval()

现在,让我们让模型说

text = "Hello world, I missed you so much."

使用实用方法格式化输入

utils = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_tts_utils')
sequences, lengths = utils.prepare_input_sequence([text])

运行链式模型

with torch.no_grad():
    mel, _, _ = tacotron2.infer(sequences, lengths)
    audio = waveglow.infer(mel)
audio_numpy = audio[0].data.cpu().numpy()
rate = 22050

您可以将其写入文件并收听

from scipy.io.wavfile import write
write("audio.wav", rate, audio_numpy)

或者,在带有 IPython 小部件的笔记本中立即播放

from IPython.display import Audio
Audio(audio_numpy, rate=rate)

详情

有关模型输入和输出、训练方法、推理和性能的详细信息,请访问:github 和/或 NGC

参考文献