Spaces:
Runtime error
Runtime error
import torch | |
from torch.nn import functional as F | |
class ResidualBlock(torch.nn.Module): | |
"""Residual block module in WaveNet.""" | |
def __init__( | |
self, | |
kernel_size=3, | |
res_channels=64, | |
gate_channels=128, | |
skip_channels=64, | |
aux_channels=80, | |
dropout=0.0, | |
dilation=1, | |
bias=True, | |
use_causal_conv=False, | |
): | |
super().__init__() | |
self.dropout = dropout | |
# no future time stamps available | |
if use_causal_conv: | |
padding = (kernel_size - 1) * dilation | |
else: | |
assert (kernel_size - 1) % 2 == 0, "Not support even number kernel size." | |
padding = (kernel_size - 1) // 2 * dilation | |
self.use_causal_conv = use_causal_conv | |
# dilation conv | |
self.conv = torch.nn.Conv1d( | |
res_channels, gate_channels, kernel_size, padding=padding, dilation=dilation, bias=bias | |
) | |
# local conditioning | |
if aux_channels > 0: | |
self.conv1x1_aux = torch.nn.Conv1d(aux_channels, gate_channels, 1, bias=False) | |
else: | |
self.conv1x1_aux = None | |
# conv output is split into two groups | |
gate_out_channels = gate_channels // 2 | |
self.conv1x1_out = torch.nn.Conv1d(gate_out_channels, res_channels, 1, bias=bias) | |
self.conv1x1_skip = torch.nn.Conv1d(gate_out_channels, skip_channels, 1, bias=bias) | |
def forward(self, x, c): | |
""" | |
x: B x D_res x T | |
c: B x D_aux x T | |
""" | |
residual = x | |
x = F.dropout(x, p=self.dropout, training=self.training) | |
x = self.conv(x) | |
# remove future time steps if use_causal_conv conv | |
x = x[:, :, : residual.size(-1)] if self.use_causal_conv else x | |
# split into two part for gated activation | |
splitdim = 1 | |
xa, xb = x.split(x.size(splitdim) // 2, dim=splitdim) | |
# local conditioning | |
if c is not None: | |
assert self.conv1x1_aux is not None | |
c = self.conv1x1_aux(c) | |
ca, cb = c.split(c.size(splitdim) // 2, dim=splitdim) | |
xa, xb = xa + ca, xb + cb | |
x = torch.tanh(xa) * torch.sigmoid(xb) | |
# for skip connection | |
s = self.conv1x1_skip(x) | |
# for residual connection | |
x = (self.conv1x1_out(x) + residual) * (0.5**2) | |
return x, s | |