speechbrain.lobes.models.MSTacotron2 模块
用于零样本多说话人 Tacotron2 端到端神经文本转语音 (TTS) 模型的神经网络模块
作者 * Georges Abous-Rjeili 2021 * Artem Ploujnikov 2021 * Pradnya Kandarkar 2023
概述
类
Tacotron 损失实现 该损失由声谱图的 MSE 损失、BCE 门控损失和引导注意力损失(如果启用)组成,旨在使注意力矩阵对角化 模块的输出是一个 LossStats 元组,其中包括总损失 |
|
|
|
Tactron2 文本转语音模型,基于 NVIDIA 实现。 |
|
根据每步帧数对模型输入和目标进行零填充 |
参考
- 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]
基类:
object
Tactron2 文本转语音模型,基于 NVIDIA 实现。
此类是模型的主要入口点,负责实例化所有子模块,这些子模块反过来管理各个神经网络层
简化结构:音素输入->token embedding ->编码器 -> (编码器输出 + 说话人 embedding) ->注意力 ->解码器(+prenet) -> postnet ->输出
prenet(输入是解码器前一时间步)输出是与注意力输出连接后输入到解码器的内容
- 参数:
spk_emb_size (int) – 说话人 embedding 大小
mask_padding (bool) – 是否屏蔽 tacotron 的填充输出
n_mel_channels (int) – 用于构建声谱图的 mel 通道数
n_symbols (int=128) – 在 textToSequence 中定义的接受的字符符号数
symbols_embedding_dim (int) – 馈送到 nn.Embedding 的符号 embedding 维度数
encoder_kernel_size (int) – 处理 embedding 的核大小
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) – 线性 prenet 层的维度
max_decoder_steps (int) – 解码器停止前生成的最大步数/帧数
gate_threshold (int) – 截止级别,任何高于该值的输出概率都被认为完成并停止生成,因此我们有可变长度输出
p_attention_dropout (float) – 注意力 dropout 概率
p_decoder_dropout (float) – 解码器 dropout 概率
postnet_embedding_dim (int) – postnet 滤波器数
postnet_kernel_size (int) – postnet 核的一维大小
postnet_n_convolutions (int) – postnet 中的卷积层数
decoder_no_early_stopping (bool) – 与 gate_threshold 一起决定解码器是否提前停止。其逻辑反向馈送到解码器
示例
>>> 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]))
- forward(inputs, spk_embs, alignments_dim=None)[source]
用于训练的解码器前向传播
- 参数:
- 返回:
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]
生成输出
- 参数:
inputs (torch.tensor) – 转换后的文本或音素
spk_embs (torch.Tensor) – 与输入对应的说话人 embeddings
input_lengths (torch.tensor) – 输入参数的长度
- 返回:
mel_outputs_postnet (torch.Tensor) – tacotron 2 的最终 mel 输出
mel_lengths (torch.Tensor) – mel 的长度
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]
基类:
object
Tacotron 损失实现 该损失由声谱图的 MSE 损失、BCE 门控损失和引导注意力损失(如果启用)组成,旨在使注意力矩阵对角化 模块的输出是一个 LossStats 元组,其中包括总损失
- 参数:
guided_attention_sigma (float) – 引导注意力的 sigma 因子,控制掩码的“宽度”
gate_loss_weight (float) – 门控损失将乘以的常数
mel_loss_weight (float) – mel 损失将乘以的常数
spk_emb_loss_weight (float) – 说话人 embedding 损失将乘以的常数 - 未来工作的占位符
spk_emb_loss_type (str) – 说话人 embedding 损失的类型 - 未来工作的占位符
guided_attention_weight (float) – 引导注意力的权重
guided_attention_scheduler (callable) – 用于引导注意力损失的调度器类
guided_attention_hard_stop (int) – 在此 epoch 数后,引导注意力将完全关闭
示例
>>> 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)
- 参数:
- 返回:
result – 总损失 - 以及各个损失(mel 和 gate)
- 返回类型:
LossStats
- 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: 当前 epoch 数(用于引导注意力的调度
损失)通常使用 StepScheduler
- 返回:
attn_loss – 注意力损失值
- 返回类型:
torch.Tensor
- class speechbrain.lobes.models.MSTacotron2.TextMelCollate(speaker_embeddings_pickle, n_frames_per_step=1)[source]
基类:
object
根据每步帧数对模型输入和目标进行零填充
- __call__(batch)[source]
从标准化文本和 mel 声谱图整理训练批次
- 参数:
batch (list) – [text_normalized, mel_normalized]
- 返回:
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)