speechbrain.lobes.models.MSTacotron2 模块

用于零样本多说话者Tacotron2端到端神经文本到语音(TTS)模型的神经网络模块

作者 * Georges Abous-Rjeili 2021 * Artem Ploujnikov 2021 * Pradnya Kandarkar 2023

摘要

类:

Loss

Tacotron损失函数的实现。该损失包括频谱图上的MSE损失、BCE门损失和引导注意力损失(如果启用),后者试图使注意力矩阵对角化。模块的输出是一个LossStats元组,其中包括总损失。

LossStats

TacotronLoss 的别名

Tacotron2

基于NVIDIA实现的Tactron2文本到语音模型。

TextMelCollate

根据每步的帧数对模型输入和目标进行零填充

参考

class speechbrain.lobes.models.MSTacotron2.Tacotron2(spk_emb_size, mask_padding=True, n_mel_channels=80, n_symbols=148, symbols_embedding_dim=512, encoder_kernel_size=5, encoder_n_convolutions=3, encoder_embedding_dim=512, attention_rnn_dim=1024, attention_dim=128, attention_location_n_filters=32, attention_location_kernel_size=31, n_frames_per_step=1, decoder_rnn_dim=1024, prenet_dim=256, max_decoder_steps=1000, gate_threshold=0.5, p_attention_dropout=0.1, p_decoder_dropout=0.1, postnet_embedding_dim=512, postnet_kernel_size=5, postnet_n_convolutions=5, decoder_no_early_stopping=False)[source]

基础:Module

基于NVIDIA实现的Tactron2文本到语音模型。

该类是模型的主要入口点,负责实例化所有子模块,这些子模块又管理各个神经网络层

简化结构:音素输入 -> 词嵌入 -> 编码器 -> (编码器输出 + 说话者嵌入) -> 注意力 -> 解码器(+预网络) -> 后网络 -> 输出

prenet(输入是解码器前一个时间步)输出是输入到解码器 与注意力输出连接

Parameters:
  • spk_emb_size (int) – 说话者嵌入大小

  • mask_padding (bool) – 是否对tacotron的输出进行掩码填充

  • n_mel_channels (int) – 用于构建频谱图的梅尔通道数量

  • n_symbols (int=128) – 在textToSequence中定义的接受的字符符号数量

  • symbols_embedding_dim (int) – 输入到nn.Embedding的符号的嵌入维度数量

  • encoder_kernel_size (int) – 处理嵌入的内核大小

  • encoder_n_convolutions (int) – 编码器中的卷积层数

  • encoder_embedding_dim (int) – 编码器中的核数量,这也是编码器中双向LSTM的维度

  • attention_rnn_dim (int) – 输入维度

  • attention_dim (int) – 注意力机制中隐藏表示的数量

  • attention_location_n_filters (int) – 注意力机制中一维卷积滤波器的数量

  • attention_location_kernel_size (int) – 一维卷积滤波器的长度

  • n_frames_per_step (int=1) – 目前解码器仅支持每步生成1个mel帧。

  • decoder_rnn_dim (int) – 2个单向堆叠LSTM单元的数量

  • prenet_dim (int) – 线性预网络层的维度

  • max_decoder_steps (int) – 解码器在停止前生成的最大步数/帧数

  • gate_threshold (int) – 任何输出概率高于此值的截止水平被认为是完整的,并停止生成,因此我们有可变长度的输出

  • p_attention_dropout (float) – 注意力丢弃概率

  • p_decoder_dropout (float) – 解码器丢弃概率

  • postnet_embedding_dim (int) – postnet 的过滤器数量

  • postnet_kernel_size (int) – posnet内核的1d大小

  • postnet_n_convolutions (int) – postnet中的卷积层数

  • decoder_no_early_stopping (bool) – 决定解码器是否提前停止 与 gate_threshold 一起使用。其逻辑反值被传递给解码器

Example

