| |
| |
| |
| |
|
|
| |
|
|
| import torch |
| from torch import nn |
| from modules.base.base_module import LayerNorm |
|
|
|
|
| class DurationPredictor(nn.Module): |
| def __init__( |
| self, in_channels, filter_channels, kernel_size, p_dropout, gin_channels=0 |
| ): |
| super().__init__() |
|
|
| self.in_channels = in_channels |
| self.filter_channels = filter_channels |
| self.kernel_size = kernel_size |
| self.p_dropout = p_dropout |
| self.gin_channels = gin_channels |
|
|
| self.drop = nn.Dropout(p_dropout) |
| self.conv_1 = nn.Conv1d( |
| in_channels, filter_channels, kernel_size, padding=kernel_size // 2 |
| ) |
| self.norm_1 = LayerNorm(filter_channels) |
| self.conv_2 = nn.Conv1d( |
| filter_channels, filter_channels, kernel_size, padding=kernel_size // 2 |
| ) |
| self.norm_2 = LayerNorm(filter_channels) |
| self.proj = nn.Conv1d(filter_channels, 1, 1) |
|
|
| if gin_channels != 0: |
| self.cond = nn.Conv1d(gin_channels, in_channels, 1) |
|
|
| def forward(self, x, x_mask, g=None): |
| x = torch.detach(x) |
| if g is not None: |
| g = torch.detach(g) |
| x = x + self.cond(g) |
| x = self.conv_1(x * x_mask) |
| x = torch.relu(x) |
| x = self.norm_1(x) |
| x = self.drop(x) |
| x = self.conv_2(x * x_mask) |
| x = torch.relu(x) |
| x = self.norm_2(x) |
| x = self.drop(x) |
| x = self.proj(x * x_mask) |
| return x * x_mask |
|
|