From e304b64052851429bb4d572228536181436781a6 Mon Sep 17 00:00:00 2001 From: wataru Date: Fri, 28 Oct 2022 21:55:38 +0900 Subject: [PATCH] update --- demo/mod/attentions.py | 303 -- demo/mod/commons.py | 161 - demo/mod/data_utils.py | 492 -- demo/mod/mel_processing.py | 114 - demo/mod/models.py | 407 -- demo/mod/modules.py | 390 -- demo/mod/monotonic_align/__init__.py | 19 - demo/mod/monotonic_align/core.pyx | 42 - .../monotonic_align/core.cp39-win_amd64.pyd | Bin 145920 -> 0 bytes .../core.cpython-37m-x86_64-linux-gnu.so | Bin 723704 -> 0 bytes .../core.cpython-39-x86_64-linux-gnu.so | Bin 983360 -> 0 bytes demo/mod/monotonic_align/setup.py | 23 - demo/mod/text/__init__.py | 54 - demo/mod/text/cleaners.py | 105 - demo/mod/text/symbols.py | 64 - demo/mod/transforms.py | 193 - demo/mod/utils.py | 270 - demo/setupFlask.sh | 14 - frontend/dist/index.html | 14 +- frontend/dist/index.js | 4820 +---------------- start2.sh | 2 +- trainer/Dockerfile | 2 +- 22 files changed, 5 insertions(+), 7484 deletions(-) delete mode 100755 demo/mod/attentions.py delete mode 100755 demo/mod/commons.py delete mode 100755 demo/mod/data_utils.py delete mode 100755 demo/mod/mel_processing.py delete mode 100755 demo/mod/models.py delete mode 100755 demo/mod/modules.py delete mode 100755 demo/mod/monotonic_align/__init__.py delete mode 100755 demo/mod/monotonic_align/core.pyx delete mode 100755 demo/mod/monotonic_align/monotonic_align/core.cp39-win_amd64.pyd delete mode 100755 demo/mod/monotonic_align/monotonic_align/core.cpython-37m-x86_64-linux-gnu.so delete mode 100755 demo/mod/monotonic_align/monotonic_align/core.cpython-39-x86_64-linux-gnu.so delete mode 100755 demo/mod/monotonic_align/setup.py delete mode 100755 demo/mod/text/__init__.py delete mode 100755 demo/mod/text/cleaners.py delete mode 100755 demo/mod/text/symbols.py delete mode 100755 demo/mod/transforms.py delete mode 100755 demo/mod/utils.py delete mode 100755 demo/setupFlask.sh diff --git a/demo/mod/attentions.py b/demo/mod/attentions.py deleted file mode 100755 index 4e0b0c1f..00000000 --- a/demo/mod/attentions.py +++ /dev/null @@ -1,303 +0,0 @@ -import copy -import math -import numpy as np -import torch -from torch import nn -from torch.nn import functional as F - -import commons -import modules -from modules import LayerNorm - - -class Encoder(nn.Module): - def __init__(self, hidden_channels, filter_channels, n_heads, n_layers, kernel_size=1, p_dropout=0., window_size=4, **kwargs): - super().__init__() - self.hidden_channels = hidden_channels - self.filter_channels = filter_channels - self.n_heads = n_heads - self.n_layers = n_layers - self.kernel_size = kernel_size - self.p_dropout = p_dropout - self.window_size = window_size - - self.drop = nn.Dropout(p_dropout) - self.attn_layers = nn.ModuleList() - self.norm_layers_1 = nn.ModuleList() - self.ffn_layers = nn.ModuleList() - self.norm_layers_2 = nn.ModuleList() - for i in range(self.n_layers): - self.attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout, window_size=window_size)) - self.norm_layers_1.append(LayerNorm(hidden_channels)) - self.ffn_layers.append(FFN(hidden_channels, hidden_channels, filter_channels, kernel_size, p_dropout=p_dropout)) - self.norm_layers_2.append(LayerNorm(hidden_channels)) - - def forward(self, x, x_mask): - attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1) - x = x * x_mask - for i in range(self.n_layers): - y = self.attn_layers[i](x, x, attn_mask) - y = self.drop(y) - x = self.norm_layers_1[i](x + y) - - y = self.ffn_layers[i](x, x_mask) - y = self.drop(y) - x = self.norm_layers_2[i](x + y) - x = x * x_mask - return x - - -class Decoder(nn.Module): - def __init__(self, hidden_channels, filter_channels, n_heads, n_layers, kernel_size=1, p_dropout=0., proximal_bias=False, proximal_init=True, **kwargs): - super().__init__() - self.hidden_channels = hidden_channels - self.filter_channels = filter_channels - self.n_heads = n_heads - self.n_layers = n_layers - self.kernel_size = kernel_size - self.p_dropout = p_dropout - self.proximal_bias = proximal_bias - self.proximal_init = proximal_init - - self.drop = nn.Dropout(p_dropout) - self.self_attn_layers = nn.ModuleList() - self.norm_layers_0 = nn.ModuleList() - self.encdec_attn_layers = nn.ModuleList() - self.norm_layers_1 = nn.ModuleList() - self.ffn_layers = nn.ModuleList() - self.norm_layers_2 = nn.ModuleList() - for i in range(self.n_layers): - self.self_attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout, proximal_bias=proximal_bias, proximal_init=proximal_init)) - self.norm_layers_0.append(LayerNorm(hidden_channels)) - self.encdec_attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout)) - self.norm_layers_1.append(LayerNorm(hidden_channels)) - self.ffn_layers.append(FFN(hidden_channels, hidden_channels, filter_channels, kernel_size, p_dropout=p_dropout, causal=True)) - self.norm_layers_2.append(LayerNorm(hidden_channels)) - - def forward(self, x, x_mask, h, h_mask): - """ - x: decoder input - h: encoder output - """ - self_attn_mask = commons.subsequent_mask(x_mask.size(2)).to(device=x.device, dtype=x.dtype) - encdec_attn_mask = h_mask.unsqueeze(2) * x_mask.unsqueeze(-1) - x = x * x_mask - for i in range(self.n_layers): - y = self.self_attn_layers[i](x, x, self_attn_mask) - y = self.drop(y) - x = self.norm_layers_0[i](x + y) - - y = self.encdec_attn_layers[i](x, h, encdec_attn_mask) - y = self.drop(y) - x = self.norm_layers_1[i](x + y) - - y = self.ffn_layers[i](x, x_mask) - y = self.drop(y) - x = self.norm_layers_2[i](x + y) - x = x * x_mask - return x - - -class MultiHeadAttention(nn.Module): - def __init__(self, channels, out_channels, n_heads, p_dropout=0., window_size=None, heads_share=True, block_length=None, proximal_bias=False, proximal_init=False): - super().__init__() - assert channels % n_heads == 0 - - self.channels = channels - self.out_channels = out_channels - self.n_heads = n_heads - self.p_dropout = p_dropout - self.window_size = window_size - self.heads_share = heads_share - self.block_length = block_length - self.proximal_bias = proximal_bias - self.proximal_init = proximal_init - self.attn = None - - self.k_channels = channels // n_heads - self.conv_q = nn.Conv1d(channels, channels, 1) - self.conv_k = nn.Conv1d(channels, channels, 1) - self.conv_v = nn.Conv1d(channels, channels, 1) - self.conv_o = nn.Conv1d(channels, out_channels, 1) - self.drop = nn.Dropout(p_dropout) - - if window_size is not None: - n_heads_rel = 1 if heads_share else n_heads - rel_stddev = self.k_channels**-0.5 - self.emb_rel_k = nn.Parameter(torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) * rel_stddev) - self.emb_rel_v = nn.Parameter(torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) * rel_stddev) - - nn.init.xavier_uniform_(self.conv_q.weight) - nn.init.xavier_uniform_(self.conv_k.weight) - nn.init.xavier_uniform_(self.conv_v.weight) - if proximal_init: - with torch.no_grad(): - self.conv_k.weight.copy_(self.conv_q.weight) - self.conv_k.bias.copy_(self.conv_q.bias) - - def forward(self, x, c, attn_mask=None): - q = self.conv_q(x) - k = self.conv_k(c) - v = self.conv_v(c) - - x, self.attn = self.attention(q, k, v, mask=attn_mask) - - x = self.conv_o(x) - return x - - def attention(self, query, key, value, mask=None): - # reshape [b, d, t] -> [b, n_h, t, d_k] - b, d, t_s, t_t = (*key.size(), query.size(2)) - query = query.view(b, self.n_heads, self.k_channels, t_t).transpose(2, 3) - key = key.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) - value = value.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) - - scores = torch.matmul(query / math.sqrt(self.k_channels), key.transpose(-2, -1)) - if self.window_size is not None: - assert t_s == t_t, "Relative attention is only available for self-attention." - key_relative_embeddings = self._get_relative_embeddings(self.emb_rel_k, t_s) - rel_logits = self._matmul_with_relative_keys(query /math.sqrt(self.k_channels), key_relative_embeddings) - scores_local = self._relative_position_to_absolute_position(rel_logits) - scores = scores + scores_local - if self.proximal_bias: - assert t_s == t_t, "Proximal bias is only available for self-attention." - scores = scores + self._attention_bias_proximal(t_s).to(device=scores.device, dtype=scores.dtype) - if mask is not None: - scores = scores.masked_fill(mask == 0, -1e4) - if self.block_length is not None: - assert t_s == t_t, "Local attention is only available for self-attention." - block_mask = torch.ones_like(scores).triu(-self.block_length).tril(self.block_length) - scores = scores.masked_fill(block_mask == 0, -1e4) - p_attn = F.softmax(scores, dim=-1) # [b, n_h, t_t, t_s] - p_attn = self.drop(p_attn) - output = torch.matmul(p_attn, value) - if self.window_size is not None: - relative_weights = self._absolute_position_to_relative_position(p_attn) - value_relative_embeddings = self._get_relative_embeddings(self.emb_rel_v, t_s) - output = output + self._matmul_with_relative_values(relative_weights, value_relative_embeddings) - output = output.transpose(2, 3).contiguous().view(b, d, t_t) # [b, n_h, t_t, d_k] -> [b, d, t_t] - return output, p_attn - - def _matmul_with_relative_values(self, x, y): - """ - x: [b, h, l, m] - y: [h or 1, m, d] - ret: [b, h, l, d] - """ - ret = torch.matmul(x, y.unsqueeze(0)) - return ret - - def _matmul_with_relative_keys(self, x, y): - """ - x: [b, h, l, d] - y: [h or 1, m, d] - ret: [b, h, l, m] - """ - ret = torch.matmul(x, y.unsqueeze(0).transpose(-2, -1)) - return ret - - def _get_relative_embeddings(self, relative_embeddings, length): - max_relative_position = 2 * self.window_size + 1 - # Pad first before slice to avoid using cond ops. - pad_length = max(length - (self.window_size + 1), 0) - slice_start_position = max((self.window_size + 1) - length, 0) - slice_end_position = slice_start_position + 2 * length - 1 - if pad_length > 0: - padded_relative_embeddings = F.pad( - relative_embeddings, - commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]])) - else: - padded_relative_embeddings = relative_embeddings - used_relative_embeddings = padded_relative_embeddings[:,slice_start_position:slice_end_position] - return used_relative_embeddings - - def _relative_position_to_absolute_position(self, x): - """ - x: [b, h, l, 2*l-1] - ret: [b, h, l, l] - """ - 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]])) - - # 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,length-1]])) - - # Reshape and slice out the padded elements. - x_final = x_flat.view([batch, heads, length+1, 2*length-1])[:, :, :length, length-1:] - return x_final - - def _absolute_position_to_relative_position(self, x): - """ - x: [b, h, l, l] - ret: [b, h, l, 2*l-1] - """ - batch, heads, length, _ = x.size() - # padd along column - x = F.pad(x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length-1]])) - 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], [length, 0]])) - x_final = x_flat.view([batch, heads, length, 2*length])[:,:,:,1:] - return x_final - - def _attention_bias_proximal(self, length): - """Bias for self-attention to encourage attention to close positions. - Args: - length: an integer scalar. - Returns: - a Tensor with shape [1, 1, length, length] - """ - r = torch.arange(length, dtype=torch.float32) - diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1) - return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0) - - -class FFN(nn.Module): - def __init__(self, in_channels, out_channels, filter_channels, kernel_size, p_dropout=0., activation=None, causal=False): - super().__init__() - self.in_channels = in_channels - self.out_channels = out_channels - self.filter_channels = filter_channels - self.kernel_size = kernel_size - self.p_dropout = p_dropout - self.activation = activation - self.causal = causal - - if causal: - self.padding = self._causal_padding - else: - self.padding = self._same_padding - - self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size) - self.conv_2 = nn.Conv1d(filter_channels, out_channels, kernel_size) - self.drop = nn.Dropout(p_dropout) - - def forward(self, x, x_mask): - x = self.conv_1(self.padding(x * x_mask)) - if self.activation == "gelu": - x = x * torch.sigmoid(1.702 * x) - else: - x = torch.relu(x) - x = self.drop(x) - x = self.conv_2(self.padding(x * x_mask)) - return x * x_mask - - def _causal_padding(self, x): - if self.kernel_size == 1: - return x - pad_l = self.kernel_size - 1 - pad_r = 0 - padding = [[0, 0], [0, 0], [pad_l, pad_r]] - x = F.pad(x, commons.convert_pad_shape(padding)) - return x - - def _same_padding(self, x): - if self.kernel_size == 1: - return x - pad_l = (self.kernel_size - 1) // 2 - pad_r = self.kernel_size // 2 - padding = [[0, 0], [0, 0], [pad_l, pad_r]] - x = F.pad(x, commons.convert_pad_shape(padding)) - return x diff --git a/demo/mod/commons.py b/demo/mod/commons.py deleted file mode 100755 index 9ad0444b..00000000 --- a/demo/mod/commons.py +++ /dev/null @@ -1,161 +0,0 @@ -import math -import numpy as np -import torch -from torch import nn -from torch.nn import functional as F - - -def init_weights(m, mean=0.0, std=0.01): - classname = m.__class__.__name__ - if classname.find("Conv") != -1: - m.weight.data.normal_(mean, std) - - -def get_padding(kernel_size, dilation=1): - return int((kernel_size*dilation - dilation)/2) - - -def convert_pad_shape(pad_shape): - l = pad_shape[::-1] - pad_shape = [item for sublist in l for item in sublist] - return pad_shape - - -def intersperse(lst, item): - result = [item] * (len(lst) * 2 + 1) - result[1::2] = lst - return result - - -def kl_divergence(m_p, logs_p, m_q, logs_q): - """KL(P||Q)""" - kl = (logs_q - logs_p) - 0.5 - kl += 0.5 * (torch.exp(2. * logs_p) + ((m_p - m_q)**2)) * torch.exp(-2. * logs_q) - return kl - - -def rand_gumbel(shape): - """Sample from the Gumbel distribution, protect from overflows.""" - uniform_samples = torch.rand(shape) * 0.99998 + 0.00001 - return -torch.log(-torch.log(uniform_samples)) - - -def rand_gumbel_like(x): - g = rand_gumbel(x.size()).to(dtype=x.dtype, device=x.device) - return g - - -def slice_segments(x, ids_str, segment_size=4): - ret = torch.zeros_like(x[:, :, :segment_size]) - for i in range(x.size(0)): - idx_str = ids_str[i] - idx_end = idx_str + segment_size - ret[i] = x[i, :, idx_str:idx_end] - return ret - - -def rand_slice_segments(x, x_lengths=None, segment_size=4): - b, d, t = x.size() - if x_lengths is None: - x_lengths = t - ids_str_max = x_lengths - segment_size + 1 - ids_str = (torch.rand([b]).to(device=x.device) * ids_str_max).to(dtype=torch.long) - ret = slice_segments(x, ids_str, segment_size) - return ret, ids_str - - -def get_timing_signal_1d( - length, channels, min_timescale=1.0, max_timescale=1.0e4): - position = torch.arange(length, dtype=torch.float) - num_timescales = channels // 2 - log_timescale_increment = ( - math.log(float(max_timescale) / float(min_timescale)) / - (num_timescales - 1)) - inv_timescales = min_timescale * torch.exp( - torch.arange(num_timescales, dtype=torch.float) * -log_timescale_increment) - scaled_time = position.unsqueeze(0) * inv_timescales.unsqueeze(1) - signal = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], 0) - signal = F.pad(signal, [0, 0, 0, channels % 2]) - signal = signal.view(1, channels, length) - return signal - - -def add_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4): - b, channels, length = x.size() - signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) - return x + signal.to(dtype=x.dtype, device=x.device) - - -def cat_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4, axis=1): - b, channels, length = x.size() - signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) - return torch.cat([x, signal.to(dtype=x.dtype, device=x.device)], axis) - - -def subsequent_mask(length): - mask = torch.tril(torch.ones(length, length)).unsqueeze(0).unsqueeze(0) - return mask - - -@torch.jit.script -def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels): - n_channels_int = n_channels[0] - in_act = input_a + input_b - t_act = torch.tanh(in_act[:, :n_channels_int, :]) - s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) - acts = t_act * s_act - return acts - - -def convert_pad_shape(pad_shape): - l = pad_shape[::-1] - pad_shape = [item for sublist in l for item in sublist] - return pad_shape - - -def shift_1d(x): - x = F.pad(x, convert_pad_shape([[0, 0], [0, 0], [1, 0]]))[:, :, :-1] - return x - - -def sequence_mask(length, max_length=None): - if max_length is None: - max_length = length.max() - x = torch.arange(max_length, dtype=length.dtype, device=length.device) - return x.unsqueeze(0) < length.unsqueeze(1) - - -def generate_path(duration, mask): - """ - duration: [b, 1, t_x] - mask: [b, 1, t_y, t_x] - """ - device = duration.device - - b, _, t_y, t_x = mask.shape - cum_duration = torch.cumsum(duration, -1) - - cum_duration_flat = cum_duration.view(b * t_x) - path = sequence_mask(cum_duration_flat, t_y).to(mask.dtype) - path = path.view(b, t_x, t_y) - path = path - F.pad(path, convert_pad_shape([[0, 0], [1, 0], [0, 0]]))[:, :-1] - path = path.unsqueeze(1).transpose(2,3) * mask - return path - - -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)) - norm_type = float(norm_type) - if clip_value is not None: - clip_value = float(clip_value) - - total_norm = 0 - for p in parameters: - 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 = total_norm ** (1. / norm_type) - return total_norm diff --git a/demo/mod/data_utils.py b/demo/mod/data_utils.py deleted file mode 100755 index 3e06620f..00000000 --- a/demo/mod/data_utils.py +++ /dev/null @@ -1,492 +0,0 @@ -import time -import os -import random -import numpy as np -import torch -import torch.utils.data -import tqdm - -import commons -from mel_processing import spectrogram_torch -from utils import load_wav_to_torch, load_filepaths_and_text -from text import text_to_sequence, cleaned_text_to_sequence -import struct -#add -from retry import retry -import random -import torchaudio -from scipy.io.wavfile import write - -class TextAudioLoader(torch.utils.data.Dataset): - """ - 1) loads audio, text pairs - 2) normalizes text and converts them to sequences of integers - 3) computes spectrograms from audio files. - """ - def __init__(self, audiopaths_and_text, hparams, use_test = True): - self.audiopaths_and_text = load_filepaths_and_text(audiopaths_and_text) - self.text_cleaners = hparams.text_cleaners - self.max_wav_value = hparams.max_wav_value - self.sampling_rate = hparams.sampling_rate - self.filter_length = hparams.filter_length - self.hop_length = hparams.hop_length - self.win_length = hparams.win_length - self.sampling_rate = hparams.sampling_rate - self.use_test = use_test - - self.cleaned_text = getattr(hparams, "cleaned_text", False) - - self.add_blank = hparams.add_blank - self.min_text_len = getattr(hparams, "min_text_len", 1) - self.max_text_len = getattr(hparams, "max_text_len", 190) - - random.seed(1234) - random.shuffle(self.audiopaths_and_text) - self._filter() - - - def _filter(self): - """ - Filter text & store spec lengths - """ - # Store spectrogram lengths for Bucketing - # wav_length ~= file_size / (wav_channels * Bytes per dim) = file_size / (1 * 2) - # spec_length = wav_length // hop_length - - audiopaths_and_text_new = [] - lengths = [] - for audiopath, text in self.audiopaths_and_text: - if self.min_text_len <= len(text) and len(text) <= self.max_text_len: - audiopaths_and_text_new.append([audiopath, text]) - lengths.append(os.path.getsize(audiopath) // (2 * self.hop_length)) - self.audiopaths_and_text = audiopaths_and_text_new - self.lengths = lengths - - def get_audio_text_pair(self, audiopath_and_text): - # separate filename and text - audiopath, text = audiopath_and_text[0], audiopath_and_text[1] - text = self.get_text(text) - if self.use_test != True: - text = torch.as_tensor("a") - spec, wav = self.get_audio(audiopath) - return (text, spec, wav) - - def get_audio(self, filename): - audio, sampling_rate = load_wav_to_torch(filename) - if sampling_rate != self.sampling_rate: - raise ValueError("{} {} SR doesn't match target {} SR".format( - sampling_rate, self.sampling_rate)) - audio_norm = audio / self.max_wav_value - audio_norm = audio_norm.unsqueeze(0) - spec_filename = filename.replace(".wav", ".spec.pt") - if os.path.exists(spec_filename): - spec = torch.load(spec_filename) - else: - spec = spectrogram_torch(audio_norm, self.filter_length, - self.sampling_rate, self.hop_length, self.win_length, - center=False) - spec = torch.squeeze(spec, 0) - torch.save(spec, spec_filename) - return spec, audio_norm - - def get_text(self, text): - if self.cleaned_text: - text_norm = cleaned_text_to_sequence(text) - else: - text_norm = text_to_sequence(text, self.text_cleaners) - if self.add_blank: - text_norm = commons.intersperse(text_norm, 0) - text_norm = torch.LongTensor(text_norm) - return text_norm - - def __getitem__(self, index): - return self.get_audio_text_pair(self.audiopaths_and_text[index]) - - def __len__(self): - return len(self.audiopaths_and_text) - - -class TextAudioCollate(): - """ Zero-pads model inputs and targets - """ - def __init__(self, return_ids=False): - self.return_ids = return_ids - - def __call__(self, batch): - """Collate's training batch from normalized text and aduio - PARAMS - ------ - batch: [text_normalized, spec_normalized, wav_normalized] - """ - # Right zero-pad all one-hot text sequences to max input length - _, ids_sorted_decreasing = torch.sort( - torch.LongTensor([x[1].size(1) for x in batch]), - dim=0, descending=True) - - max_text_len = max([len(x[0]) for x in batch]) - max_spec_len = max([x[1].size(1) for x in batch]) - max_wav_len = max([x[2].size(1) for x in batch]) - - text_lengths = torch.LongTensor(len(batch)) - spec_lengths = torch.LongTensor(len(batch)) - wav_lengths = torch.LongTensor(len(batch)) - - text_padded = torch.LongTensor(len(batch), max_text_len) - spec_padded = torch.FloatTensor(len(batch), batch[0][1].size(0), max_spec_len) - wav_padded = torch.FloatTensor(len(batch), 1, max_wav_len) - text_padded.zero_() - spec_padded.zero_() - wav_padded.zero_() - for i in range(len(ids_sorted_decreasing)): - row = batch[ids_sorted_decreasing[i]] - - text = row[0] - text_padded[i, :text.size(0)] = text - text_lengths[i] = text.size(0) - - spec = row[1] - spec_padded[i, :, :spec.size(1)] = spec - spec_lengths[i] = spec.size(1) - - wav = row[2] - wav_padded[i, :, :wav.size(1)] = wav - wav_lengths[i] = wav.size(1) - - if self.return_ids: - return text_padded, text_lengths, spec_padded, spec_lengths, wav_padded, wav_lengths, ids_sorted_decreasing - return text_padded, text_lengths, spec_padded, spec_lengths, wav_padded, wav_lengths - - -"""Multi speaker version""" -class TextAudioSpeakerLoader(torch.utils.data.Dataset): - """ - 1) loads audio, speaker_id, text pairs - 2) normalizes text and converts them to sequences of integers - 3) computes spectrograms from audio files. - """ - def __init__(self, audiopaths_sid_text, hparams, no_text=False, augmentation=False, augmentation_params=None, no_use_textfile = False): - if no_use_textfile: - self.audiopaths_sid_text = list() - else: - self.audiopaths_sid_text = load_filepaths_and_text(audiopaths_sid_text) - - self.text_cleaners = hparams.text_cleaners - self.max_wav_value = hparams.max_wav_value - self.sampling_rate = hparams.sampling_rate - self.filter_length = hparams.filter_length - self.hop_length = hparams.hop_length - self.win_length = hparams.win_length - self.sampling_rate = hparams.sampling_rate - self.no_text = no_text - self.augmentation = augmentation - if augmentation : - self.gain_p = augmentation_params.gain_p - self.min_gain_in_db = augmentation_params.min_gain_in_db - self.max_gain_in_db = augmentation_params.max_gain_in_db - self.time_stretch_p = augmentation_params.time_stretch_p - self.min_rate = augmentation_params.min_rate - self.max_rate = augmentation_params.max_rate - self.pitch_shift_p = augmentation_params.pitch_shift_p - self.min_semitones = augmentation_params.min_semitones - self.max_semitones = augmentation_params.max_semitones - self.add_gaussian_noise_p = augmentation_params.add_gaussian_noise_p - self.min_amplitude = augmentation_params.min_amplitude - self.max_amplitude = augmentation_params.max_amplitude - self.frequency_mask_p = augmentation_params.frequency_mask_p - - self.cleaned_text = getattr(hparams, "cleaned_text", False) - - self.add_blank = hparams.add_blank - self.min_text_len = getattr(hparams, "min_text_len", 1) - self.max_text_len = getattr(hparams, "max_text_len", 1000) - - random.seed(1234) - random.shuffle(self.audiopaths_sid_text) - self._filter() - - @retry(tries=30, delay=10) - def _filter(self): - """ - Filter text & store spec lengths - """ - audiopaths_sid_text_new = [] - lengths = [] - - # for audiopath, sid, text in tqdm.tqdm(self.audiopaths_sid_text): - for audiopath, sid, text in self.audiopaths_sid_text: - if self.min_text_len <= len(text) and len(text) <= self.max_text_len: - audiopaths_sid_text_new.append([audiopath, sid, text]) - lengths.append(os.path.getsize(audiopath) // (2 * self.hop_length)) - self.audiopaths_sid_text = audiopaths_sid_text_new - self.lengths = lengths - - def get_audio_text_speaker_pair(self, audiopath_sid_text): - # separate filename, speaker_id and text - wavdata, sid, text = audiopath_sid_text[0], audiopath_sid_text[1], audiopath_sid_text[2] - text = self.get_text(text) - if self.no_text: - text = self.get_text("a") - spec, wav = self.get_audio(wavdata) - sid = self.get_sid(sid) - return (text, spec, wav, sid) - - @retry(exceptions=(PermissionError), tries=100, delay=10) - def get_audio(self, wavdata): - # 音声データは±1.0内に正規化したtorchベクトルでunsqueeze(0)で外側1次元くるんだものを扱う - audio = torch.FloatTensor(wavdata.astype(np.float32)) - sampling_rate=24000 - try: - if sampling_rate != self.sampling_rate: - raise ValueError("[Error] Exception: source {} SR doesn't match target {} SR".format( - sampling_rate, self.sampling_rate)) - except ValueError as e: - print(e) - exit() - audio_norm = self.get_normalized_audio(audio, self.max_wav_value) - - if self.augmentation: - audio_augmented = self.add_augmentation(audio_norm, sampling_rate) - audio_noised = self.add_noise(audio_augmented, sampling_rate) - # ノーマライズ後のaugmentationとnoise付加で範囲外になったところを削る - audio_augmented = torch.clamp(audio_augmented, -1, 1) - audio_noised = torch.clamp(audio_noised, -1, 1) - # audio(音声波形)は教師信号となるのでノイズは含まずaugmentationのみしたものを使用 - audio_norm = audio_augmented - # spec(スペクトログラム)は入力信号となるのでaugmentationしてさらにノイズを付加したものを使用 - spec = spectrogram_torch(audio_noised, self.filter_length, - self.sampling_rate, self.hop_length, self.win_length, - center=False) - spec_noised = self.add_spectrogram_noise(spec) - spec = torch.squeeze(spec_noised, 0) - else: - spec = spectrogram_torch(audio_norm, self.filter_length, - self.sampling_rate, self.hop_length, self.win_length, - center=False) - spec = torch.squeeze(spec, 0) - return spec, audio_norm - - def add_augmentation(self, audio, sampling_rate): - gain_in_db = 0.0 - if random.random() <= self.gain_p: - gain_in_db = random.uniform(self.min_gain_in_db, self.max_gain_in_db) - time_stretch_rate = 1.0 - if random.random() <= self.time_stretch_p: - time_stretch_rate = random.uniform(self.min_rate, self.max_rate) - pitch_shift_semitones = 0 - if random.random() <= self.pitch_shift_p: - pitch_shift_semitones = random.uniform(self.min_semitones, self.max_semitones) * 100 # 1/100 semitone 単位指定のため - augmentation_effects = [ - ["gain", f"{gain_in_db}"], - ["tempo", f"{time_stretch_rate}"], - ["pitch", f"{pitch_shift_semitones}"], - ["rate", f"{sampling_rate}"] - ] - audio_augmented, _ = torchaudio.sox_effects.apply_effects_tensor(audio, sampling_rate, augmentation_effects) - return audio_augmented - - def add_noise(self, audio, sampling_rate): - # AddGaussianNoise - audio = self.add_gaussian_noise(audio) - return audio - - def add_gaussian_noise(self, audio): - assert self.min_amplitude >= 0.0 - assert self.max_amplitude >= 0.0 - assert self.max_amplitude >= self.min_amplitude - if random.random() > self.add_gaussian_noise_p: - return audio - amplitude = random.uniform(self.min_amplitude, self.max_amplitude) - noise = torch.randn(audio.size()) - noised_audio = audio + amplitude * noise - return noised_audio - - def add_spectrogram_noise(self, spec): - # FrequencyMask - masking = torchaudio.transforms.FrequencyMasking(freq_mask_param=80) - masked = masking(spec) - return masked - - def get_normalized_audio(self, audio, max_wav_value): - audio_norm = audio / max_wav_value - audio_norm = audio_norm.unsqueeze(0) - return audio_norm - - def get_text(self, text): - if self.cleaned_text: - text_norm = cleaned_text_to_sequence(text) - else: - text_norm = text_to_sequence(text, self.text_cleaners) - if self.add_blank: - text_norm = commons.intersperse(text_norm, 0) - text_norm = torch.LongTensor(text_norm) - return text_norm - - def get_sid(self, sid): - sid = torch.LongTensor([int(sid)]) - return sid - - def __getitem__(self, index): - return self.get_audio_text_speaker_pair(self.audiopaths_sid_text[index]) - - def __len__(self): - return len(self.audiopaths_sid_text) - - -class TextAudioSpeakerCollate(): - """ Zero-pads model inputs and targets - """ - def __init__(self, return_ids=False, no_text = False): - self.return_ids = return_ids - self.no_text = no_text - - def __call__(self, batch): - """Collate's training batch from normalized text, audio and speaker identities - PARAMS - ------ - batch: [text_normalized, spec_normalized, wav_normalized, sid] - """ - # Right zero-pad all one-hot text sequences to max input length - - _, ids_sorted_decreasing = torch.sort( - torch.LongTensor([x[1].size(1) for x in batch]), - dim=0, descending=True) - - max_text_len = max([len(x[0]) for x in batch]) - max_spec_len = max([x[1].size(1) for x in batch]) - max_wav_len = max([x[2].size(1) for x in batch]) - - text_lengths = torch.LongTensor(len(batch)) - spec_lengths = torch.LongTensor(len(batch)) - wav_lengths = torch.LongTensor(len(batch)) - sid = torch.LongTensor(len(batch)) - - text_padded = torch.LongTensor(len(batch), max_text_len) - spec_padded = torch.FloatTensor(len(batch), batch[0][1].size(0), max_spec_len) - wav_padded = torch.FloatTensor(len(batch), 1, max_wav_len) - text_padded.zero_() - spec_padded.zero_() - wav_padded.zero_() - for i in range(len(ids_sorted_decreasing)): - row = batch[ids_sorted_decreasing[i]] - - text = row[0] - text_padded[i, :text.size(0)] = text - text_lengths[i] = text.size(0) - - spec = row[1] - spec_padded[i, :, :spec.size(1)] = spec - spec_lengths[i] = spec.size(1) - - wav = row[2] - wav_padded[i, :, :wav.size(1)] = wav - wav_lengths[i] = wav.size(1) - - sid[i] = row[3] - - if self.return_ids: - return text_padded, text_lengths, spec_padded, spec_lengths, wav_padded, wav_lengths, sid, ids_sorted_decreasing - return text_padded, text_lengths, spec_padded, spec_lengths, wav_padded, wav_lengths, sid - - -class DistributedBucketSampler(torch.utils.data.distributed.DistributedSampler): - """ - Maintain similar input lengths in a batch. - Length groups are specified by boundaries. - Ex) boundaries = [b1, b2, b3] -> any batch is included either {x | b1 < length(x) <=b2} or {x | b2 < length(x) <= b3}. - - It removes samples which are not included in the boundaries. - Ex) boundaries = [b1, b2, b3] -> any x s.t. length(x) <= b1 or length(x) > b3 are discarded. - """ - def __init__(self, dataset, batch_size, boundaries, num_replicas=None, rank=None, shuffle=True): - super().__init__(dataset, num_replicas=num_replicas, rank=rank, shuffle=shuffle) - self.lengths = dataset.lengths - self.batch_size = batch_size - self.boundaries = boundaries - - self.buckets, self.num_samples_per_bucket = self._create_buckets() - self.total_size = sum(self.num_samples_per_bucket) - self.num_samples = self.total_size // self.num_replicas - - def _create_buckets(self): - buckets = [[] for _ in range(len(self.boundaries) - 1)] - for i in range(len(self.lengths)): - length = self.lengths[i] - idx_bucket = self._bisect(length) - if idx_bucket != -1: - buckets[idx_bucket].append(i) - - for i in range(len(buckets) - 1, 0, -1): - if len(buckets[i]) == 0: - buckets.pop(i) - self.boundaries.pop(i+1) - - num_samples_per_bucket = [] - for i in range(len(buckets)): - len_bucket = len(buckets[i]) - total_batch_size = self.num_replicas * self.batch_size - rem = (total_batch_size - (len_bucket % total_batch_size)) % total_batch_size - num_samples_per_bucket.append(len_bucket + rem) - return buckets, num_samples_per_bucket - - def __iter__(self): - # deterministically shuffle based on epoch - g = torch.Generator() - g.manual_seed(self.epoch) - - indices = [] - if self.shuffle: - for bucket in self.buckets: - indices.append(torch.randperm(len(bucket), generator=g).tolist()) - else: - for bucket in self.buckets: - indices.append(list(range(len(bucket)))) - - batches = [] - for i in range(len(self.buckets)): - next_bucket = (i+1) % len(self.buckets) - bucket = self.buckets[i] - len_bucket = len(bucket) - ids_bucket = indices[i] - num_samples_bucket = self.num_samples_per_bucket[i] - - if len_bucket == 0: - print("[Warn] Exception: length of buckets {} is 0. ID:{} Skip.".format(i,i)) - continue - - # add extra samples to make it evenly divisible - rem = num_samples_bucket - len_bucket - ids_bucket = ids_bucket + ids_bucket * (rem // len_bucket) + ids_bucket[:(rem % len_bucket)] - - # subsample - ids_bucket = ids_bucket[self.rank::self.num_replicas] - - # batching - for j in range(len(ids_bucket) // self.batch_size): - batch = [bucket[idx] for idx in ids_bucket[j*self.batch_size:(j+1)*self.batch_size]] - batches.append(batch) - - if self.shuffle: - batch_ids = torch.randperm(len(batches), generator=g).tolist() - batches = [batches[i] for i in batch_ids] - self.batches = batches - - assert len(self.batches) * self.batch_size == self.num_samples - return iter(self.batches) - - def _bisect(self, x, lo=0, hi=None): - if hi is None: - hi = len(self.boundaries) - 1 - - if hi > lo: - mid = (hi + lo) // 2 - if self.boundaries[mid] < x and x <= self.boundaries[mid+1]: - return mid - elif x <= self.boundaries[mid]: - return self._bisect(x, lo, mid) - else: - return self._bisect(x, mid + 1, hi) - else: - return -1 - - def __len__(self): - return self.num_samples // self.batch_size diff --git a/demo/mod/mel_processing.py b/demo/mod/mel_processing.py deleted file mode 100755 index cb33b76d..00000000 --- a/demo/mod/mel_processing.py +++ /dev/null @@ -1,114 +0,0 @@ -import math -import os -import random -import torch -from torch import nn -import torch.nn.functional as F -import torch.utils.data -import numpy as np -import librosa -import librosa.util as librosa_util -from librosa.util import normalize, pad_center, tiny -from scipy.signal import get_window -from scipy.io.wavfile import read -from librosa.filters import mel as librosa_mel_fn - -MAX_WAV_VALUE = 32768.0 - - -def dynamic_range_compression_torch(x, C=1, clip_val=1e-5): - """ - PARAMS - ------ - C: compression factor - """ - return torch.log(torch.clamp(x, min=clip_val) * C) - - -def dynamic_range_decompression_torch(x, C=1): - """ - PARAMS - ------ - C: compression factor used to compress - """ - return torch.exp(x) / C - - -def spectral_normalize_torch(magnitudes): - output = dynamic_range_compression_torch(magnitudes) - return output - - -def spectral_de_normalize_torch(magnitudes): - output = dynamic_range_decompression_torch(magnitudes) - return output - - -mel_basis = {} -hann_window = {} - - -def spectrogram_torch(y, n_fft, sampling_rate, hop_size, win_size, center=False): - if torch.min(y) < -1.: - print('min value is ', torch.min(y)) - if torch.max(y) > 1.: - print('max value is ', torch.max(y)) - - global hann_window - dtype_device = str(y.dtype) + '_' + str(y.device) - wnsize_dtype_device = str(win_size) + '_' + dtype_device - if wnsize_dtype_device not in hann_window: - hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to(dtype=y.dtype, device=y.device) - - y = torch.nn.functional.pad(y.unsqueeze(1), (int((n_fft-hop_size)/2), int((n_fft-hop_size)/2)), mode='reflect') - y = y.squeeze(1) - - spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window[wnsize_dtype_device], - center=center, pad_mode='reflect', normalized=False, onesided=True, return_complex=True) - spec = torch.view_as_real(spec) - - spec = torch.sqrt(spec.pow(2).sum(-1) + 1e-6) - return spec - - -def spec_to_mel_torch(spec, n_fft, num_mels, sampling_rate, fmin, fmax): - global mel_basis - dtype_device = str(spec.dtype) + '_' + str(spec.device) - fmax_dtype_device = str(fmax) + '_' + dtype_device - if fmax_dtype_device not in mel_basis: - mel = librosa_mel_fn(sampling_rate, n_fft, num_mels, fmin, fmax) - mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to(dtype=spec.dtype, device=spec.device) - spec = torch.matmul(mel_basis[fmax_dtype_device], spec) - spec = spectral_normalize_torch(spec) - return spec - - -def mel_spectrogram_torch(y, n_fft, num_mels, sampling_rate, hop_size, win_size, fmin, fmax, center=False): - if torch.min(y) < -1.: - print('min value is ', torch.min(y)) - if torch.max(y) > 1.: - print('max value is ', torch.max(y)) - - global mel_basis, hann_window - dtype_device = str(y.dtype) + '_' + str(y.device) - fmax_dtype_device = str(fmax) + '_' + dtype_device - wnsize_dtype_device = str(win_size) + '_' + dtype_device - if fmax_dtype_device not in mel_basis: - mel = librosa_mel_fn(sampling_rate, n_fft, num_mels, fmin, fmax) - mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to(dtype=y.dtype, device=y.device) - if wnsize_dtype_device not in hann_window: - hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to(dtype=y.dtype, device=y.device) - - y = torch.nn.functional.pad(y.unsqueeze(1), (int((n_fft-hop_size)/2), int((n_fft-hop_size)/2)), mode='reflect') - y = y.squeeze(1) - - spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window[wnsize_dtype_device], - center=center, pad_mode='reflect', normalized=False, onesided=True, return_complex=True) - spec = torch.view_as_real(spec) - - spec = torch.sqrt(spec.pow(2).sum(-1) + 1e-6) - - spec = torch.matmul(mel_basis[fmax_dtype_device], spec) - spec = spectral_normalize_torch(spec) - - return spec diff --git a/demo/mod/models.py b/demo/mod/models.py deleted file mode 100755 index 7b40b95f..00000000 --- a/demo/mod/models.py +++ /dev/null @@ -1,407 +0,0 @@ -import copy -import math -import torch -from torch import nn -from torch.nn import functional as F - -import commons -import modules -import attentions -import monotonic_align - -from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d -from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm -from commons import init_weights, get_padding - - -class TextEncoder(nn.Module): - def __init__(self, - n_vocab, - out_channels, - hidden_channels, - filter_channels, - n_heads, - n_layers, - kernel_size, - p_dropout): - super().__init__() - self.n_vocab = n_vocab - self.out_channels = out_channels - self.hidden_channels = hidden_channels - self.filter_channels = filter_channels - self.n_heads = n_heads - self.n_layers = n_layers - self.kernel_size = kernel_size - self.p_dropout = p_dropout - - self.emb = nn.Embedding(n_vocab, hidden_channels) - nn.init.normal_(self.emb.weight, 0.0, hidden_channels**-0.5) - - self.encoder = attentions.Encoder( - hidden_channels, - filter_channels, - n_heads, - n_layers, - kernel_size, - p_dropout) - self.proj= nn.Conv1d(hidden_channels, out_channels * 2, 1) - - def forward(self, x, x_lengths): - x = self.emb(x) * math.sqrt(self.hidden_channels) # [b, t, h] - x = torch.transpose(x, 1, -1) # [b, h, t] - x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to(x.dtype) - - x = self.encoder(x * x_mask, x_mask) - stats = self.proj(x) * x_mask - - m, logs = torch.split(stats, self.out_channels, dim=1) - return x, m, logs, x_mask - - -class ResidualCouplingBlock(nn.Module): - def __init__(self, - channels, - hidden_channels, - kernel_size, - dilation_rate, - n_layers, - n_flows=4, - gin_channels=0): - super().__init__() - self.channels = channels - self.hidden_channels = hidden_channels - self.kernel_size = kernel_size - self.dilation_rate = dilation_rate - self.n_layers = n_layers - self.n_flows = n_flows - self.gin_channels = gin_channels - - self.flows = nn.ModuleList() - for i in range(n_flows): - self.flows.append(modules.ResidualCouplingLayer(channels, hidden_channels, kernel_size, dilation_rate, n_layers, gin_channels=gin_channels, mean_only=True)) - self.flows.append(modules.Flip()) - - def forward(self, x, x_mask, g=None, reverse=False): - if not reverse: - for flow in self.flows: - x, _ = flow(x, x_mask, g=g, reverse=reverse) - else: - for flow in reversed(self.flows): - x = flow(x, x_mask, g=g, reverse=reverse) - return x - - -class PosteriorEncoder(nn.Module): - def __init__(self, - in_channels, - out_channels, - hidden_channels, - kernel_size, - dilation_rate, - n_layers, - gin_channels=0): - super().__init__() - self.in_channels = in_channels - self.out_channels = out_channels - self.hidden_channels = hidden_channels - self.kernel_size = kernel_size - self.dilation_rate = dilation_rate - self.n_layers = n_layers - self.gin_channels = gin_channels - - self.pre = nn.Conv1d(in_channels, hidden_channels, 1) - self.enc = modules.WN(hidden_channels, kernel_size, dilation_rate, n_layers, gin_channels=gin_channels) - self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) - - def forward(self, x, x_lengths, g=None): - x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to(x.dtype) - x = self.pre(x) * x_mask - x = self.enc(x, x_mask, g=g) - stats = self.proj(x) * x_mask - m, logs = torch.split(stats, self.out_channels, dim=1) - z = (m + torch.randn_like(m) * torch.exp(logs)) * x_mask - return z, m, logs, x_mask - - -class Generator(torch.nn.Module): - def __init__(self, initial_channel, resblock, resblock_kernel_sizes, resblock_dilation_sizes, upsample_rates, upsample_initial_channel, upsample_kernel_sizes, gin_channels=0): - super(Generator, self).__init__() - self.num_kernels = len(resblock_kernel_sizes) - self.num_upsamples = len(upsample_rates) - self.conv_pre = Conv1d(initial_channel, upsample_initial_channel, 7, 1, padding=3) - resblock = modules.ResBlock1 if resblock == '1' else modules.ResBlock2 - - self.ups = nn.ModuleList() - for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): - self.ups.append(weight_norm( - ConvTranspose1d(upsample_initial_channel//(2**i), upsample_initial_channel//(2**(i+1)), - k, u, padding=(k-u)//2))) - - self.resblocks = nn.ModuleList() - for i in range(len(self.ups)): - ch = upsample_initial_channel//(2**(i+1)) - for j, (k, d) in enumerate(zip(resblock_kernel_sizes, resblock_dilation_sizes)): - self.resblocks.append(resblock(ch, k, d)) - - self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) - self.ups.apply(init_weights) - - if gin_channels != 0: - #self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1) - gin_channels = 0 - - def forward(self, x, g=None): - x = self.conv_pre(x) - if g is not None: - #x = x + self.cond(g) - g=None - - for i in range(self.num_upsamples): - x = F.leaky_relu(x, modules.LRELU_SLOPE) - x = self.ups[i](x) - xs = None - for j in range(self.num_kernels): - if xs is None: - xs = self.resblocks[i*self.num_kernels+j](x) - else: - xs += self.resblocks[i*self.num_kernels+j](x) - x = xs / self.num_kernels - x = F.leaky_relu(x) - x = self.conv_post(x) - x = torch.tanh(x) - - return x - - def remove_weight_norm(self): - print('Removing weight norm...') - for l in self.ups: - remove_weight_norm(l) - for l in self.resblocks: - l.remove_weight_norm() - - -class DiscriminatorP(torch.nn.Module): - def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False): - super(DiscriminatorP, self).__init__() - self.period = period - self.use_spectral_norm = use_spectral_norm - norm_f = weight_norm if use_spectral_norm == False else spectral_norm - self.convs = nn.ModuleList([ - norm_f(Conv2d(1, 32, (kernel_size, 1), (stride, 1), padding=(get_padding(kernel_size, 1), 0))), - norm_f(Conv2d(32, 128, (kernel_size, 1), (stride, 1), padding=(get_padding(kernel_size, 1), 0))), - norm_f(Conv2d(128, 512, (kernel_size, 1), (stride, 1), padding=(get_padding(kernel_size, 1), 0))), - norm_f(Conv2d(512, 1024, (kernel_size, 1), (stride, 1), padding=(get_padding(kernel_size, 1), 0))), - norm_f(Conv2d(1024, 1024, (kernel_size, 1), 1, padding=(get_padding(kernel_size, 1), 0))), - ]) - self.conv_post = norm_f(Conv2d(1024, 1, (3, 1), 1, padding=(1, 0))) - - def forward(self, x): - fmap = [] - - # 1d to 2d - b, c, t = x.shape - if t % self.period != 0: # pad first - n_pad = self.period - (t % self.period) - x = F.pad(x, (0, n_pad), "reflect") - t = t + n_pad - x = x.view(b, c, t // self.period, self.period) - - for l in self.convs: - x = l(x) - x = F.leaky_relu(x, modules.LRELU_SLOPE) - fmap.append(x) - x = self.conv_post(x) - fmap.append(x) - x = torch.flatten(x, 1, -1) - - return x, fmap - - -class DiscriminatorS(torch.nn.Module): - def __init__(self, use_spectral_norm=False): - super(DiscriminatorS, self).__init__() - norm_f = weight_norm if use_spectral_norm == False else spectral_norm - self.convs = nn.ModuleList([ - norm_f(Conv1d(1, 16, 15, 1, padding=7)), - norm_f(Conv1d(16, 64, 41, 4, groups=4, padding=20)), - norm_f(Conv1d(64, 256, 41, 4, groups=16, padding=20)), - norm_f(Conv1d(256, 1024, 41, 4, groups=64, padding=20)), - norm_f(Conv1d(1024, 1024, 41, 4, groups=256, padding=20)), - norm_f(Conv1d(1024, 1024, 5, 1, padding=2)), - ]) - self.conv_post = norm_f(Conv1d(1024, 1, 3, 1, padding=1)) - - def forward(self, x): - fmap = [] - - for l in self.convs: - x = l(x) - x = F.leaky_relu(x, modules.LRELU_SLOPE) - fmap.append(x) - x = self.conv_post(x) - fmap.append(x) - x = torch.flatten(x, 1, -1) - - return x, fmap - - -class MultiPeriodDiscriminator(torch.nn.Module): - def __init__(self, use_spectral_norm=False): - super(MultiPeriodDiscriminator, self).__init__() - periods = [2,3,5,7,11] - - discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] - discs = discs + [DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods] - self.discriminators = nn.ModuleList(discs) - - def forward(self, y, y_hat): - y_d_rs = [] - y_d_gs = [] - fmap_rs = [] - fmap_gs = [] - for i, d in enumerate(self.discriminators): - y_d_r, fmap_r = d(y) - y_d_g, fmap_g = d(y_hat) - y_d_rs.append(y_d_r) - y_d_gs.append(y_d_g) - fmap_rs.append(fmap_r) - fmap_gs.append(fmap_g) - - return y_d_rs, y_d_gs, fmap_rs, fmap_gs - - - -class SynthesizerTrn(nn.Module): - """ - Synthesizer for Training - """ - - def __init__(self, - n_vocab, - spec_channels, - segment_size, - inter_channels, - hidden_channels, - filter_channels, - n_heads, - n_layers, - kernel_size, - p_dropout, - resblock, - resblock_kernel_sizes, - resblock_dilation_sizes, - upsample_rates, - upsample_initial_channel, - upsample_kernel_sizes, - n_flow, - n_speakers=0, - gin_channels=0, - use_sdp=True, - **kwargs): - - super().__init__() - self.n_vocab = n_vocab - self.spec_channels = spec_channels - self.hidden_channels = hidden_channels - self.filter_channels = filter_channels - self.n_heads = n_heads - self.n_layers = n_layers - self.kernel_size = kernel_size - self.p_dropout = p_dropout - self.resblock = resblock - self.resblock_kernel_sizes = resblock_kernel_sizes - self.resblock_dilation_sizes = resblock_dilation_sizes - self.upsample_rates = upsample_rates - self.upsample_initial_channel = upsample_initial_channel - self.upsample_kernel_sizes = upsample_kernel_sizes - self.segment_size = segment_size - self.n_speakers = n_speakers - self.gin_channels = gin_channels - - self.use_sdp = use_sdp - - self.enc_p = TextEncoder(n_vocab, - inter_channels, - hidden_channels, - filter_channels, - n_heads, - n_layers, - kernel_size, - p_dropout) - self.dec = Generator(inter_channels, resblock, resblock_kernel_sizes, resblock_dilation_sizes, upsample_rates, upsample_initial_channel, upsample_kernel_sizes, gin_channels=gin_channels) - self.enc_q = PosteriorEncoder(spec_channels, inter_channels, hidden_channels, 5, 1, 16, gin_channels=gin_channels) - self.flow = ResidualCouplingBlock(inter_channels, hidden_channels, 5, 1, 4, n_flows=n_flow, gin_channels=gin_channels) - - if n_speakers > 1: - self.emb_g = nn.Embedding(n_speakers, gin_channels) - - def forward(self, x, x_lengths, y, y_lengths, sid=None): - - x, m_p, logs_p, x_mask = self.enc_p(x, x_lengths) - if self.n_speakers > 0: - g = self.emb_g(sid).unsqueeze(-1) # [b, h, 1] - else: - g = None - - z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) - z_p = self.flow(z, y_mask, g=g) - - with torch.no_grad(): - # negative cross-entropy - s_p_sq_r = torch.exp(-2 * logs_p) # [b, d, t] - neg_cent1 = torch.sum(-0.5 * math.log(2 * math.pi) - logs_p, [1], keepdim=True) # [b, 1, t_s] - neg_cent2 = torch.matmul(-0.5 * (z_p ** 2).transpose(1, 2), s_p_sq_r) # [b, t_t, d] x [b, d, t_s] = [b, t_t, t_s] - neg_cent3 = torch.matmul(z_p.transpose(1, 2), (m_p * s_p_sq_r)) # [b, t_t, d] x [b, d, t_s] = [b, t_t, t_s] - neg_cent4 = torch.sum(-0.5 * (m_p ** 2) * s_p_sq_r, [1], keepdim=True) # [b, 1, t_s] - neg_cent = neg_cent1 + neg_cent2 + neg_cent3 + neg_cent4 - - attn_mask = torch.unsqueeze(x_mask, 2) * torch.unsqueeze(y_mask, -1) - attn = monotonic_align.maximum_path(neg_cent, attn_mask.squeeze(1)).unsqueeze(1).detach() - - # expand prior - m_p = torch.matmul(attn.squeeze(1), m_p.transpose(1, 2)).transpose(1, 2) - logs_p = torch.matmul(attn.squeeze(1), logs_p.transpose(1, 2)).transpose(1, 2) - - z_slice, ids_slice = commons.rand_slice_segments(z, y_lengths, self.segment_size) - o = self.dec(z_slice, g=g) - return o, attn, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) - - def voice_conversion(self, y, y_lengths, sid_src, sid_tgt): - assert self.n_speakers > 0, "n_speakers have to be larger than 0." - g_src = self.emb_g(sid_src).unsqueeze(-1) - g_tgt = self.emb_g(sid_tgt).unsqueeze(-1) - z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g_src) - z_p = self.flow(z, y_mask, g=g_src) - z_hat = self.flow(z_p, y_mask, g=g_tgt, reverse=True) - o_hat = self.dec(z_hat * y_mask, g=g_tgt) - return o_hat, y_mask, (z, z_p, z_hat) - - def voice_ra_pa_db(self, y, y_lengths, sid_src, sid_tgt): - assert self.n_speakers > 0, "n_speakers have to be larger than 0." - g_src = self.emb_g(sid_src).unsqueeze(-1) - g_tgt = self.emb_g(sid_tgt).unsqueeze(-1) - z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g_src) - o_hat = self.dec(z * y_mask, g=g_tgt) - return o_hat, y_mask, (z) - - def voice_ra_pa_da(self, y, y_lengths, sid_src, sid_tgt): - assert self.n_speakers > 0, "n_speakers have to be larger than 0." - g_src = self.emb_g(sid_src).unsqueeze(-1) - g_tgt = self.emb_g(sid_tgt).unsqueeze(-1) - z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g_src) - o_hat = self.dec(z * y_mask, g=g_src) - return o_hat, y_mask, (z) - - def voice_conversion_cycle(self, y, y_lengths, sid_src, sid_tgt): - assert self.n_speakers > 0, "n_speakers have to be larger than 0." - g_src = self.emb_g(sid_src).unsqueeze(-1) - g_tgt = self.emb_g(sid_tgt).unsqueeze(-1) - z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g_src) - z_p = self.flow(z, y_mask, g=g_src) - z_hat = self.flow(z_p, y_mask, g=g_tgt, reverse=True) - z_p_hat = self.flow(z_hat, y_mask, g=g_tgt) - z_hat_hat = self.flow(z_p_hat, y_mask, g=g_src, reverse=True) - o_hat = self.dec(z_hat_hat * y_mask, g=g_tgt) - return o_hat, y_mask, (z, z_p, z_hat) - - diff --git a/demo/mod/modules.py b/demo/mod/modules.py deleted file mode 100755 index 9c7fd9cd..00000000 --- a/demo/mod/modules.py +++ /dev/null @@ -1,390 +0,0 @@ -import copy -import math -import numpy as np -import scipy -import torch -from torch import nn -from torch.nn import functional as F - -from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d -from torch.nn.utils import weight_norm, remove_weight_norm - -import commons -from commons import init_weights, get_padding -from transforms import piecewise_rational_quadratic_transform - - -LRELU_SLOPE = 0.1 - - -class LayerNorm(nn.Module): - def __init__(self, channels, eps=1e-5): - super().__init__() - self.channels = channels - self.eps = eps - - self.gamma = nn.Parameter(torch.ones(channels)) - self.beta = nn.Parameter(torch.zeros(channels)) - - def forward(self, x): - x = x.transpose(1, -1) - x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps) - return x.transpose(1, -1) - - -class ConvReluNorm(nn.Module): - def __init__(self, in_channels, hidden_channels, out_channels, kernel_size, n_layers, p_dropout): - super().__init__() - self.in_channels = in_channels - self.hidden_channels = hidden_channels - self.out_channels = out_channels - self.kernel_size = kernel_size - self.n_layers = n_layers - self.p_dropout = p_dropout - assert n_layers > 1, "Number of layers should be larger than 0." - - self.conv_layers = nn.ModuleList() - self.norm_layers = nn.ModuleList() - self.conv_layers.append(nn.Conv1d(in_channels, hidden_channels, kernel_size, padding=kernel_size//2)) - self.norm_layers.append(LayerNorm(hidden_channels)) - self.relu_drop = nn.Sequential( - nn.ReLU(), - nn.Dropout(p_dropout)) - for _ in range(n_layers-1): - self.conv_layers.append(nn.Conv1d(hidden_channels, hidden_channels, kernel_size, padding=kernel_size//2)) - self.norm_layers.append(LayerNorm(hidden_channels)) - self.proj = nn.Conv1d(hidden_channels, out_channels, 1) - self.proj.weight.data.zero_() - self.proj.bias.data.zero_() - - def forward(self, x, x_mask): - x_org = x - for i in range(self.n_layers): - x = self.conv_layers[i](x * x_mask) - x = self.norm_layers[i](x) - x = self.relu_drop(x) - x = x_org + self.proj(x) - return x * x_mask - - -class DDSConv(nn.Module): - """ - Dialted and Depth-Separable Convolution - """ - def __init__(self, channels, kernel_size, n_layers, p_dropout=0.): - super().__init__() - self.channels = channels - self.kernel_size = kernel_size - self.n_layers = n_layers - self.p_dropout = p_dropout - - self.drop = nn.Dropout(p_dropout) - self.convs_sep = nn.ModuleList() - self.convs_1x1 = nn.ModuleList() - self.norms_1 = nn.ModuleList() - self.norms_2 = nn.ModuleList() - for i in range(n_layers): - dilation = kernel_size ** i - padding = (kernel_size * dilation - dilation) // 2 - self.convs_sep.append(nn.Conv1d(channels, channels, kernel_size, - groups=channels, dilation=dilation, padding=padding - )) - self.convs_1x1.append(nn.Conv1d(channels, channels, 1)) - self.norms_1.append(LayerNorm(channels)) - self.norms_2.append(LayerNorm(channels)) - - def forward(self, x, x_mask, g=None): - if g is not None: - x = x + g - for i in range(self.n_layers): - y = self.convs_sep[i](x * x_mask) - y = self.norms_1[i](y) - y = F.gelu(y) - y = self.convs_1x1[i](y) - y = self.norms_2[i](y) - y = F.gelu(y) - y = self.drop(y) - x = x + y - return x * x_mask - - -class WN(torch.nn.Module): - def __init__(self, hidden_channels, kernel_size, dilation_rate, n_layers, gin_channels=0, p_dropout=0): - super(WN, self).__init__() - assert(kernel_size % 2 == 1) - self.hidden_channels =hidden_channels - self.kernel_size = kernel_size, - self.dilation_rate = dilation_rate - self.n_layers = n_layers - self.gin_channels = gin_channels - self.p_dropout = p_dropout - - self.in_layers = torch.nn.ModuleList() - self.res_skip_layers = torch.nn.ModuleList() - self.drop = nn.Dropout(p_dropout) - - if gin_channels != 0: - cond_layer = torch.nn.Conv1d(gin_channels, 2*hidden_channels*n_layers, 1) - self.cond_layer = torch.nn.utils.weight_norm(cond_layer, name='weight') - - for i in range(n_layers): - dilation = dilation_rate ** i - padding = int((kernel_size * dilation - dilation) / 2) - in_layer = torch.nn.Conv1d(hidden_channels, 2*hidden_channels, kernel_size, - dilation=dilation, padding=padding) - in_layer = torch.nn.utils.weight_norm(in_layer, name='weight') - self.in_layers.append(in_layer) - - # last one is not necessary - if i < n_layers - 1: - res_skip_channels = 2 * hidden_channels - else: - res_skip_channels = hidden_channels - - res_skip_layer = torch.nn.Conv1d(hidden_channels, res_skip_channels, 1) - res_skip_layer = torch.nn.utils.weight_norm(res_skip_layer, name='weight') - self.res_skip_layers.append(res_skip_layer) - - def forward(self, x, x_mask, g=None, **kwargs): - output = torch.zeros_like(x) - n_channels_tensor = torch.IntTensor([self.hidden_channels]) - - if g is not None: - g = self.cond_layer(g) - - for i in range(self.n_layers): - x_in = self.in_layers[i](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 = commons.fused_add_tanh_sigmoid_multiply( - x_in, - g_l, - n_channels_tensor) - acts = self.drop(acts) - - res_skip_acts = self.res_skip_layers[i](acts) - if i < self.n_layers - 1: - res_acts = res_skip_acts[:,:self.hidden_channels,:] - x = (x + res_acts) * x_mask - output = output + res_skip_acts[:,self.hidden_channels:,:] - else: - output = output + res_skip_acts - return output * x_mask - - def remove_weight_norm(self): - if self.gin_channels != 0: - torch.nn.utils.remove_weight_norm(self.cond_layer) - for l in self.in_layers: - torch.nn.utils.remove_weight_norm(l) - for l in self.res_skip_layers: - torch.nn.utils.remove_weight_norm(l) - - -class ResBlock1(torch.nn.Module): - def __init__(self, channels, kernel_size=3, dilation=(1, 3, 5)): - super(ResBlock1, self).__init__() - self.convs1 = nn.ModuleList([ - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[0], - padding=get_padding(kernel_size, dilation[0]))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[1], - padding=get_padding(kernel_size, dilation[1]))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[2], - padding=get_padding(kernel_size, dilation[2]))) - ]) - self.convs1.apply(init_weights) - - self.convs2 = nn.ModuleList([ - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=1, - padding=get_padding(kernel_size, 1))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=1, - padding=get_padding(kernel_size, 1))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=1, - padding=get_padding(kernel_size, 1))) - ]) - self.convs2.apply(init_weights) - - def forward(self, x, x_mask=None): - for c1, c2 in zip(self.convs1, self.convs2): - xt = F.leaky_relu(x, LRELU_SLOPE) - if x_mask is not None: - xt = xt * x_mask - xt = c1(xt) - xt = F.leaky_relu(xt, LRELU_SLOPE) - if x_mask is not None: - xt = xt * x_mask - xt = c2(xt) - x = xt + x - if x_mask is not None: - x = x * x_mask - return x - - def remove_weight_norm(self): - for l in self.convs1: - remove_weight_norm(l) - for l in self.convs2: - remove_weight_norm(l) - - -class ResBlock2(torch.nn.Module): - def __init__(self, channels, kernel_size=3, dilation=(1, 3)): - super(ResBlock2, self).__init__() - self.convs = nn.ModuleList([ - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[0], - padding=get_padding(kernel_size, dilation[0]))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[1], - padding=get_padding(kernel_size, dilation[1]))) - ]) - self.convs.apply(init_weights) - - def forward(self, x, x_mask=None): - for c in self.convs: - xt = F.leaky_relu(x, LRELU_SLOPE) - if x_mask is not None: - xt = xt * x_mask - xt = c(xt) - x = xt + x - if x_mask is not None: - x = x * x_mask - return x - - def remove_weight_norm(self): - for l in self.convs: - remove_weight_norm(l) - - -class Log(nn.Module): - def forward(self, x, x_mask, reverse=False, **kwargs): - if not reverse: - y = torch.log(torch.clamp_min(x, 1e-5)) * x_mask - logdet = torch.sum(-y, [1, 2]) - return y, logdet - else: - x = torch.exp(x) * x_mask - return x - - -class Flip(nn.Module): - def forward(self, x, *args, reverse=False, **kwargs): - x = torch.flip(x, [1]) - if not reverse: - logdet = torch.zeros(x.size(0)).to(dtype=x.dtype, device=x.device) - return x, logdet - else: - return x - - -class ElementwiseAffine(nn.Module): - def __init__(self, channels): - super().__init__() - self.channels = channels - self.m = nn.Parameter(torch.zeros(channels,1)) - self.logs = nn.Parameter(torch.zeros(channels,1)) - - def forward(self, x, x_mask, reverse=False, **kwargs): - if not reverse: - y = self.m + torch.exp(self.logs) * x - y = y * x_mask - logdet = torch.sum(self.logs * x_mask, [1,2]) - return y, logdet - else: - x = (x - self.m) * torch.exp(-self.logs) * x_mask - return x - - -class ResidualCouplingLayer(nn.Module): - def __init__(self, - channels, - hidden_channels, - kernel_size, - dilation_rate, - n_layers, - p_dropout=0, - gin_channels=0, - mean_only=False): - assert channels % 2 == 0, "channels should be divisible by 2" - super().__init__() - self.channels = channels - self.hidden_channels = hidden_channels - self.kernel_size = kernel_size - self.dilation_rate = dilation_rate - self.n_layers = n_layers - self.half_channels = channels // 2 - self.mean_only = mean_only - - self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1) - self.enc = WN(hidden_channels, kernel_size, dilation_rate, n_layers, p_dropout=p_dropout, gin_channels=gin_channels) - self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1) - self.post.weight.data.zero_() - self.post.bias.data.zero_() - - def forward(self, x, x_mask, g=None, reverse=False): - x0, x1 = torch.split(x, [self.half_channels]*2, 1) - h = self.pre(x0) * x_mask - h = self.enc(h, x_mask, g=g) - stats = self.post(h) * x_mask - if not self.mean_only: - m, logs = torch.split(stats, [self.half_channels]*2, 1) - else: - m = stats - logs = torch.zeros_like(m) - - if not reverse: - x1 = m + x1 * torch.exp(logs) * x_mask - x = torch.cat([x0, x1], 1) - logdet = torch.sum(logs, [1,2]) - return x, logdet - else: - x1 = (x1 - m) * torch.exp(-logs) * x_mask - x = torch.cat([x0, x1], 1) - return x - - -class ConvFlow(nn.Module): - def __init__(self, in_channels, filter_channels, kernel_size, n_layers, num_bins=10, tail_bound=5.0): - super().__init__() - self.in_channels = in_channels - self.filter_channels = filter_channels - self.kernel_size = kernel_size - self.n_layers = n_layers - self.num_bins = num_bins - self.tail_bound = tail_bound - self.half_channels = in_channels // 2 - - self.pre = nn.Conv1d(self.half_channels, filter_channels, 1) - self.convs = DDSConv(filter_channels, kernel_size, n_layers, p_dropout=0.) - self.proj = nn.Conv1d(filter_channels, self.half_channels * (num_bins * 3 - 1), 1) - self.proj.weight.data.zero_() - self.proj.bias.data.zero_() - - def forward(self, x, x_mask, g=None, reverse=False): - x0, x1 = torch.split(x, [self.half_channels]*2, 1) - h = self.pre(x0) - h = self.convs(h, x_mask, g=g) - h = self.proj(h) * x_mask - - b, c, t = x0.shape - h = h.reshape(b, c, -1, t).permute(0, 1, 3, 2) # [b, cx?, t] -> [b, c, t, ?] - - unnormalized_widths = h[..., :self.num_bins] / math.sqrt(self.filter_channels) - unnormalized_heights = h[..., self.num_bins:2*self.num_bins] / math.sqrt(self.filter_channels) - unnormalized_derivatives = h[..., 2 * self.num_bins:] - - x1, logabsdet = piecewise_rational_quadratic_transform(x1, - unnormalized_widths, - unnormalized_heights, - unnormalized_derivatives, - inverse=reverse, - tails='linear', - tail_bound=self.tail_bound - ) - - x = torch.cat([x0, x1], 1) * x_mask - logdet = torch.sum(logabsdet * x_mask, [1,2]) - if not reverse: - return x, logdet - else: - return x diff --git a/demo/mod/monotonic_align/__init__.py b/demo/mod/monotonic_align/__init__.py deleted file mode 100755 index 3d7009c4..00000000 --- a/demo/mod/monotonic_align/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -import numpy as np -import torch -from .monotonic_align.core import maximum_path_c - - -def maximum_path(neg_cent, mask): - """ Cython optimized version. - neg_cent: [b, t_t, t_s] - mask: [b, t_t, t_s] - """ - device = neg_cent.device - dtype = neg_cent.dtype - neg_cent = neg_cent.data.cpu().numpy().astype(np.float32) - path = np.zeros(neg_cent.shape, dtype=np.int32) - - t_t_max = mask.sum(1)[:, 0].data.cpu().numpy().astype(np.int32) - t_s_max = mask.sum(2)[:, 0].data.cpu().numpy().astype(np.int32) - maximum_path_c(path, neg_cent, t_t_max, t_s_max) - return torch.from_numpy(path).to(device=device, dtype=dtype) diff --git a/demo/mod/monotonic_align/core.pyx b/demo/mod/monotonic_align/core.pyx deleted file mode 100755 index bfaabd4d..00000000 --- a/demo/mod/monotonic_align/core.pyx +++ /dev/null @@ -1,42 +0,0 @@ -cimport cython -from cython.parallel import prange - - -@cython.boundscheck(False) -@cython.wraparound(False) -cdef void maximum_path_each(int[:,::1] path, float[:,::1] value, int t_y, int t_x, float max_neg_val=-1e9) nogil: - cdef int x - cdef int y - cdef float v_prev - cdef float v_cur - cdef float tmp - cdef int index = t_x - 1 - - for y in range(t_y): - for x in range(max(0, t_x + y - t_y), min(t_x, y + 1)): - if x == y: - v_cur = max_neg_val - else: - v_cur = value[y-1, x] - if x == 0: - if y == 0: - v_prev = 0. - else: - v_prev = max_neg_val - else: - v_prev = value[y-1, x-1] - value[y, x] += max(v_prev, v_cur) - - for y in range(t_y - 1, -1, -1): - path[y, index] = 1 - if index != 0 and (index == y or value[y-1, index] < value[y-1, index-1]): - index = index - 1 - - -@cython.boundscheck(False) -@cython.wraparound(False) -cpdef void maximum_path_c(int[:,:,::1] paths, float[:,:,::1] values, int[::1] t_ys, int[::1] t_xs) nogil: - cdef int b = paths.shape[0] - cdef int i - for i in prange(b, nogil=True): - maximum_path_each(paths[i], values[i], t_ys[i], t_xs[i]) diff --git a/demo/mod/monotonic_align/monotonic_align/core.cp39-win_amd64.pyd b/demo/mod/monotonic_align/monotonic_align/core.cp39-win_amd64.pyd deleted file mode 100755 index 9e9bacb7ad1a4759a7cfce3f162f7d927efebe80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145920 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 diff --git a/demo/mod/monotonic_align/monotonic_align/core.cpython-37m-x86_64-linux-gnu.so b/demo/mod/monotonic_align/monotonic_align/core.cpython-37m-x86_64-linux-gnu.so deleted file mode 100755 index 0ea56ee9211c55a3b2133af24a0710570572f5db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723704 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%0A({P#Y^8@KpjeWV`lF8LOsh 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