>>> import torch
>>> _ = torch.manual_seed(213312)
>>> from speechbrain.lobes.models.Tacotron2 import Tacotron2
>>> model = Tacotron2(
...    mask_padding=True,
...    n_mel_channels=80,
...    n_symbols=148,
...    symbols_embedding_dim=512,
...    encoder_kernel_size=5,
...    encoder_n_convolutions=3,
...    encoder_embedding_dim=512,
...    attention_rnn_dim=1024,
...    attention_dim=128,
...    attention_location_n_filters=32,
...    attention_location_kernel_size=31,
...    n_frames_per_step=1,
...    decoder_rnn_dim=1024,
...    prenet_dim=256,
...    max_decoder_steps=32,
...    gate_threshold=0.5,
...    p_attention_dropout=0.1,
...    p_decoder_dropout=0.1,
...    postnet_embedding_dim=512,
...    postnet_kernel_size=5,
...    postnet_n_convolutions=5,
...    decoder_no_early_stopping=False
... )
>>> _ = model.eval()
>>> inputs = torch.tensor([
...     [13, 12, 31, 14, 19],
...     [31, 16, 30, 31, 0],
... ])
>>> input_lengths = torch.tensor([5, 4])
>>> outputs, output_lengths, alignments = model.infer(inputs, input_lengths)
>>> outputs.shape, output_lengths.shape, alignments.shape
(torch.Size([2, 80, 1]), torch.Size([2]), torch.Size([2, 1, 5]))
parse_output(outputs, output_lengths, alignments_dim=None)[source]

屏蔽输出的填充部分

Parameters:
  • 输出 (列表) – 一个张量列表 - 原始输出

  • output_lengths (torch.Tensor) – 一个表示所有输出长度的张量

  • alignments_dim (int) – 沿最后一个轴的对齐的期望维度 可选但用于数据并行训练时需要

Returns:

  • mel_outputs (torch.Tensor)

  • mel_outputs_postnet (torch.Tensor)

  • gate_outputs (torch.Tensor)

  • alignments (torch.Tensor)

  • output_lengths (torch.Tensor) – 原始输出 - 应用了掩码

forward(inputs, spk_embs, alignments_dim=None)[source]

解码器前向传播用于训练

Parameters:
  • inputs (tuple) – 批处理对象

  • spk_embs (torch.Tensor) – 与输入对应的说话者嵌入

  • alignments_dim (int) – 沿最后一个轴的对齐的期望维度 可选但用于数据并行训练时需要

Returns:

  • mel_outputs (torch.Tensor) – 来自解码器的mel输出

  • mel_outputs_postnet (torch.Tensor) – 来自postnet的mel输出

  • gate_outputs (torch.Tensor) – 来自解码器的门输出

  • alignments (torch.Tensor) – 来自解码器的注意力权重序列

  • output_lengths (torch.Tensor) – 无填充的输出长度

infer(inputs, spk_embs, input_lengths)[source]

生成输出

Parameters:
  • inputs (torch.tensor) – 转换后的文本或音素

  • spk_embs (torch.Tensor) – 与输入对应的说话人嵌入

  • input_lengths (torch.tensor) – 输入参数的长度

Returns:

  • mel_outputs_postnet (torch.Tensor) – tacotron 2 的最终 mel 输出

  • mel_lengths (torch.Tensor) – mels 的长度

  • alignments (torch.Tensor) – 注意力权重的序列

speechbrain.lobes.models.MSTacotron2.LossStats

TacotronLoss 的别名

class speechbrain.lobes.models.MSTacotron2.Loss(guided_attention_sigma=None, gate_loss_weight=1.0, mel_loss_weight=1.0, spk_emb_loss_weight=1.0, spk_emb_loss_type=None, guided_attention_weight=1.0, guided_attention_scheduler=None, guided_attention_hard_stop=None)[source]

基础:Module

Tacotron损失实现 损失包括频谱图上的MSE损失、BCE门损失 以及(如果启用)引导注意力损失,该损失试图使 注意力矩阵对角化 模块的输出是一个LossStats元组,其中包括 总损失

