Spaces:
Sleeping
Sleeping
import torch | |
import torch.nn as nn | |
import torch.nn.functional as F | |
from ..layers import ConvNorm | |
class PostNet1d(nn.Module): | |
""" | |
PostNet: Five 1-d convolution with 512 channels and kernel size 5 | |
""" | |
def __init__(self, n_mel_channels=80, postnet_embedding_dim=512, postnet_kernel_size=7, postnet_n_convolutions=7): | |
super(PostNet1d, self).__init__() | |
self.convolutions = nn.ModuleList() | |
self.convolutions.append( | |
nn.Sequential( | |
ConvNorm(n_mel_channels, | |
postnet_embedding_dim, | |
kernel_size=postnet_kernel_size, | |
stride=1, | |
padding=int((postnet_kernel_size - 1) / 2), | |
dilation=1, | |
w_init_gain='tanh'), nn.InstanceNorm1d(postnet_embedding_dim))) | |
for i in range(1, postnet_n_convolutions - 1): | |
self.convolutions.append( | |
nn.Sequential( | |
ConvNorm(postnet_embedding_dim, | |
postnet_embedding_dim, | |
kernel_size=postnet_kernel_size, | |
stride=1, | |
padding=int((postnet_kernel_size - 1) / 2), | |
dilation=1, | |
w_init_gain='tanh'), nn.InstanceNorm1d(postnet_embedding_dim))) | |
self.convolutions.append( | |
nn.Sequential( | |
ConvNorm(postnet_embedding_dim, | |
n_mel_channels, | |
kernel_size=postnet_kernel_size, | |
stride=1, | |
padding=int((postnet_kernel_size - 1) / 2), | |
dilation=1, | |
w_init_gain='linear'), nn.InstanceNorm1d(n_mel_channels))) | |
def forward(self, x): | |
x = x.contiguous().transpose(1, 2) | |
for i in range(len(self.convolutions) - 1): | |
x = F.dropout(torch.tanh(self.convolutions[i](x)), 0.1, self.training) | |
x = F.dropout(self.convolutions[-1](x), 0.1, self.training) | |
x = x.contiguous().transpose(1, 2) | |
return x | |