1
0
mirror of https://github.com/fumiama/Retrieval-based-Voice-Conversion-WebUI.git synced 2026-06-05 01:10:22 +08:00

optimize(rvc.utils): more type defs & rename

This commit is contained in:
源文雨
2024-06-07 19:33:45 +09:00
parent c10c527264
commit 49488dcae9
6 changed files with 41 additions and 75 deletions

View File

@@ -18,7 +18,6 @@ class Encoder(nn.Module):
kernel_size=1,
p_dropout=0.0,
window_size=10,
**kwargs
):
super(Encoder, self).__init__()
self.hidden_channels = hidden_channels
@@ -55,8 +54,11 @@ class Encoder(nn.Module):
)
)
self.norm_layers_2.append(LayerNorm(hidden_channels))
def __call__(self, x: torch.Tensor, x_mask: torch.Tensor) -> torch.Tensor:
return super().__call__(x, x_mask)
def forward(self, x, x_mask):
def forward(self, x: torch.Tensor, x_mask: torch.Tensor) -> torch.Tensor:
attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1)
x = x * x_mask
zippep = zip(
@@ -86,7 +88,6 @@ class Decoder(nn.Module):
p_dropout=0.0,
proximal_bias=False,
proximal_init=True,
**kwargs
):
super(Decoder, self).__init__()
self.hidden_channels = hidden_channels
@@ -311,7 +312,6 @@ class MultiHeadAttention(nn.Module):
if pad_length > 0:
padded_relative_embeddings = F.pad(
relative_embeddings,
# commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]]),
[0, 0, pad_length, pad_length, 0, 0],
)
else:
@@ -328,19 +328,11 @@ class MultiHeadAttention(nn.Module):
"""
batch, heads, length, _ = x.size()
# Concat columns of pad to shift from relative to absolute indexing.
x = F.pad(
x,
# commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, 1]])
[0, 1, 0, 0, 0, 0, 0, 0],
)
x = F.pad(x, [0, 1, 0, 0, 0, 0, 0, 0], )
# Concat extra elements so to add up to shape (len+1, 2*len-1).
x_flat = x.view([batch, heads, length * 2 * length])
x_flat = F.pad(
x_flat,
# commons.convert_pad_shape([[0, 0], [0, 0], [0, int(length) - 1]])
[0, length - 1, 0, 0, 0, 0],
)
x_flat = F.pad(x_flat, [0, length - 1, 0, 0, 0, 0])
# Reshape and slice out the padded elements.
x_final = x_flat.view([batch, heads, length + 1, 2 * length - 1])[
@@ -355,18 +347,10 @@ class MultiHeadAttention(nn.Module):
"""
batch, heads, length, _ = x.size()
# padd along column
x = F.pad(
x,
# commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, int(length) - 1]])
[0, length - 1, 0, 0, 0, 0, 0, 0],
)
x = F.pad(x, [0, length - 1, 0, 0, 0, 0, 0, 0])
x_flat = x.view([batch, heads, (length**2) + (length * (length - 1))])
# add 0's in the beginning that will skew the elements after reshape
x_flat = F.pad(
x_flat,
# commons.convert_pad_shape([[0, 0], [0, 0], [int(length), 0]])
[length, 0, 0, 0, 0, 0],
)
x_flat = F.pad(x_flat, [length, 0, 0, 0, 0, 0])
x_final = x_flat.view([batch, heads, length, 2 * length])[:, :, :, 1:]
return x_final
@@ -435,11 +419,7 @@ class FFN(nn.Module):
pad_l: int = self.kernel_size - 1
pad_r: int = 0
# padding = [[0, 0], [0, 0], [pad_l, pad_r]]
x = F.pad(
x,
# commons.convert_pad_shape(padding)
[pad_l, pad_r, 0, 0, 0, 0],
)
x = F.pad(x, [pad_l, pad_r, 0, 0, 0, 0])
return x
def _same_padding(self, x):
@@ -448,9 +428,5 @@ class FFN(nn.Module):
pad_l: int = (self.kernel_size - 1) // 2
pad_r: int = self.kernel_size // 2
# padding = [[0, 0], [0, 0], [pad_l, pad_r]]
x = F.pad(
x,
# commons.convert_pad_shape(padding)
[pad_l, pad_r, 0, 0, 0, 0],
)
x = F.pad(x, [pad_l, pad_r, 0, 0, 0, 0])
return x