Parameters:
  • guided_attention_sigma (float) – 引导注意力sigma因子,控制掩码的“宽度”

  • gate_loss_weight (float) – 门损失将被乘以的常数

  • mel_loss_weight (float) – mel损失将被乘以的常数

  • spk_emb_loss_weight (float) – 用于乘以说话人嵌入损失的常数 - 未来工作的占位符

  • spk_emb_loss_type (str) – 说话人嵌入损失的类型 - 未来工作的占位符

  • guided_attention_weight (float) – 引导注意力的权重

  • guided_attention_scheduler (callable) – 用于引导注意力损失的调度器类

  • guided_attention_hard_stop (int) – 引导注意力将在多少个周期后完全关闭

Example

>>> import torch
>>> _ = torch.manual_seed(42)
>>> from speechbrain.lobes.models.MSTacotron2 import Loss
>>> loss = Loss(guided_attention_sigma=0.2)
>>> mel_target = torch.randn(2, 80, 861)
>>> gate_target = torch.randn(1722, 1)
>>> mel_out = torch.randn(2, 80, 861)
>>> mel_out_postnet = torch.randn(2, 80, 861)
>>> gate_out = torch.randn(2, 861)
>>> alignments = torch.randn(2, 861, 173)
>>> pred_mel_lens = torch.randn(2)
>>> targets = mel_target, gate_target
>>> model_outputs = mel_out, mel_out_postnet, gate_out, alignments, pred_mel_lens
>>> input_lengths = torch.tensor([173,  91])
>>> target_lengths = torch.tensor([861, 438])
>>> spk_embs = None
>>> loss(model_outputs, targets, input_lengths, target_lengths, spk_embs, 1)
TacotronLoss(loss=tensor([4.8566]), mel_loss=tensor(4.0097), spk_emb_loss=tensor([0.]), gate_loss=tensor(0.8460), attn_loss=tensor(0.0010), attn_weight=tensor(1.))
forward(model_output, targets, input_lengths, target_lengths, spk_embs, epoch)[source]

计算损失 :param model_output: 模型forward()的输出:

(mel_outputs, mel_outputs_postnet, gate_outputs, alignments)

Parameters:
  • targets (tuple) – 目标

  • input_lengths (torch.Tensor) – 一个 (batch, length) 的输入长度张量

  • target_lengths (torch.Tensor) – 一个 (batch, length) 的目标(频谱图)长度张量

  • spk_embs (torch.Tensor) – 用于损失计算的说话人嵌入输入 - 未来工作的占位符

  • epoch (int) – 当前的epoch编号(用于指导注意力损失的调度)通常使用StepScheduler

Returns:

result – 总损失 - 以及个别损失(mel 和 gate)

Return type:

损失统计

get_attention_loss(alignments, input_lengths, target_lengths, epoch)[source]

计算注意力损失 :param alignments: 模型的对齐矩阵 :type alignments: torch.Tensor :param input_lengths: 输入长度的 (batch, length) 张量 :type input_lengths: torch.Tensor :param target_lengths: 目标(频谱图)长度的 (batch, length) 张量 :type target_lengths: torch.Tensor :param epoch: 当前的周期数(用于指导注意力的调度)

损失)StepScheduler 通常用于

Returns:

attn_loss – 注意力损失值

Return type:

torch.Tensor

class speechbrain.lobes.models.MSTacotron2.TextMelCollate(speaker_embeddings_pickle, n_frames_per_step=1)[source]

基础类:object

根据每步的帧数对模型输入和目标进行零填充

Parameters:
  • speaker_embeddings_pickle (str) – 包含说话者嵌入的文件的路径

  • n_frames_per_step (int) – 每个步骤的输出帧数

__call__(batch)[source]

从归一化文本和梅尔频谱图中整理训练批次

Parameters:

batch (list) – [text_normalized, mel_normalized]

Returns:

  • text_padded (torch.Tensor)

  • input_lengths (torch.Tensor)

  • mel_padded (torch.Tensor)

  • gate_padded (torch.Tensor)

  • output_lengths (torch.Tensor)

  • len_x (torch.Tensor)

  • labels (torch.Tensor)

  • wavs (torch.Tensor)

  • spk_embs (torch.Tensor)

  • spk_ids (torch.Tensor)