View File

@@ -95,7 +95,7 @@ class TextEncoder(nn.Module):
x = x[:, :, head:]
x_mask = x_mask[:, :, head:]
"""
stats = self.proj(x) * x_mask
stats: torch.Tensor = self.proj(x) * x_mask
m, logs = torch.split(stats, self.out_channels, dim=1)
return m, logs, x_mask
@@ -169,12 +169,12 @@ class ResidualCouplingBlock(nn.Module):
class PosteriorEncoder(nn.Module):
def __init__(
self,
in_channels,
out_channels,
hidden_channels,
kernel_size,
dilation_rate,
n_layers,
in_channels: int,
out_channels: int,
hidden_channels: int,
kernel_size: int,
dilation_rate: int,
n_layers: int,
gin_channels=0,
):
super(PosteriorEncoder, self).__init__()
@@ -648,7 +648,7 @@ class GeneratorNSF(torch.nn.Module):
class SynthesizerTrnMs256NSFsid(nn.Module):
def __init__(
self,
spec_channels,
spec_channels: int,
segment_size: int,
inter_channels: int,
hidden_channels: int,
@@ -783,7 +783,7 @@ class SynthesizerTrnMs256NSFsid(nn.Module):
m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths)
z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g)
z_p = self.flow(z, y_mask, g=g)
z_slice, ids_slice = utils.rand_slice_segments(z, y_lengths, self.segment_size)
z_slice, ids_slice = utils.rand_slice_segments_on_last_dim(z, y_lengths, self.segment_size)
# print(-1,pitchf.shape,ids_slice,self.segment_size,self.hop_length,self.segment_size//self.hop_length)
pitchf = utils.slice_on_last_dim(pitchf, ids_slice, self.segment_size)
# print(-2,pitchf.shape,z_slice.shape)
@@ -1007,7 +1007,7 @@ class SynthesizerTrnMs256NSFsid_nono(nn.Module):
m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths)
z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g)
z_p = self.flow(z, y_mask, g=g)
z_slice, ids_slice = utils.rand_slice_segments(z, y_lengths, self.segment_size)
z_slice, ids_slice = utils.rand_slice_segments_on_last_dim(z, y_lengths, self.segment_size)
o = self.dec(z_slice, g=g)
return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q)

View File

@@ -5,9 +5,6 @@ from .attentions import (
TextEncoder,
ResidualCouplingBlock,
PosteriorEncoder,
Generator,
SineGen,
SourceModuleHnNSF,
GeneratorNSF,
)
@@ -15,7 +12,7 @@ from .attentions import (
class SynthesizerTrnMsNSFsidM(nn.Module):
def __init__(
self,
spec_channels,
spec_channels: int,
segment_size,
inter_channels,
hidden_channels,

View File

@@ -136,7 +136,7 @@ class DDSConv(nn.Module):
class WN(torch.nn.Module):
def __init__(
self,
hidden_channels,
hidden_channels: int,
kernel_size,
dilation_rate,
n_layers,
@@ -189,7 +189,6 @@ class WN(torch.nn.Module):
self, x: torch.Tensor, x_mask: torch.Tensor, g: Optional[torch.Tensor] = None
):
output = torch.zeros_like(x)
n_channels_tensor = torch.IntTensor([self.hidden_channels])
if g is not None:
g = self.cond_layer(g)
@@ -197,14 +196,14 @@ class WN(torch.nn.Module):
for i, (in_layer, res_skip_layer) in enumerate(
zip(self.in_layers, self.res_skip_layers)
):
x_in = in_layer(x)
x_in: torch.Tensor = in_layer(x)
if g is not None:
cond_offset = i * 2 * self.hidden_channels
g_l = g[:, cond_offset : cond_offset + 2 * self.hidden_channels, :]
else:
g_l = torch.zeros_like(x_in)
acts = utils.fused_add_tanh_sigmoid_multiply(x_in, g_l, n_channels_tensor)
acts = utils.activate_add_tanh_sigmoid_multiply(x_in, g_l, self.hidden_channels)
acts = self.drop(acts)
res_skip_acts = res_skip_layer(acts)

View File

@@ -481,7 +481,7 @@ def train_and_evaluate(
optim_d.zero_grad()
scaler.scale(loss_disc).backward()
scaler.unscale_(optim_d)
grad_norm_d = utils.clip_grad_value_(net_d.parameters(), None)
grad_norm_d = utils.total_grad_norm(net_d.parameters())
scaler.step(optim_d)
with autocast(enabled=hps.train.fp16_run):
@@ -496,7 +496,7 @@ def train_and_evaluate(
optim_g.zero_grad()
scaler.scale(loss_gen_all).backward()
scaler.unscale_(optim_g)
grad_norm_g = utils.clip_grad_value_(net_g.parameters(), None)
grad_norm_g = utils.total_grad_norm(net_g.parameters())
scaler.step(optim_g)
scaler.update()

View File

@@ -1,4 +1,4 @@
from typing import List, Optional, Tuple
from typing import List, Optional, Tuple, Iterator
import torch
@@ -11,7 +11,7 @@ def call_weight_data_normal_if_Conv(m: torch.nn.Module):
m.weight.data.normal_(mean, std)
def get_padding(kernel_size: int, dilation=1):
def get_padding(kernel_size: int, dilation=1) -> int:
return int((kernel_size * dilation - dilation) / 2)
@@ -30,7 +30,7 @@ def slice_on_last_dim(
return ret
def rand_slice_segments(
def rand_slice_segments_on_last_dim(
x: torch.Tensor,
x_lengths: int = None,
segment_size=4,
@@ -45,19 +45,16 @@ def rand_slice_segments(
@torch.jit.script
def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels):
n_channels_int = n_channels[0]
def activate_add_tanh_sigmoid_multiply(
input_a: torch.Tensor, input_b: torch.Tensor, n_channels: int
) -> torch.Tensor:
in_act = input_a + input_b
t_act = torch.tanh(in_act[:, :n_channels_int, :])
s_act = torch.sigmoid(in_act[:, n_channels_int:, :])
t_act = torch.tanh(in_act[:, :n_channels, :])
s_act = torch.sigmoid(in_act[:, n_channels:, :])
acts = t_act * s_act
return acts
def convert_pad_shape(pad_shape: List[List[int]]) -> List[int]:
return torch.tensor(pad_shape).flip(0).reshape(-1).int().tolist()
def sequence_mask(
length: torch.Tensor,
max_length: Optional[int] = None,
@@ -68,19 +65,16 @@ def sequence_mask(
return x.unsqueeze(0) < length.unsqueeze(1)
def clip_grad_value_(parameters, clip_value, norm_type=2):
if isinstance(parameters, torch.Tensor):
parameters = [parameters]
parameters = list(filter(lambda p: p.grad is not None, parameters))
def total_grad_norm(
parameters: Iterator[torch.nn.Parameter], norm_type: float=2.0,
) -> float:
norm_type = float(norm_type)
if clip_value is not None:
clip_value = float(clip_value)
total_norm = 0.0
total_norm = 0
for p in parameters:
if p.grad is None: continue
param_norm = p.grad.data.norm(norm_type)
total_norm += param_norm.item() ** norm_type
if clip_value is not None:
p.grad.data.clamp_(min=-clip_value, max=clip_value)
total_norm += float(param_norm.item()) ** norm_type
total_norm = total_norm ** (1.0 / norm_type)
return total_norm