diff --git a/lib/infer_pack/attentions.py b/lib/infer_pack/attentions.py new file mode 100644 index 0000000000000000000000000000000000000000..05501be1871643f78dddbeaa529c96667031a8db --- /dev/null +++ b/lib/infer_pack/attentions.py @@ -0,0 +1,417 @@ +import copy +import math +import numpy as np +import torch +from torch import nn +from torch.nn import functional as F + +from lib.infer_pack import commons +from lib.infer_pack import modules +from lib.infer_pack.modules import LayerNorm + + +class Encoder(nn.Module): + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size=1, + p_dropout=0.0, + window_size=10, + **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.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.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.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/lib/infer_pack/commons.py b/lib/infer_pack/commons.py new file mode 100644 index 0000000000000000000000000000000000000000..54470986f37825b35d90d7efa7437d1c26b87215 --- /dev/null +++ b/lib/infer_pack/commons.py @@ -0,0 +1,166 @@ +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 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.0 * logs_p) + ((m_p - m_q) ** 2)) * torch.exp(-2.0 * 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 slice_segments2(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.0 / norm_type) + return total_norm diff --git a/lib/infer_pack/models.py b/lib/infer_pack/models.py new file mode 100644 index 0000000000000000000000000000000000000000..3665d03bc0514a6ed07d3372ea24717dae1e0a65 --- /dev/null +++ b/lib/infer_pack/models.py @@ -0,0 +1,1142 @@ +import math, pdb, os +from time import time as ttime +import torch +from torch import nn +from torch.nn import functional as F +from lib.infer_pack import modules +from lib.infer_pack import attentions +from lib.infer_pack import commons +from lib.infer_pack.commons import init_weights, get_padding +from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d +from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm +from lib.infer_pack.commons import init_weights +import numpy as np +from lib.infer_pack import commons + + +class TextEncoder256(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + 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_phone = nn.Linear(256, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + 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, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(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 m, logs, x_mask + + +class TextEncoder768(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + 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_phone = nn.Linear(768, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + 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, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(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 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 + + def remove_weight_norm(self): + for i in range(self.n_flows): + self.flows[i * 2].remove_weight_norm() + + +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 + + def remove_weight_norm(self): + self.enc.remove_weight_norm() + + +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) + + def forward(self, x, g=None): + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + 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): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +class SineGen(torch.nn.Module): + """Definition of sine generator + SineGen(samp_rate, harmonic_num = 0, + sine_amp = 0.1, noise_std = 0.003, + voiced_threshold = 0, + flag_for_pulse=False) + samp_rate: sampling rate in Hz + harmonic_num: number of harmonic overtones (default 0) + sine_amp: amplitude of sine-wavefrom (default 0.1) + noise_std: std of Gaussian noise (default 0.003) + voiced_thoreshold: F0 threshold for U/V classification (default 0) + flag_for_pulse: this SinGen is used inside PulseGen (default False) + Note: when flag_for_pulse is True, the first time step of a voiced + segment is always sin(np.pi) or cos(0) + """ + + def __init__( + self, + samp_rate, + harmonic_num=0, + sine_amp=0.1, + noise_std=0.003, + voiced_threshold=0, + flag_for_pulse=False, + ): + super(SineGen, self).__init__() + self.sine_amp = sine_amp + self.noise_std = noise_std + self.harmonic_num = harmonic_num + self.dim = self.harmonic_num + 1 + self.sampling_rate = samp_rate + self.voiced_threshold = voiced_threshold + + def _f02uv(self, f0): + # generate uv signal + uv = torch.ones_like(f0) + uv = uv * (f0 > self.voiced_threshold) + return uv + + def forward(self, f0, upp): + """sine_tensor, uv = forward(f0) + input F0: tensor(batchsize=1, length, dim=1) + f0 for unvoiced steps should be 0 + output sine_tensor: tensor(batchsize=1, length, dim) + output uv: tensor(batchsize=1, length, 1) + """ + with torch.no_grad(): + f0 = f0[:, None].transpose(1, 2) + f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device) + # fundamental component + f0_buf[:, :, 0] = f0[:, :, 0] + for idx in np.arange(self.harmonic_num): + f0_buf[:, :, idx + 1] = f0_buf[:, :, 0] * ( + idx + 2 + ) # idx + 2: the (idx+1)-th overtone, (idx+2)-th harmonic + rad_values = (f0_buf / self.sampling_rate) % 1 ###%1意味着n_har的乘积无法后处理优化 + rand_ini = torch.rand( + f0_buf.shape[0], f0_buf.shape[2], device=f0_buf.device + ) + rand_ini[:, 0] = 0 + rad_values[:, 0, :] = rad_values[:, 0, :] + rand_ini + tmp_over_one = torch.cumsum(rad_values, 1) # % 1 #####%1意味着后面的cumsum无法再优化 + tmp_over_one *= upp + tmp_over_one = F.interpolate( + tmp_over_one.transpose(2, 1), + scale_factor=upp, + mode="linear", + align_corners=True, + ).transpose(2, 1) + rad_values = F.interpolate( + rad_values.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose( + 2, 1 + ) ####### + tmp_over_one %= 1 + tmp_over_one_idx = (tmp_over_one[:, 1:, :] - tmp_over_one[:, :-1, :]) < 0 + cumsum_shift = torch.zeros_like(rad_values) + cumsum_shift[:, 1:, :] = tmp_over_one_idx * -1.0 + sine_waves = torch.sin( + torch.cumsum(rad_values + cumsum_shift, dim=1) * 2 * np.pi + ) + sine_waves = sine_waves * self.sine_amp + uv = self._f02uv(f0) + uv = F.interpolate( + uv.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose(2, 1) + noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3 + noise = noise_amp * torch.randn_like(sine_waves) + sine_waves = sine_waves * uv + noise + return sine_waves, uv, noise + + +class SourceModuleHnNSF(torch.nn.Module): + """SourceModule for hn-nsf + SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1, + add_noise_std=0.003, voiced_threshod=0) + sampling_rate: sampling_rate in Hz + harmonic_num: number of harmonic above F0 (default: 0) + sine_amp: amplitude of sine source signal (default: 0.1) + add_noise_std: std of additive Gaussian noise (default: 0.003) + note that amplitude of noise in unvoiced is decided + by sine_amp + voiced_threshold: threhold to set U/V given F0 (default: 0) + Sine_source, noise_source = SourceModuleHnNSF(F0_sampled) + F0_sampled (batchsize, length, 1) + Sine_source (batchsize, length, 1) + noise_source (batchsize, length 1) + uv (batchsize, length, 1) + """ + + def __init__( + self, + sampling_rate, + harmonic_num=0, + sine_amp=0.1, + add_noise_std=0.003, + voiced_threshod=0, + is_half=True, + ): + super(SourceModuleHnNSF, self).__init__() + + self.sine_amp = sine_amp + self.noise_std = add_noise_std + self.is_half = is_half + # to produce sine waveforms + self.l_sin_gen = SineGen( + sampling_rate, harmonic_num, sine_amp, add_noise_std, voiced_threshod + ) + + # to merge source harmonics into a single excitation + self.l_linear = torch.nn.Linear(harmonic_num + 1, 1) + self.l_tanh = torch.nn.Tanh() + + def forward(self, x, upp=None): + sine_wavs, uv, _ = self.l_sin_gen(x, upp) + if self.is_half: + sine_wavs = sine_wavs.half() + sine_merge = self.l_tanh(self.l_linear(sine_wavs)) + return sine_merge, None, None # noise, uv + + +class GeneratorNSF(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, + sr, + is_half=False, + ): + super(GeneratorNSF, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + + self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(upsample_rates)) + self.m_source = SourceModuleHnNSF( + sampling_rate=sr, harmonic_num=0, is_half=is_half + ) + self.noise_convs = nn.ModuleList() + 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)): + c_cur = upsample_initial_channel // (2 ** (i + 1)) + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + if i + 1 < len(upsample_rates): + stride_f0 = np.prod(upsample_rates[i + 1 :]) + self.noise_convs.append( + Conv1d( + 1, + c_cur, + kernel_size=stride_f0 * 2, + stride=stride_f0, + padding=stride_f0 // 2, + ) + ) + else: + self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1)) + + 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) + + self.upp = np.prod(upsample_rates) + + def forward(self, x, f0, g=None): + har_source, noi_source, uv = self.m_source(f0, self.upp) + har_source = har_source.transpose(1, 2) + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + x_source = self.noise_convs[i](har_source) + x = x + x_source + 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): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +sr2sr = { + "32k": 32000, + "40k": 40000, + "48k": 48000, +} + + +class SynthesizerTrnMs256NSFsid(nn.Module): + def __init__( + self, + 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, + spk_embed_dim, + gin_channels, + sr, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_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.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + 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, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward( + self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds + ): # 这里ds是id,[bs,1] + # print(1,pitch.shape)#[bs,t] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + 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 = commons.rand_slice_segments( + 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 = commons.slice_segments2(pitchf, ids_slice, self.segment_size) + # print(-2,pitchf.shape,z_slice.shape) + o = self.dec(z_slice, pitchf, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, pitch, nsff0, sid, rate=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + if rate: + head = int(z_p.shape[2] * rate) + z_p = z_p[:, :, -head:] + x_mask = x_mask[:, :, -head:] + nsff0 = nsff0[:, -head:] + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec(z * x_mask, nsff0, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs768NSFsid(nn.Module): + def __init__( + self, + 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, + spk_embed_dim, + gin_channels, + sr, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_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.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + 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, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward( + self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds + ): # 这里ds是id,[bs,1] + # print(1,pitch.shape)#[bs,t] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + 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 = commons.rand_slice_segments( + 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 = commons.slice_segments2(pitchf, ids_slice, self.segment_size) + # print(-2,pitchf.shape,z_slice.shape) + o = self.dec(z_slice, pitchf, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, pitch, nsff0, sid, rate=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + if rate: + head = int(z_p.shape[2] * rate) + z_p = z_p[:, :, -head:] + x_mask = x_mask[:, :, -head:] + nsff0 = nsff0[:, -head:] + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec(z * x_mask, nsff0, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs256NSFsid_nono(nn.Module): + def __init__( + self, + 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, + spk_embed_dim, + gin_channels, + sr=None, + **kwargs + ): + super().__init__() + self.spec_channels = spec_channels + self.inter_channels = inter_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.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=False, + ) + 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, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward(self, phone, phone_lengths, y, y_lengths, ds): # 这里ds是id,[bs,1] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + 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 = commons.rand_slice_segments( + 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) + + def infer(self, phone, phone_lengths, sid, rate=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + if rate: + head = int(z_p.shape[2] * rate) + z_p = z_p[:, :, -head:] + x_mask = x_mask[:, :, -head:] + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec(z * x_mask, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs768NSFsid_nono(nn.Module): + def __init__( + self, + 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, + spk_embed_dim, + gin_channels, + sr=None, + **kwargs + ): + super().__init__() + self.spec_channels = spec_channels + self.inter_channels = inter_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.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=False, + ) + 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, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward(self, phone, phone_lengths, y, y_lengths, ds): # 这里ds是id,[bs,1] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + 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 = commons.rand_slice_segments( + 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) + + def infer(self, phone, phone_lengths, sid, rate=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + if rate: + head = int(z_p.shape[2] * rate) + z_p = z_p[:, :, -head:] + x_mask = x_mask[:, :, -head:] + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec(z * x_mask, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class MultiPeriodDiscriminator(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminator, self).__init__() + periods = [2, 3, 5, 7, 11, 17] + # periods = [3, 5, 7, 11, 17, 23, 37] + + 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) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + 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 MultiPeriodDiscriminatorV2(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminatorV2, self).__init__() + # periods = [2, 3, 5, 7, 11, 17] + periods = [2, 3, 5, 7, 11, 17, 23, 37] + + 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) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + 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 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 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 diff --git a/lib/infer_pack/models_dml.py b/lib/infer_pack/models_dml.py new file mode 100644 index 0000000000000000000000000000000000000000..958d7b29259763d2fea94caf8ba7e314c4a77d05 --- /dev/null +++ b/lib/infer_pack/models_dml.py @@ -0,0 +1,1124 @@ +import math, pdb, os +from time import time as ttime +import torch +from torch import nn +from torch.nn import functional as F +from lib.infer_pack import modules +from lib.infer_pack import attentions +from lib.infer_pack import commons +from lib.infer_pack.commons import init_weights, get_padding +from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d +from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm +from lib.infer_pack.commons import init_weights +import numpy as np +from lib.infer_pack import commons + + +class TextEncoder256(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + 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_phone = nn.Linear(256, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + 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, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(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 m, logs, x_mask + + +class TextEncoder768(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + 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_phone = nn.Linear(768, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + 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, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(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 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 + + def remove_weight_norm(self): + for i in range(self.n_flows): + self.flows[i * 2].remove_weight_norm() + + +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 + + def remove_weight_norm(self): + self.enc.remove_weight_norm() + + +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) + + def forward(self, x, g=None): + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + 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): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +class SineGen(torch.nn.Module): + """Definition of sine generator + SineGen(samp_rate, harmonic_num = 0, + sine_amp = 0.1, noise_std = 0.003, + voiced_threshold = 0, + flag_for_pulse=False) + samp_rate: sampling rate in Hz + harmonic_num: number of harmonic overtones (default 0) + sine_amp: amplitude of sine-wavefrom (default 0.1) + noise_std: std of Gaussian noise (default 0.003) + voiced_thoreshold: F0 threshold for U/V classification (default 0) + flag_for_pulse: this SinGen is used inside PulseGen (default False) + Note: when flag_for_pulse is True, the first time step of a voiced + segment is always sin(np.pi) or cos(0) + """ + + def __init__( + self, + samp_rate, + harmonic_num=0, + sine_amp=0.1, + noise_std=0.003, + voiced_threshold=0, + flag_for_pulse=False, + ): + super(SineGen, self).__init__() + self.sine_amp = sine_amp + self.noise_std = noise_std + self.harmonic_num = harmonic_num + self.dim = self.harmonic_num + 1 + self.sampling_rate = samp_rate + self.voiced_threshold = voiced_threshold + + def _f02uv(self, f0): + # generate uv signal + uv = torch.ones_like(f0) + uv = uv * (f0 > self.voiced_threshold) + return uv.float() + + def forward(self, f0, upp): + """sine_tensor, uv = forward(f0) + input F0: tensor(batchsize=1, length, dim=1) + f0 for unvoiced steps should be 0 + output sine_tensor: tensor(batchsize=1, length, dim) + output uv: tensor(batchsize=1, length, 1) + """ + with torch.no_grad(): + f0 = f0[:, None].transpose(1, 2) + f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device) + # fundamental component + f0_buf[:, :, 0] = f0[:, :, 0] + for idx in np.arange(self.harmonic_num): + f0_buf[:, :, idx + 1] = f0_buf[:, :, 0] * ( + idx + 2 + ) # idx + 2: the (idx+1)-th overtone, (idx+2)-th harmonic + rad_values = (f0_buf / self.sampling_rate) % 1 ###%1意味着n_har的乘积无法后处理优化 + rand_ini = torch.rand( + f0_buf.shape[0], f0_buf.shape[2], device=f0_buf.device + ) + rand_ini[:, 0] = 0 + rad_values[:, 0, :] = rad_values[:, 0, :] + rand_ini + tmp_over_one = torch.cumsum(rad_values, 1) # % 1 #####%1意味着后面的cumsum无法再优化 + tmp_over_one *= upp + tmp_over_one = F.interpolate( + tmp_over_one.transpose(2, 1), + scale_factor=upp, + mode="linear", + align_corners=True, + ).transpose(2, 1) + rad_values = F.interpolate( + rad_values.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose( + 2, 1 + ) ####### + tmp_over_one %= 1 + tmp_over_one_idx = (tmp_over_one[:, 1:, :] - tmp_over_one[:, :-1, :]) < 0 + cumsum_shift = torch.zeros_like(rad_values) + cumsum_shift[:, 1:, :] = tmp_over_one_idx * -1.0 + sine_waves = torch.sin( + torch.cumsum(rad_values + cumsum_shift, dim=1) * 2 * np.pi + ) + sine_waves = sine_waves * self.sine_amp + uv = self._f02uv(f0) + uv = F.interpolate( + uv.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose(2, 1) + noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3 + noise = noise_amp * torch.randn_like(sine_waves) + sine_waves = sine_waves * uv + noise + return sine_waves, uv, noise + + +class SourceModuleHnNSF(torch.nn.Module): + """SourceModule for hn-nsf + SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1, + add_noise_std=0.003, voiced_threshod=0) + sampling_rate: sampling_rate in Hz + harmonic_num: number of harmonic above F0 (default: 0) + sine_amp: amplitude of sine source signal (default: 0.1) + add_noise_std: std of additive Gaussian noise (default: 0.003) + note that amplitude of noise in unvoiced is decided + by sine_amp + voiced_threshold: threhold to set U/V given F0 (default: 0) + Sine_source, noise_source = SourceModuleHnNSF(F0_sampled) + F0_sampled (batchsize, length, 1) + Sine_source (batchsize, length, 1) + noise_source (batchsize, length 1) + uv (batchsize, length, 1) + """ + + def __init__( + self, + sampling_rate, + harmonic_num=0, + sine_amp=0.1, + add_noise_std=0.003, + voiced_threshod=0, + is_half=True, + ): + super(SourceModuleHnNSF, self).__init__() + + self.sine_amp = sine_amp + self.noise_std = add_noise_std + self.is_half = is_half + # to produce sine waveforms + self.l_sin_gen = SineGen( + sampling_rate, harmonic_num, sine_amp, add_noise_std, voiced_threshod + ) + + # to merge source harmonics into a single excitation + self.l_linear = torch.nn.Linear(harmonic_num + 1, 1) + self.l_tanh = torch.nn.Tanh() + + def forward(self, x, upp=None): + sine_wavs, uv, _ = self.l_sin_gen(x, upp) + if self.is_half: + sine_wavs = sine_wavs.half() + sine_merge = self.l_tanh(self.l_linear(sine_wavs)) + return sine_merge, None, None # noise, uv + + +class GeneratorNSF(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, + sr, + is_half=False, + ): + super(GeneratorNSF, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + + self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(upsample_rates)) + self.m_source = SourceModuleHnNSF( + sampling_rate=sr, harmonic_num=0, is_half=is_half + ) + self.noise_convs = nn.ModuleList() + 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)): + c_cur = upsample_initial_channel // (2 ** (i + 1)) + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + if i + 1 < len(upsample_rates): + stride_f0 = np.prod(upsample_rates[i + 1 :]) + self.noise_convs.append( + Conv1d( + 1, + c_cur, + kernel_size=stride_f0 * 2, + stride=stride_f0, + padding=stride_f0 // 2, + ) + ) + else: + self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1)) + + 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) + + self.upp = np.prod(upsample_rates) + + def forward(self, x, f0, g=None): + har_source, noi_source, uv = self.m_source(f0, self.upp) + har_source = har_source.transpose(1, 2) + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + x_source = self.noise_convs[i](har_source) + x = x + x_source + 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): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +sr2sr = { + "32k": 32000, + "40k": 40000, + "48k": 48000, +} + + +class SynthesizerTrnMs256NSFsid(nn.Module): + def __init__( + self, + 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, + spk_embed_dim, + gin_channels, + sr, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_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.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + 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, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward( + self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds + ): # 这里ds是id,[bs,1] + # print(1,pitch.shape)#[bs,t] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + 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 = commons.rand_slice_segments( + 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 = commons.slice_segments2(pitchf, ids_slice, self.segment_size) + # print(-2,pitchf.shape,z_slice.shape) + o = self.dec(z_slice, pitchf, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, pitch, nsff0, sid, max_len=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs768NSFsid(nn.Module): + def __init__( + self, + 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, + spk_embed_dim, + gin_channels, + sr, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_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.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + 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, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward( + self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds + ): # 这里ds是id,[bs,1] + # print(1,pitch.shape)#[bs,t] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + 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 = commons.rand_slice_segments( + 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 = commons.slice_segments2(pitchf, ids_slice, self.segment_size) + # print(-2,pitchf.shape,z_slice.shape) + o = self.dec(z_slice, pitchf, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, pitch, nsff0, sid, max_len=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs256NSFsid_nono(nn.Module): + def __init__( + self, + 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, + spk_embed_dim, + gin_channels, + sr=None, + **kwargs + ): + super().__init__() + self.spec_channels = spec_channels + self.inter_channels = inter_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.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=False, + ) + 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, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward(self, phone, phone_lengths, y, y_lengths, ds): # 这里ds是id,[bs,1] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + 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 = commons.rand_slice_segments( + 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) + + def infer(self, phone, phone_lengths, sid, max_len=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class SynthesizerTrnMs768NSFsid_nono(nn.Module): + def __init__( + self, + 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, + spk_embed_dim, + gin_channels, + sr=None, + **kwargs + ): + super().__init__() + self.spec_channels = spec_channels + self.inter_channels = inter_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.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=False, + ) + 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, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward(self, phone, phone_lengths, y, y_lengths, ds): # 这里ds是id,[bs,1] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + 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 = commons.rand_slice_segments( + 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) + + def infer(self, phone, phone_lengths, sid, max_len=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], g=g) + return o, x_mask, (z, z_p, m_p, logs_p) + + +class MultiPeriodDiscriminator(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminator, self).__init__() + periods = [2, 3, 5, 7, 11, 17] + # periods = [3, 5, 7, 11, 17, 23, 37] + + 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) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + 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 MultiPeriodDiscriminatorV2(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminatorV2, self).__init__() + # periods = [2, 3, 5, 7, 11, 17] + periods = [2, 3, 5, 7, 11, 17, 23, 37] + + 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) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + 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 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 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 diff --git a/lib/infer_pack/models_onnx.py b/lib/infer_pack/models_onnx.py new file mode 100644 index 0000000000000000000000000000000000000000..963e67b29f828e9fdd096397952054fe77cf3d10 --- /dev/null +++ b/lib/infer_pack/models_onnx.py @@ -0,0 +1,819 @@ +import math, pdb, os +from time import time as ttime +import torch +from torch import nn +from torch.nn import functional as F +from lib.infer_pack import modules +from lib.infer_pack import attentions +from lib.infer_pack import commons +from lib.infer_pack.commons import init_weights, get_padding +from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d +from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm +from lib.infer_pack.commons import init_weights +import numpy as np +from lib.infer_pack import commons + + +class TextEncoder256(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + 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_phone = nn.Linear(256, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + 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, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(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 m, logs, x_mask + + +class TextEncoder768(nn.Module): + def __init__( + self, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + f0=True, + ): + super().__init__() + 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_phone = nn.Linear(768, hidden_channels) + self.lrelu = nn.LeakyReLU(0.1, inplace=True) + if f0 == True: + self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 + 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, phone, pitch, lengths): + if pitch == None: + x = self.emb_phone(phone) + else: + x = self.emb_phone(phone) + self.emb_pitch(pitch) + x = x * math.sqrt(self.hidden_channels) # [b, t, h] + x = self.lrelu(x) + x = torch.transpose(x, 1, -1) # [b, h, t] + x_mask = torch.unsqueeze(commons.sequence_mask(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 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 + + def remove_weight_norm(self): + for i in range(self.n_flows): + self.flows[i * 2].remove_weight_norm() + + +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 + + def remove_weight_norm(self): + self.enc.remove_weight_norm() + + +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) + + def forward(self, x, g=None): + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + 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): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +class SineGen(torch.nn.Module): + """Definition of sine generator + SineGen(samp_rate, harmonic_num = 0, + sine_amp = 0.1, noise_std = 0.003, + voiced_threshold = 0, + flag_for_pulse=False) + samp_rate: sampling rate in Hz + harmonic_num: number of harmonic overtones (default 0) + sine_amp: amplitude of sine-wavefrom (default 0.1) + noise_std: std of Gaussian noise (default 0.003) + voiced_thoreshold: F0 threshold for U/V classification (default 0) + flag_for_pulse: this SinGen is used inside PulseGen (default False) + Note: when flag_for_pulse is True, the first time step of a voiced + segment is always sin(np.pi) or cos(0) + """ + + def __init__( + self, + samp_rate, + harmonic_num=0, + sine_amp=0.1, + noise_std=0.003, + voiced_threshold=0, + flag_for_pulse=False, + ): + super(SineGen, self).__init__() + self.sine_amp = sine_amp + self.noise_std = noise_std + self.harmonic_num = harmonic_num + self.dim = self.harmonic_num + 1 + self.sampling_rate = samp_rate + self.voiced_threshold = voiced_threshold + + def _f02uv(self, f0): + # generate uv signal + uv = torch.ones_like(f0) + uv = uv * (f0 > self.voiced_threshold) + return uv + + def forward(self, f0, upp): + """sine_tensor, uv = forward(f0) + input F0: tensor(batchsize=1, length, dim=1) + f0 for unvoiced steps should be 0 + output sine_tensor: tensor(batchsize=1, length, dim) + output uv: tensor(batchsize=1, length, 1) + """ + with torch.no_grad(): + f0 = f0[:, None].transpose(1, 2) + f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device) + # fundamental component + f0_buf[:, :, 0] = f0[:, :, 0] + for idx in np.arange(self.harmonic_num): + f0_buf[:, :, idx + 1] = f0_buf[:, :, 0] * ( + idx + 2 + ) # idx + 2: the (idx+1)-th overtone, (idx+2)-th harmonic + rad_values = (f0_buf / self.sampling_rate) % 1 ###%1意味着n_har的乘积无法后处理优化 + rand_ini = torch.rand( + f0_buf.shape[0], f0_buf.shape[2], device=f0_buf.device + ) + rand_ini[:, 0] = 0 + rad_values[:, 0, :] = rad_values[:, 0, :] + rand_ini + tmp_over_one = torch.cumsum(rad_values, 1) # % 1 #####%1意味着后面的cumsum无法再优化 + tmp_over_one *= upp + tmp_over_one = F.interpolate( + tmp_over_one.transpose(2, 1), + scale_factor=upp, + mode="linear", + align_corners=True, + ).transpose(2, 1) + rad_values = F.interpolate( + rad_values.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose( + 2, 1 + ) ####### + tmp_over_one %= 1 + tmp_over_one_idx = (tmp_over_one[:, 1:, :] - tmp_over_one[:, :-1, :]) < 0 + cumsum_shift = torch.zeros_like(rad_values) + cumsum_shift[:, 1:, :] = tmp_over_one_idx * -1.0 + sine_waves = torch.sin( + torch.cumsum(rad_values + cumsum_shift, dim=1) * 2 * np.pi + ) + sine_waves = sine_waves * self.sine_amp + uv = self._f02uv(f0) + uv = F.interpolate( + uv.transpose(2, 1), scale_factor=upp, mode="nearest" + ).transpose(2, 1) + noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3 + noise = noise_amp * torch.randn_like(sine_waves) + sine_waves = sine_waves * uv + noise + return sine_waves, uv, noise + + +class SourceModuleHnNSF(torch.nn.Module): + """SourceModule for hn-nsf + SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1, + add_noise_std=0.003, voiced_threshod=0) + sampling_rate: sampling_rate in Hz + harmonic_num: number of harmonic above F0 (default: 0) + sine_amp: amplitude of sine source signal (default: 0.1) + add_noise_std: std of additive Gaussian noise (default: 0.003) + note that amplitude of noise in unvoiced is decided + by sine_amp + voiced_threshold: threhold to set U/V given F0 (default: 0) + Sine_source, noise_source = SourceModuleHnNSF(F0_sampled) + F0_sampled (batchsize, length, 1) + Sine_source (batchsize, length, 1) + noise_source (batchsize, length 1) + uv (batchsize, length, 1) + """ + + def __init__( + self, + sampling_rate, + harmonic_num=0, + sine_amp=0.1, + add_noise_std=0.003, + voiced_threshod=0, + is_half=True, + ): + super(SourceModuleHnNSF, self).__init__() + + self.sine_amp = sine_amp + self.noise_std = add_noise_std + self.is_half = is_half + # to produce sine waveforms + self.l_sin_gen = SineGen( + sampling_rate, harmonic_num, sine_amp, add_noise_std, voiced_threshod + ) + + # to merge source harmonics into a single excitation + self.l_linear = torch.nn.Linear(harmonic_num + 1, 1) + self.l_tanh = torch.nn.Tanh() + + def forward(self, x, upp=None): + sine_wavs, uv, _ = self.l_sin_gen(x, upp) + if self.is_half: + sine_wavs = sine_wavs.half() + sine_merge = self.l_tanh(self.l_linear(sine_wavs)) + return sine_merge, None, None # noise, uv + + +class GeneratorNSF(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, + sr, + is_half=False, + ): + super(GeneratorNSF, self).__init__() + self.num_kernels = len(resblock_kernel_sizes) + self.num_upsamples = len(upsample_rates) + + self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(upsample_rates)) + self.m_source = SourceModuleHnNSF( + sampling_rate=sr, harmonic_num=0, is_half=is_half + ) + self.noise_convs = nn.ModuleList() + 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)): + c_cur = upsample_initial_channel // (2 ** (i + 1)) + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) + if i + 1 < len(upsample_rates): + stride_f0 = np.prod(upsample_rates[i + 1 :]) + self.noise_convs.append( + Conv1d( + 1, + c_cur, + kernel_size=stride_f0 * 2, + stride=stride_f0, + padding=stride_f0 // 2, + ) + ) + else: + self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1)) + + 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) + + self.upp = np.prod(upsample_rates) + + def forward(self, x, f0, g=None): + har_source, noi_source, uv = self.m_source(f0, self.upp) + har_source = har_source.transpose(1, 2) + x = self.conv_pre(x) + if g is not None: + x = x + self.cond(g) + + for i in range(self.num_upsamples): + x = F.leaky_relu(x, modules.LRELU_SLOPE) + x = self.ups[i](x) + x_source = self.noise_convs[i](har_source) + x = x + x_source + 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): + for l in self.ups: + remove_weight_norm(l) + for l in self.resblocks: + l.remove_weight_norm() + + +sr2sr = { + "32k": 32000, + "40k": 40000, + "48k": 48000, +} + + +class SynthesizerTrnMsNSFsidM(nn.Module): + def __init__( + self, + 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, + spk_embed_dim, + gin_channels, + sr, + version, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_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.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + if version == "v1": + self.enc_p = TextEncoder256( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + else: + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + 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, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + self.speaker_map = None + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def construct_spkmixmap(self, n_speaker): + self.speaker_map = torch.zeros((n_speaker, 1, 1, self.gin_channels)) + for i in range(n_speaker): + self.speaker_map[i] = self.emb_g(torch.LongTensor([[i]])) + self.speaker_map = self.speaker_map.unsqueeze(0) + + def forward(self, phone, phone_lengths, pitch, nsff0, g, rnd, max_len=None): + if self.speaker_map is not None: # [N, S] * [S, B, 1, H] + g = g.reshape((g.shape[0], g.shape[1], 1, 1, 1)) # [N, S, B, 1, 1] + g = g * self.speaker_map # [N, S, B, 1, H] + g = torch.sum(g, dim=1) # [N, 1, B, 1, H] + g = g.transpose(0, -1).transpose(0, -2).squeeze(0) # [B, H, N] + else: + g = g.unsqueeze(0) + g = self.emb_g(g).transpose(1, 2) + + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * rnd) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g) + return o + + +class MultiPeriodDiscriminator(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminator, self).__init__() + periods = [2, 3, 5, 7, 11, 17] + # periods = [3, 5, 7, 11, 17, 23, 37] + + 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) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + 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 MultiPeriodDiscriminatorV2(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminatorV2, self).__init__() + # periods = [2, 3, 5, 7, 11, 17] + periods = [2, 3, 5, 7, 11, 17, 23, 37] + + 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) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + 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 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 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 diff --git a/lib/infer_pack/modules.py b/lib/infer_pack/modules.py new file mode 100644 index 0000000000000000000000000000000000000000..c83289df7c79a4810dacd15c050148544ba0b6a9 --- /dev/null +++ b/lib/infer_pack/modules.py @@ -0,0 +1,522 @@ +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 + +from lib.infer_pack import commons +from lib.infer_pack.commons import init_weights, get_padding +from lib.infer_pack.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.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 + + def remove_weight_norm(self): + self.enc.remove_weight_norm() + + +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.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/lib/infer_pack/modules/F0Predictor/DioF0Predictor.py b/lib/infer_pack/modules/F0Predictor/DioF0Predictor.py new file mode 100644 index 0000000000000000000000000000000000000000..ee3171bcb7c4a5066560723108b56e055f18be45 --- /dev/null +++ b/lib/infer_pack/modules/F0Predictor/DioF0Predictor.py @@ -0,0 +1,90 @@ +from lib.infer_pack.modules.F0Predictor.F0Predictor import F0Predictor +import pyworld +import numpy as np + + +class DioF0Predictor(F0Predictor): + def __init__(self, hop_length=512, f0_min=50, f0_max=1100, sampling_rate=44100): + self.hop_length = hop_length + self.f0_min = f0_min + self.f0_max = f0_max + self.sampling_rate = sampling_rate + + def interpolate_f0(self, f0): + """ + 对F0进行插值处理 + """ + + data = np.reshape(f0, (f0.size, 1)) + + vuv_vector = np.zeros((data.size, 1), dtype=np.float32) + vuv_vector[data > 0.0] = 1.0 + vuv_vector[data <= 0.0] = 0.0 + + ip_data = data + + frame_number = data.size + last_value = 0.0 + for i in range(frame_number): + if data[i] <= 0.0: + j = i + 1 + for j in range(i + 1, frame_number): + if data[j] > 0.0: + break + if j < frame_number - 1: + if last_value > 0.0: + step = (data[j] - data[i - 1]) / float(j - i) + for k in range(i, j): + ip_data[k] = data[i - 1] + step * (k - i + 1) + else: + for k in range(i, j): + ip_data[k] = data[j] + else: + for k in range(i, frame_number): + ip_data[k] = last_value + else: + ip_data[i] = data[i] # 这里可能存在一个没有必要的拷贝 + last_value = data[i] + + return ip_data[:, 0], vuv_vector[:, 0] + + def resize_f0(self, x, target_len): + source = np.array(x) + source[source < 0.001] = np.nan + target = np.interp( + np.arange(0, len(source) * target_len, len(source)) / target_len, + np.arange(0, len(source)), + source, + ) + res = np.nan_to_num(target) + return res + + def compute_f0(self, wav, p_len=None): + if p_len is None: + p_len = wav.shape[0] // self.hop_length + f0, t = pyworld.dio( + wav.astype(np.double), + fs=self.sampling_rate, + f0_floor=self.f0_min, + f0_ceil=self.f0_max, + frame_period=1000 * self.hop_length / self.sampling_rate, + ) + f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.sampling_rate) + for index, pitch in enumerate(f0): + f0[index] = round(pitch, 1) + return self.interpolate_f0(self.resize_f0(f0, p_len))[0] + + def compute_f0_uv(self, wav, p_len=None): + if p_len is None: + p_len = wav.shape[0] // self.hop_length + f0, t = pyworld.dio( + wav.astype(np.double), + fs=self.sampling_rate, + f0_floor=self.f0_min, + f0_ceil=self.f0_max, + frame_period=1000 * self.hop_length / self.sampling_rate, + ) + f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.sampling_rate) + for index, pitch in enumerate(f0): + f0[index] = round(pitch, 1) + return self.interpolate_f0(self.resize_f0(f0, p_len)) diff --git a/lib/infer_pack/modules/F0Predictor/F0Predictor.py b/lib/infer_pack/modules/F0Predictor/F0Predictor.py new file mode 100644 index 0000000000000000000000000000000000000000..f56e49e7f0e6eab3babf0711cae2933371b9f9cc --- /dev/null +++ b/lib/infer_pack/modules/F0Predictor/F0Predictor.py @@ -0,0 +1,16 @@ +class F0Predictor(object): + def compute_f0(self, wav, p_len): + """ + input: wav:[signal_length] + p_len:int + output: f0:[signal_length//hop_length] + """ + pass + + def compute_f0_uv(self, wav, p_len): + """ + input: wav:[signal_length] + p_len:int + output: f0:[signal_length//hop_length],uv:[signal_length//hop_length] + """ + pass diff --git a/lib/infer_pack/modules/F0Predictor/HarvestF0Predictor.py b/lib/infer_pack/modules/F0Predictor/HarvestF0Predictor.py new file mode 100644 index 0000000000000000000000000000000000000000..b412ba2814e114ca7bb00b6fd6ef217f63d788a3 --- /dev/null +++ b/lib/infer_pack/modules/F0Predictor/HarvestF0Predictor.py @@ -0,0 +1,86 @@ +from lib.infer_pack.modules.F0Predictor.F0Predictor import F0Predictor +import pyworld +import numpy as np + + +class HarvestF0Predictor(F0Predictor): + def __init__(self, hop_length=512, f0_min=50, f0_max=1100, sampling_rate=44100): + self.hop_length = hop_length + self.f0_min = f0_min + self.f0_max = f0_max + self.sampling_rate = sampling_rate + + def interpolate_f0(self, f0): + """ + 对F0进行插值处理 + """ + + data = np.reshape(f0, (f0.size, 1)) + + vuv_vector = np.zeros((data.size, 1), dtype=np.float32) + vuv_vector[data > 0.0] = 1.0 + vuv_vector[data <= 0.0] = 0.0 + + ip_data = data + + frame_number = data.size + last_value = 0.0 + for i in range(frame_number): + if data[i] <= 0.0: + j = i + 1 + for j in range(i + 1, frame_number): + if data[j] > 0.0: + break + if j < frame_number - 1: + if last_value > 0.0: + step = (data[j] - data[i - 1]) / float(j - i) + for k in range(i, j): + ip_data[k] = data[i - 1] + step * (k - i + 1) + else: + for k in range(i, j): + ip_data[k] = data[j] + else: + for k in range(i, frame_number): + ip_data[k] = last_value + else: + ip_data[i] = data[i] # 这里可能存在一个没有必要的拷贝 + last_value = data[i] + + return ip_data[:, 0], vuv_vector[:, 0] + + def resize_f0(self, x, target_len): + source = np.array(x) + source[source < 0.001] = np.nan + target = np.interp( + np.arange(0, len(source) * target_len, len(source)) / target_len, + np.arange(0, len(source)), + source, + ) + res = np.nan_to_num(target) + return res + + def compute_f0(self, wav, p_len=None): + if p_len is None: + p_len = wav.shape[0] // self.hop_length + f0, t = pyworld.harvest( + wav.astype(np.double), + fs=self.hop_length, + f0_ceil=self.f0_max, + f0_floor=self.f0_min, + frame_period=1000 * self.hop_length / self.sampling_rate, + ) + f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.fs) + return self.interpolate_f0(self.resize_f0(f0, p_len))[0] + + def compute_f0_uv(self, wav, p_len=None): + if p_len is None: + p_len = wav.shape[0] // self.hop_length + f0, t = pyworld.harvest( + wav.astype(np.double), + fs=self.sampling_rate, + f0_floor=self.f0_min, + f0_ceil=self.f0_max, + frame_period=1000 * self.hop_length / self.sampling_rate, + ) + f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.sampling_rate) + return self.interpolate_f0(self.resize_f0(f0, p_len)) diff --git a/lib/infer_pack/modules/F0Predictor/PMF0Predictor.py b/lib/infer_pack/modules/F0Predictor/PMF0Predictor.py new file mode 100644 index 0000000000000000000000000000000000000000..b2c592527a5966e6f8e79e8c52dc5b414246dcc6 --- /dev/null +++ b/lib/infer_pack/modules/F0Predictor/PMF0Predictor.py @@ -0,0 +1,97 @@ +from lib.infer_pack.modules.F0Predictor.F0Predictor import F0Predictor +import parselmouth +import numpy as np + + +class PMF0Predictor(F0Predictor): + def __init__(self, hop_length=512, f0_min=50, f0_max=1100, sampling_rate=44100): + self.hop_length = hop_length + self.f0_min = f0_min + self.f0_max = f0_max + self.sampling_rate = sampling_rate + + def interpolate_f0(self, f0): + """ + 对F0进行插值处理 + """ + + data = np.reshape(f0, (f0.size, 1)) + + vuv_vector = np.zeros((data.size, 1), dtype=np.float32) + vuv_vector[data > 0.0] = 1.0 + vuv_vector[data <= 0.0] = 0.0 + + ip_data = data + + frame_number = data.size + last_value = 0.0 + for i in range(frame_number): + if data[i] <= 0.0: + j = i + 1 + for j in range(i + 1, frame_number): + if data[j] > 0.0: + break + if j < frame_number - 1: + if last_value > 0.0: + step = (data[j] - data[i - 1]) / float(j - i) + for k in range(i, j): + ip_data[k] = data[i - 1] + step * (k - i + 1) + else: + for k in range(i, j): + ip_data[k] = data[j] + else: + for k in range(i, frame_number): + ip_data[k] = last_value + else: + ip_data[i] = data[i] # 这里可能存在一个没有必要的拷贝 + last_value = data[i] + + return ip_data[:, 0], vuv_vector[:, 0] + + def compute_f0(self, wav, p_len=None): + x = wav + if p_len is None: + p_len = x.shape[0] // self.hop_length + else: + assert abs(p_len - x.shape[0] // self.hop_length) < 4, "pad length error" + time_step = self.hop_length / self.sampling_rate * 1000 + f0 = ( + parselmouth.Sound(x, self.sampling_rate) + .to_pitch_ac( + time_step=time_step / 1000, + voicing_threshold=0.6, + pitch_floor=self.f0_min, + pitch_ceiling=self.f0_max, + ) + .selected_array["frequency"] + ) + + pad_size = (p_len - len(f0) + 1) // 2 + if pad_size > 0 or p_len - len(f0) - pad_size > 0: + f0 = np.pad(f0, [[pad_size, p_len - len(f0) - pad_size]], mode="constant") + f0, uv = self.interpolate_f0(f0) + return f0 + + def compute_f0_uv(self, wav, p_len=None): + x = wav + if p_len is None: + p_len = x.shape[0] // self.hop_length + else: + assert abs(p_len - x.shape[0] // self.hop_length) < 4, "pad length error" + time_step = self.hop_length / self.sampling_rate * 1000 + f0 = ( + parselmouth.Sound(x, self.sampling_rate) + .to_pitch_ac( + time_step=time_step / 1000, + voicing_threshold=0.6, + pitch_floor=self.f0_min, + pitch_ceiling=self.f0_max, + ) + .selected_array["frequency"] + ) + + pad_size = (p_len - len(f0) + 1) // 2 + if pad_size > 0 or p_len - len(f0) - pad_size > 0: + f0 = np.pad(f0, [[pad_size, p_len - len(f0) - pad_size]], mode="constant") + f0, uv = self.interpolate_f0(f0) + return f0, uv diff --git a/lib/infer_pack/modules/F0Predictor/__init__.py b/lib/infer_pack/modules/F0Predictor/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lib/infer_pack/onnx_inference.py b/lib/infer_pack/onnx_inference.py new file mode 100644 index 0000000000000000000000000000000000000000..6517853be49e61c427cf7cd9b5ed203f6d5f367e --- /dev/null +++ b/lib/infer_pack/onnx_inference.py @@ -0,0 +1,145 @@ +import onnxruntime +import librosa +import numpy as np +import soundfile + + +class ContentVec: + def __init__(self, vec_path="pretrained/vec-768-layer-12.onnx", device=None): + print("load model(s) from {}".format(vec_path)) + if device == "cpu" or device is None: + providers = ["CPUExecutionProvider"] + elif device == "cuda": + providers = ["CUDAExecutionProvider", "CPUExecutionProvider"] + elif device == "dml": + providers = ["DmlExecutionProvider"] + else: + raise RuntimeError("Unsportted Device") + self.model = onnxruntime.InferenceSession(vec_path, providers=providers) + + def __call__(self, wav): + return self.forward(wav) + + def forward(self, wav): + feats = wav + if feats.ndim == 2: # double channels + feats = feats.mean(-1) + assert feats.ndim == 1, feats.ndim + feats = np.expand_dims(np.expand_dims(feats, 0), 0) + onnx_input = {self.model.get_inputs()[0].name: feats} + logits = self.model.run(None, onnx_input)[0] + return logits.transpose(0, 2, 1) + + +def get_f0_predictor(f0_predictor, hop_length, sampling_rate, **kargs): + if f0_predictor == "pm": + from lib.infer_pack.modules.F0Predictor.PMF0Predictor import PMF0Predictor + + f0_predictor_object = PMF0Predictor( + hop_length=hop_length, sampling_rate=sampling_rate + ) + elif f0_predictor == "harvest": + from lib.infer_pack.modules.F0Predictor.HarvestF0Predictor import ( + HarvestF0Predictor, + ) + + f0_predictor_object = HarvestF0Predictor( + hop_length=hop_length, sampling_rate=sampling_rate + ) + elif f0_predictor == "dio": + from lib.infer_pack.modules.F0Predictor.DioF0Predictor import DioF0Predictor + + f0_predictor_object = DioF0Predictor( + hop_length=hop_length, sampling_rate=sampling_rate + ) + else: + raise Exception("Unknown f0 predictor") + return f0_predictor_object + + +class OnnxRVC: + def __init__( + self, + model_path, + sr=40000, + hop_size=512, + vec_path="vec-768-layer-12", + device="cpu", + ): + vec_path = f"pretrained/{vec_path}.onnx" + self.vec_model = ContentVec(vec_path, device) + if device == "cpu" or device is None: + providers = ["CPUExecutionProvider"] + elif device == "cuda": + providers = ["CUDAExecutionProvider", "CPUExecutionProvider"] + elif device == "dml": + providers = ["DmlExecutionProvider"] + else: + raise RuntimeError("Unsportted Device") + self.model = onnxruntime.InferenceSession(model_path, providers=providers) + self.sampling_rate = sr + self.hop_size = hop_size + + def forward(self, hubert, hubert_length, pitch, pitchf, ds, rnd): + onnx_input = { + self.model.get_inputs()[0].name: hubert, + self.model.get_inputs()[1].name: hubert_length, + self.model.get_inputs()[2].name: pitch, + self.model.get_inputs()[3].name: pitchf, + self.model.get_inputs()[4].name: ds, + self.model.get_inputs()[5].name: rnd, + } + return (self.model.run(None, onnx_input)[0] * 32767).astype(np.int16) + + def inference( + self, + raw_path, + sid, + f0_method="dio", + f0_up_key=0, + pad_time=0.5, + cr_threshold=0.02, + ): + f0_min = 50 + f0_max = 1100 + f0_mel_min = 1127 * np.log(1 + f0_min / 700) + f0_mel_max = 1127 * np.log(1 + f0_max / 700) + f0_predictor = get_f0_predictor( + f0_method, + hop_length=self.hop_size, + sampling_rate=self.sampling_rate, + threshold=cr_threshold, + ) + wav, sr = librosa.load(raw_path, sr=self.sampling_rate) + org_length = len(wav) + if org_length / sr > 50.0: + raise RuntimeError("Reached Max Length") + + wav16k = librosa.resample(wav, orig_sr=self.sampling_rate, target_sr=16000) + wav16k = wav16k + + hubert = self.vec_model(wav16k) + hubert = np.repeat(hubert, 2, axis=2).transpose(0, 2, 1).astype(np.float32) + hubert_length = hubert.shape[1] + + pitchf = f0_predictor.compute_f0(wav, hubert_length) + pitchf = pitchf * 2 ** (f0_up_key / 12) + pitch = pitchf.copy() + f0_mel = 1127 * np.log(1 + pitch / 700) + f0_mel[f0_mel > 0] = (f0_mel[f0_mel > 0] - f0_mel_min) * 254 / ( + f0_mel_max - f0_mel_min + ) + 1 + f0_mel[f0_mel <= 1] = 1 + f0_mel[f0_mel > 255] = 255 + pitch = np.rint(f0_mel).astype(np.int64) + + pitchf = pitchf.reshape(1, len(pitchf)).astype(np.float32) + pitch = pitch.reshape(1, len(pitch)) + ds = np.array([sid]).astype(np.int64) + + rnd = np.random.randn(1, 192, hubert_length).astype(np.float32) + hubert_length = np.array([hubert_length]).astype(np.int64) + + out_wav = self.forward(hubert, hubert_length, pitch, pitchf, ds, rnd).squeeze() + out_wav = np.pad(out_wav, (0, 2 * self.hop_size), "constant") + return out_wav[0:org_length] diff --git a/lib/infer_pack/transforms.py b/lib/infer_pack/transforms.py new file mode 100644 index 0000000000000000000000000000000000000000..a11f799e023864ff7082c1f49c0cc18351a13b47 --- /dev/null +++ b/lib/infer_pack/transforms.py @@ -0,0 +1,209 @@ +import torch +from torch.nn import functional as F + +import numpy as np + + +DEFAULT_MIN_BIN_WIDTH = 1e-3 +DEFAULT_MIN_BIN_HEIGHT = 1e-3 +DEFAULT_MIN_DERIVATIVE = 1e-3 + + +def piecewise_rational_quadratic_transform( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + tails=None, + tail_bound=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): + if tails is None: + spline_fn = rational_quadratic_spline + spline_kwargs = {} + else: + spline_fn = unconstrained_rational_quadratic_spline + spline_kwargs = {"tails": tails, "tail_bound": tail_bound} + + outputs, logabsdet = spline_fn( + inputs=inputs, + unnormalized_widths=unnormalized_widths, + unnormalized_heights=unnormalized_heights, + unnormalized_derivatives=unnormalized_derivatives, + inverse=inverse, + min_bin_width=min_bin_width, + min_bin_height=min_bin_height, + min_derivative=min_derivative, + **spline_kwargs + ) + return outputs, logabsdet + + +def searchsorted(bin_locations, inputs, eps=1e-6): + bin_locations[..., -1] += eps + return torch.sum(inputs[..., None] >= bin_locations, dim=-1) - 1 + + +def unconstrained_rational_quadratic_spline( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + tails="linear", + tail_bound=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): + inside_interval_mask = (inputs >= -tail_bound) & (inputs <= tail_bound) + outside_interval_mask = ~inside_interval_mask + + outputs = torch.zeros_like(inputs) + logabsdet = torch.zeros_like(inputs) + + if tails == "linear": + unnormalized_derivatives = F.pad(unnormalized_derivatives, pad=(1, 1)) + constant = np.log(np.exp(1 - min_derivative) - 1) + unnormalized_derivatives[..., 0] = constant + unnormalized_derivatives[..., -1] = constant + + outputs[outside_interval_mask] = inputs[outside_interval_mask] + logabsdet[outside_interval_mask] = 0 + else: + raise RuntimeError("{} tails are not implemented.".format(tails)) + + ( + outputs[inside_interval_mask], + logabsdet[inside_interval_mask], + ) = rational_quadratic_spline( + inputs=inputs[inside_interval_mask], + unnormalized_widths=unnormalized_widths[inside_interval_mask, :], + unnormalized_heights=unnormalized_heights[inside_interval_mask, :], + unnormalized_derivatives=unnormalized_derivatives[inside_interval_mask, :], + inverse=inverse, + left=-tail_bound, + right=tail_bound, + bottom=-tail_bound, + top=tail_bound, + min_bin_width=min_bin_width, + min_bin_height=min_bin_height, + min_derivative=min_derivative, + ) + + return outputs, logabsdet + + +def rational_quadratic_spline( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + left=0.0, + right=1.0, + bottom=0.0, + top=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): + if torch.min(inputs) < left or torch.max(inputs) > right: + raise ValueError("Input to a transform is not within its domain") + + num_bins = unnormalized_widths.shape[-1] + + if min_bin_width * num_bins > 1.0: + raise ValueError("Minimal bin width too large for the number of bins") + if min_bin_height * num_bins > 1.0: + raise ValueError("Minimal bin height too large for the number of bins") + + widths = F.softmax(unnormalized_widths, dim=-1) + widths = min_bin_width + (1 - min_bin_width * num_bins) * widths + cumwidths = torch.cumsum(widths, dim=-1) + cumwidths = F.pad(cumwidths, pad=(1, 0), mode="constant", value=0.0) + cumwidths = (right - left) * cumwidths + left + cumwidths[..., 0] = left + cumwidths[..., -1] = right + widths = cumwidths[..., 1:] - cumwidths[..., :-1] + + derivatives = min_derivative + F.softplus(unnormalized_derivatives) + + heights = F.softmax(unnormalized_heights, dim=-1) + heights = min_bin_height + (1 - min_bin_height * num_bins) * heights + cumheights = torch.cumsum(heights, dim=-1) + cumheights = F.pad(cumheights, pad=(1, 0), mode="constant", value=0.0) + cumheights = (top - bottom) * cumheights + bottom + cumheights[..., 0] = bottom + cumheights[..., -1] = top + heights = cumheights[..., 1:] - cumheights[..., :-1] + + if inverse: + bin_idx = searchsorted(cumheights, inputs)[..., None] + else: + bin_idx = searchsorted(cumwidths, inputs)[..., None] + + input_cumwidths = cumwidths.gather(-1, bin_idx)[..., 0] + input_bin_widths = widths.gather(-1, bin_idx)[..., 0] + + input_cumheights = cumheights.gather(-1, bin_idx)[..., 0] + delta = heights / widths + input_delta = delta.gather(-1, bin_idx)[..., 0] + + input_derivatives = derivatives.gather(-1, bin_idx)[..., 0] + input_derivatives_plus_one = derivatives[..., 1:].gather(-1, bin_idx)[..., 0] + + input_heights = heights.gather(-1, bin_idx)[..., 0] + + if inverse: + a = (inputs - input_cumheights) * ( + input_derivatives + input_derivatives_plus_one - 2 * input_delta + ) + input_heights * (input_delta - input_derivatives) + b = input_heights * input_derivatives - (inputs - input_cumheights) * ( + input_derivatives + input_derivatives_plus_one - 2 * input_delta + ) + c = -input_delta * (inputs - input_cumheights) + + discriminant = b.pow(2) - 4 * a * c + assert (discriminant >= 0).all() + + root = (2 * c) / (-b - torch.sqrt(discriminant)) + outputs = root * input_bin_widths + input_cumwidths + + theta_one_minus_theta = root * (1 - root) + denominator = input_delta + ( + (input_derivatives + input_derivatives_plus_one - 2 * input_delta) + * theta_one_minus_theta + ) + derivative_numerator = input_delta.pow(2) * ( + input_derivatives_plus_one * root.pow(2) + + 2 * input_delta * theta_one_minus_theta + + input_derivatives * (1 - root).pow(2) + ) + logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) + + return outputs, -logabsdet + else: + theta = (inputs - input_cumwidths) / input_bin_widths + theta_one_minus_theta = theta * (1 - theta) + + numerator = input_heights * ( + input_delta * theta.pow(2) + input_derivatives * theta_one_minus_theta + ) + denominator = input_delta + ( + (input_derivatives + input_derivatives_plus_one - 2 * input_delta) + * theta_one_minus_theta + ) + outputs = input_cumheights + numerator / denominator + + derivative_numerator = input_delta.pow(2) * ( + input_derivatives_plus_one * theta.pow(2) + + 2 * input_delta * theta_one_minus_theta + + input_derivatives * (1 - theta).pow(2) + ) + logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) + + return outputs, logabsdet diff --git a/weights/aether-jp/added_IVF865_Flat_nprobe_1_aether-jp_v2.index b/weights/aether-jp/added_IVF865_Flat_nprobe_1_aether-jp_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..2e56fe4ed75072d46da8b3c899cc66088c555874 --- /dev/null +++ b/weights/aether-jp/added_IVF865_Flat_nprobe_1_aether-jp_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98f6891416fb85d2040e9e6fec7f08f591870eb04ef6e9f7cc57c81f3282b6b8 +size 106580459 diff --git a/weights/aether-jp/aether-jp.pth b/weights/aether-jp/aether-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..92bd5705dbcb4d1b716024b2028c4c26add3df35 --- /dev/null +++ b/weights/aether-jp/aether-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:615a7105d7c5f307fdc7174856f0bd53a473a1ea03d21749a9903dacaec5d87c +size 57589001 diff --git a/weights/aether-jp/cover.png b/weights/aether-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..29530da623d5d5fe7096880cea767104dcb21b5c --- /dev/null +++ b/weights/aether-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eec11b3470cd570df1127d8a67ff04a966b4aa370a81a9b671f201b1f07e13c6 +size 674333 diff --git a/weights/albedo-jp/added_IVF1336_Flat_nprobe_1_albedo-jp_v2.index b/weights/albedo-jp/added_IVF1336_Flat_nprobe_1_albedo-jp_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..9c63e73ac4a794a2a19430bc677d220dc256da5a --- /dev/null +++ b/weights/albedo-jp/added_IVF1336_Flat_nprobe_1_albedo-jp_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bc741ad0bcdb73e07bdbbc4ef19263bf3acb1119ba4b63de4ea2d607ec796dc +size 164703139 diff --git a/weights/albedo-jp/albedo-jp.pth b/weights/albedo-jp/albedo-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..f309f33279dcf209367a51a22976d5dc436dd67b --- /dev/null +++ b/weights/albedo-jp/albedo-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04e6fbe4adcbf0655444055b2c4405a980663bb2b685d7e6850d4652878c81c3 +size 55224197 diff --git a/weights/albedo-jp/cover.png b/weights/albedo-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae59b02f71bd5cd6c2b6ff66b222b64d9c12122 --- /dev/null +++ b/weights/albedo-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:410eeadc05f9493faf1641ab11b3c487904014a6d9ff3790ffc9427f528a8675 +size 3148729 diff --git a/weights/alhaitham-jp/added_IVF519_Flat_nprobe_1.index b/weights/alhaitham-jp/added_IVF519_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..b9e3f0e0a84460830eb1040ce12cec430b213c58 --- /dev/null +++ b/weights/alhaitham-jp/added_IVF519_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85f6bec29b85a4943cf13fa410f5e1ed33a2aff40d65ac4be130670a01bff95a +size 21444067 diff --git a/weights/alhaitham-jp/alhaitham-jp.pth b/weights/alhaitham-jp/alhaitham-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..5f92f58c2f636cbb8d8c0e3abbd245c7ce2271fc --- /dev/null +++ b/weights/alhaitham-jp/alhaitham-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f69897b83edba6bfcb9a5dabd415b8065d2d5b831bc437351982d3d43e55d07 +size 55027589 diff --git a/weights/alhaitham-jp/cover.png b/weights/alhaitham-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..0b9d733ef0f8ac7dce98ea56480bf72ecc5a36b9 --- /dev/null +++ b/weights/alhaitham-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98c5815f3675a7ea738e60e636603ac62c73a2a17c778c34e840192dc6dd486c +size 2132294 diff --git a/weights/alhaitham-jp/total_fea.npy b/weights/alhaitham-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..7765f95b27ed770761a2616e91736472811145fe --- /dev/null +++ b/weights/alhaitham-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a5f8dd07f026a4b52bb473c48e2f528d39d4ceb75ca3bee4fbf3f3b6bd5b2f7 +size 20746368 diff --git a/weights/amber-jp/added_IVF837_Flat_nprobe_1_amber-v2_v2.index b/weights/amber-jp/added_IVF837_Flat_nprobe_1_amber-v2_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..4c8b2234180c07978a6ab957cbec29130b326b2a --- /dev/null +++ b/weights/amber-jp/added_IVF837_Flat_nprobe_1_amber-v2_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3c71b5a9843dfb300aed5813549e412df5ad6222e39e09fa37cf5057cf2e717 +size 103118539 diff --git a/weights/amber-jp/amber-jp.pth b/weights/amber-jp/amber-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..aaa31f81686809a449da278809939501c554a3dd --- /dev/null +++ b/weights/amber-jp/amber-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2404264ca151a4a506d506363c5b552b2a6ac92009d88789a509971f422459c7 +size 55223738 diff --git a/weights/amber-jp/cover.png b/weights/amber-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..1d7caa63fb6ac8da649bafc83d43974d00cc6c1b --- /dev/null +++ b/weights/amber-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fe3f1a827f51eb19be8f8d57d5926a5aec19efb2e4c0c50752a5ad18509d68b +size 177376 diff --git a/weights/ayaka-jp/added_IVF415_Flat_nprobe_6.index b/weights/ayaka-jp/added_IVF415_Flat_nprobe_6.index new file mode 100644 index 0000000000000000000000000000000000000000..d91aa1e4bedfbde4dba33cbface22865c53593be --- /dev/null +++ b/weights/ayaka-jp/added_IVF415_Flat_nprobe_6.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98a4411fb7fbe94d4878df2cc1351f15e3c0c67ac22a7671700653e82dd24373 +size 17155075 diff --git a/weights/ayaka-jp/ayaka-jp.pth b/weights/ayaka-jp/ayaka-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..bca6bc15df5238ac2a748391a01c975952844e7b --- /dev/null +++ b/weights/ayaka-jp/ayaka-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:633efdfcf421aeb3ae4df55dd6c17d1570a48b48bff6eaede078492c20d0e0f6 +size 55027130 diff --git a/weights/ayaka-jp/cover.png b/weights/ayaka-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..cb93f95ecbf18f6a786ff041d63521e119c2fd3f --- /dev/null +++ b/weights/ayaka-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fe85d2c9895d4d0010660eb42ffa154edb7e0decc97f4444ba6009c69d029c0 +size 837584 diff --git a/weights/ayaka-jp/total_fea.npy b/weights/ayaka-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..800f04c04696d823f635168eb287cc54fa13bd1f --- /dev/null +++ b/weights/ayaka-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36cda9528a9782c44637380dce3dad6e05ed27efcb94fc511dcbc66e9ab852c1 +size 16597120 diff --git a/weights/ayato-jp/added_IVF1304_Flat_nprobe_1.index b/weights/ayato-jp/added_IVF1304_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..dcf5f16795bba5f568f9e7dd12e9d7dc9acbc5a4 --- /dev/null +++ b/weights/ayato-jp/added_IVF1304_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4fd600f40f3d8ef0c490eb66d73f25f89056d982edd4f467bda6b699d13e1fca +size 53868475 diff --git a/weights/ayato-jp/ayato-jp.pth b/weights/ayato-jp/ayato-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..1d15e9ca1dec7f1d50723e97718540604948ba31 --- /dev/null +++ b/weights/ayato-jp/ayato-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6139fd4482942ab0075f08d5960d8b9b576945e6204ef2965dd3bb96ccccca4 +size 55027130 diff --git a/weights/ayato-jp/cover.png b/weights/ayato-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..218d119f8371168aa8a8edd18c2efe4910ae0bf3 --- /dev/null +++ b/weights/ayato-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77a250dad75461af6cd593e2ce8a03d9bb12e664e36b7327fcaab6151ccbf93c +size 2986782 diff --git a/weights/barbara-jp/added_IVF548_Flat_nprobe_1.index b/weights/barbara-jp/added_IVF548_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..a611f325a6bda7b747f44359b9569eebfd7fab99 --- /dev/null +++ b/weights/barbara-jp/added_IVF548_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2be7b7d0ee5d9d447271f7be807f47ac9f614138e76c1655633f39c0bd2ab588 +size 22632931 diff --git a/weights/barbara-jp/barbara-jp.pth b/weights/barbara-jp/barbara-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..26a1a888a41b6296174c6f7b8852c24a71d6d2f0 --- /dev/null +++ b/weights/barbara-jp/barbara-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19c63519ce1ecb070d128d5c894bff8c5b6ddd4bf8c216ceb0d07c2278409270 +size 55026095 diff --git a/weights/barbara-jp/cover.png b/weights/barbara-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..7b48c209a315c79818cbd83eecee6c4679cd2b66 --- /dev/null +++ b/weights/barbara-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39eb3957ffaba5501491bda93f3fd48825460219455d2bca051e355f23c5368c +size 2206352 diff --git a/weights/barbara-jp/total_fea.npy b/weights/barbara-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..0654a17cb7df8c1971731cfd4bd951c16a40f9ec --- /dev/null +++ b/weights/barbara-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78f62234c8be9ee720f6d81c8183800f74902ca6df987c2b195ad3824361bdef +size 21896320 diff --git a/weights/bennett-jp/added_IVF900_Flat_nprobe_1_benett-v2_v2.index b/weights/bennett-jp/added_IVF900_Flat_nprobe_1_benett-v2_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..f50902bf16e510a9e72cbd954ba745d4b9b08856 --- /dev/null +++ b/weights/bennett-jp/added_IVF900_Flat_nprobe_1_benett-v2_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26bddef4a5b5d77f022e902e0488da4f5d3841b6836d6cc99583598b347ff64a +size 110926339 diff --git a/weights/bennett-jp/bennett-jp.pth b/weights/bennett-jp/bennett-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..053834f12896675059db399059172f389dad7d57 --- /dev/null +++ b/weights/bennett-jp/bennett-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0ba3a39928644aa3b516a643b5eeda486bd5b32a3849828b9d24c4027631d6b +size 55224197 diff --git a/weights/bennett-jp/cover.png b/weights/bennett-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..e9a6ec3cb39e6eb9908d718bb0bf190cd892d604 --- /dev/null +++ b/weights/bennett-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59be3682cc99262ab54adcd13f66c5ccfdf0597d4150809e723b4bdd72368835 +size 310302 diff --git a/weights/candace-jp/added_IVF920_Flat_nprobe_1_candace_v2.index b/weights/candace-jp/added_IVF920_Flat_nprobe_1_candace_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..5c7e1f7d2be299b46b6e8d71da04d2461dbe108f --- /dev/null +++ b/weights/candace-jp/added_IVF920_Flat_nprobe_1_candace_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06bef32a5fcf926a92b05a35984dc40b29c4c367f91f38134a620f63293b266d +size 113402659 diff --git a/weights/candace-jp/candace-jp.pth b/weights/candace-jp/candace-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..213874970782466ced702fbffb40030c22e6650a --- /dev/null +++ b/weights/candace-jp/candace-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa51dee508f1cd9ec83b53fd9aeded03edfa645733eaa7a981ab4dd51ae27f63 +size 55216420 diff --git a/weights/candace-jp/cover.png b/weights/candace-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..2fbf97f879974dc733025a978038d66bb7444b56 --- /dev/null +++ b/weights/candace-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fee3786269ee818349474b08f13e7823b88ddc517011c99ea4a7aced2faa38f1 +size 271987 diff --git a/weights/charlotte-jp/added_IVF1318_Flat_nprobe_1_charlotte-jp_v2_400.index b/weights/charlotte-jp/added_IVF1318_Flat_nprobe_1_charlotte-jp_v2_400.index new file mode 100644 index 0000000000000000000000000000000000000000..7c747c2f56cd494b3e4f49b26b0180d66cbef30f --- /dev/null +++ b/weights/charlotte-jp/added_IVF1318_Flat_nprobe_1_charlotte-jp_v2_400.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d18fb9a5a38bba0440a740bc3b9c997dffc0d4d0d97a24cd76293ef9d48ee855 +size 162414699 diff --git a/weights/charlotte-jp/charlotte-jp.pth b/weights/charlotte-jp/charlotte-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..e06a7a6e821b9a6499f68e3a8cfb4f53c0eba907 --- /dev/null +++ b/weights/charlotte-jp/charlotte-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53fa283c1066d6cb0672ac753868941c3a0f1095412f0b65daf84c7bb7c90087 +size 57590442 diff --git a/weights/charlotte-jp/cover.png b/weights/charlotte-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..521517ba5a490cb21a89824e7a17d052680507ef --- /dev/null +++ b/weights/charlotte-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e971d7e7e3808448b6e2cd758d3b3e9eed35f73b1b5b24bf99939c9ddeab6b2 +size 380512 diff --git a/weights/childe-jp/added_IVF428_Flat_nprobe_6.index b/weights/childe-jp/added_IVF428_Flat_nprobe_6.index new file mode 100644 index 0000000000000000000000000000000000000000..d9c6476f50cae7bce3da01999ad8fc40f58fcaac --- /dev/null +++ b/weights/childe-jp/added_IVF428_Flat_nprobe_6.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4801f410ada2c2447c783db9160b414f73ebd12d7fa456a351bae3c7727120d8 +size 17688619 diff --git a/weights/childe-jp/childe-jp.pth b/weights/childe-jp/childe-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..3c273d8af3e4f2ffd96e674e713c9967bd02d3aa --- /dev/null +++ b/weights/childe-jp/childe-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c50bbeb4094fb622f74fc3481e0807e049092709ae4b877d266ab0be45303f9 +size 55027589 diff --git a/weights/childe-jp/cover.png b/weights/childe-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..2d8a667a5f6a3b7b24a310be32378a2ff7ea1bc7 --- /dev/null +++ b/weights/childe-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89f4a95e7a1fc11a5fcc066f97129871cfe5067ac9a9061181e73fbb475f188d +size 3703090 diff --git a/weights/childe-jp/total_fea.npy b/weights/childe-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..3c5ce6ae905c6ae610a7eb48fd1acdcba733e436 --- /dev/null +++ b/weights/childe-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ea1a5a8674a3122afa6f23c728c555eebfe6501700033754e47c25404167ee7 +size 17113216 diff --git a/weights/chongyun-jp/added_IVF545_Flat_nprobe_1.index b/weights/chongyun-jp/added_IVF545_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..9a3f02c33be0ffc6edf784f13f89553fa0fe1698 --- /dev/null +++ b/weights/chongyun-jp/added_IVF545_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18f276e45825f506042ac0345a6e0450f57d2b83bd76bec502caf282d7a525c2 +size 22525603 diff --git a/weights/chongyun-jp/chongyun-jp.pth b/weights/chongyun-jp/chongyun-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..52b06ea8089d2c21eeedd36a653824f57a1f510a --- /dev/null +++ b/weights/chongyun-jp/chongyun-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56885119bd878ded72a7d37226e1ec2380f2b60fea09b89c4113463b10626002 +size 55028507 diff --git a/weights/chongyun-jp/cover.png b/weights/chongyun-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef48a14b03b15ef898092755b15fe36998d37e2 --- /dev/null +++ b/weights/chongyun-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6836655797760f30ca627de4792c5b1bac15036e7123fa3f5b4892b00d77ae48 +size 7293987 diff --git a/weights/chongyun-jp/total_fea.npy b/weights/chongyun-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..191c8d44611eb64d3745f58df69fe84468daee9e --- /dev/null +++ b/weights/chongyun-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:602ed8eee37f336d283cfd579833897162fcdbb3cecebacebd16323cd322320b +size 21792896 diff --git a/weights/collei-jp/added_IVF1127_Flat_nprobe_1_collei_v2.index b/weights/collei-jp/added_IVF1127_Flat_nprobe_1_collei_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..4ffb4778a13e65a6562b4644ebcf6234d6f7bbea --- /dev/null +++ b/weights/collei-jp/added_IVF1127_Flat_nprobe_1_collei_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fed2da73c8abf97c72c4f45700baa31168b2cd7b786bd1a794fdb9ef85edb15 +size 138874259 diff --git a/weights/collei-jp/collei-jp.pth b/weights/collei-jp/collei-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..beb0ed5b14d63e852a946323032f8e85482e245b --- /dev/null +++ b/weights/collei-jp/collei-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:253515c4fbc4abd333b2e8e9f351dc0c6cd9b828905840e6f925b9892c50c305 +size 55216420 diff --git a/weights/collei-jp/cover.png b/weights/collei-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..83add9d6cb84be8862f0c6644f22016d3dade3c1 --- /dev/null +++ b/weights/collei-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f74c0d5091d9e9d27971f2f38b0f04f2973166816dc61bb2fbf427e90277836 +size 228176 diff --git a/weights/cyno-jp/added_IVF380_Flat_nprobe_1_cyno-jp_v1.index b/weights/cyno-jp/added_IVF380_Flat_nprobe_1_cyno-jp_v1.index new file mode 100644 index 0000000000000000000000000000000000000000..cb022361380ce3a8bfcd2573e5e47a6990447874 --- /dev/null +++ b/weights/cyno-jp/added_IVF380_Flat_nprobe_1_cyno-jp_v1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fa013e7086ac42099fd213e5a89281dc4272a841a946039125d07be4308c6e5 +size 15699955 diff --git a/weights/cyno-jp/cover.png b/weights/cyno-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..867d1429c5baa15a2d3be927f060c40dc54671c0 --- /dev/null +++ b/weights/cyno-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26fe49b06f770a3b6ff317ecc0892113b8a9812ee6390283dad73505589bebe1 +size 865801 diff --git a/weights/cyno-jp/cyno-jp.pth b/weights/cyno-jp/cyno-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..636e33dbd46df07c4263bf8fef88314c6cc0e32f --- /dev/null +++ b/weights/cyno-jp/cyno-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bfe9d88e0d89c6d26b3d406afa97915e12cf49c5c72af329343c2b935b07932 +size 55026095 diff --git a/weights/cyno-jp/total_fea.npy b/weights/cyno-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..d9606dd1d194b6c10c1b77427b0cbd224529f178 --- /dev/null +++ b/weights/cyno-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6490bacafecf129a3d020c72aeb3dcfe875e5cf04272314eb4793db59ec2c077 +size 15189120 diff --git a/weights/diluc-jp/added_IVF1511_Flat_nprobe_1.index b/weights/diluc-jp/added_IVF1511_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..6ef4c99954f74d0b86064d66071c4af0ba02d9b5 --- /dev/null +++ b/weights/diluc-jp/added_IVF1511_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e2a2500a55fb9c888f75af94f7fef54e2efbb453e8294f9bcda4f84ae4ca5dd +size 62405179 diff --git a/weights/diluc-jp/cover.png b/weights/diluc-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..91f909d5b187d796edb9c4053af84af6c3fc5cd9 --- /dev/null +++ b/weights/diluc-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bff8978711329395eedc7b4d3b8aeaea043d4dbea6c7c2f4668132b8abfe5adf +size 1229695 diff --git a/weights/diluc-jp/diluc-jp.pth b/weights/diluc-jp/diluc-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..a4c9144d3a667d8ccb1354b5122e47acccd93d5b --- /dev/null +++ b/weights/diluc-jp/diluc-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8d2324a1c31d9e5516c807e0ab5c560fb5bf080be74f8a3849809b126d4b1dc +size 55027130 diff --git a/weights/eula-jp/added_IVF2219_Flat_nprobe_1.index b/weights/eula-jp/added_IVF2219_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..c3485f75dc13800484f6fb28fd777dcc35f64827 --- /dev/null +++ b/weights/eula-jp/added_IVF2219_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b315239e25bc0e71239d5b825618a2d7c16af9a87d36a1f84a2a5c31e48be861 +size 91614907 diff --git a/weights/eula-jp/cover.png b/weights/eula-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..9845fd5be1494c0fec008afdf50438075fe863f4 --- /dev/null +++ b/weights/eula-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e865a7dfd1b35c6851b8707a7a7cfcdff10802c6ee645179e467b02fda83fb9 +size 2659755 diff --git a/weights/eula-jp/eula-jp.pth b/weights/eula-jp/eula-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..6ff9bd077625f0399675e3b0a4322bc45df64073 --- /dev/null +++ b/weights/eula-jp/eula-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b806e046ee5485ea42522b7f1df79e64e7bec7a248cf8dda21a85a86cfd88054 +size 55026095 diff --git a/weights/faruzan-jp/added_IVF256_Flat_nprobe_1_faruzan-jp_v2.index b/weights/faruzan-jp/added_IVF256_Flat_nprobe_1_faruzan-jp_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..8993dea9636dfcace30ee4b15260a8cd98b1b444 --- /dev/null +++ b/weights/faruzan-jp/added_IVF256_Flat_nprobe_1_faruzan-jp_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de4875ecdb7a22a8f54ea1fe897edf8b147eb0dfc9372f104b6706e0ab338c14 +size 31588619 diff --git a/weights/faruzan-jp/cover.png b/weights/faruzan-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..e57fd8a6e8498688b5a63a64679fff2921f1ff80 --- /dev/null +++ b/weights/faruzan-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b654797aa533f9580a1f24bec4483bfbcc57a37289368001b98ed2b57a4d570c +size 392510 diff --git a/weights/faruzan-jp/faruzan-jp.pth b/weights/faruzan-jp/faruzan-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..f8b0218da332e3d215bf65672fae49c3ac306a4c --- /dev/null +++ b/weights/faruzan-jp/faruzan-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57164f27f40b4566d5d2e801dc6b89fce48c76354ca8af15e9c600901442f795 +size 57589524 diff --git a/weights/fischl-jp/added_IVF1225_Flat_nprobe_1.index b/weights/fischl-jp/added_IVF1225_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..12914076f7d483bdae076b4cb28916d52bbae742 --- /dev/null +++ b/weights/fischl-jp/added_IVF1225_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0cb77f4db13ba45f4d48f711ad3c9e13159b9e8ff7b5e8ff0ac705ad0ed3bad4 +size 50599099 diff --git a/weights/fischl-jp/cover.png b/weights/fischl-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..fb68b848519d22658b5c7623d9052360286a1e72 --- /dev/null +++ b/weights/fischl-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52ebc66caf1fb853652ecaee99be63c1383e7c8869e4c4d006c52805383db7d4 +size 214329 diff --git a/weights/fischl-jp/fischl-jp.pth b/weights/fischl-jp/fischl-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..0a07b61434dc0bf92ccfd5b51c2dad7bffb053b7 --- /dev/null +++ b/weights/fischl-jp/fischl-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28c04e4cd0ddb1abc8a3d0ad0b7aea94fba37b9ef5903e2f4e8c2e62015844f5 +size 55027589 diff --git a/weights/ganyu-jp/added_IVF1636_Flat_nprobe_1.index b/weights/ganyu-jp/added_IVF1636_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..8a1e5da0adc6ef4a8a295a5f505e3a9db51af309 --- /dev/null +++ b/weights/ganyu-jp/added_IVF1636_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bee4d6ad7b7f8f0739b3f3f27639b8da7f9ad6fa216e10e98cf933505fe745c5 +size 67551763 diff --git a/weights/ganyu-jp/cover.png b/weights/ganyu-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..7091081ea93806674376f643a44086f2ad567629 --- /dev/null +++ b/weights/ganyu-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03e153e8941af764c7381d9ba6580b24b67a10a5cb2342a9f7f39895b159939b +size 190367 diff --git a/weights/ganyu-jp/ganyu-jp.pth b/weights/ganyu-jp/ganyu-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..d7a0de68257a6fc8f8af5c48ed9638d530cb78e0 --- /dev/null +++ b/weights/ganyu-jp/ganyu-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70e71be2ae8ce8929a3a1e95dfa7f6a5c15d7c8a0854ea2bdaf36cf5aaf266b5 +size 55027130 diff --git a/weights/heizou-jp/added_IVF466_Flat_nprobe_1_heizou-jp_v1.index b/weights/heizou-jp/added_IVF466_Flat_nprobe_1_heizou-jp_v1.index new file mode 100644 index 0000000000000000000000000000000000000000..94f8c679c8ecc6782f999c1a27e83c6afd583aed --- /dev/null +++ b/weights/heizou-jp/added_IVF466_Flat_nprobe_1_heizou-jp_v1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:646274e8ca826094651422679b72f345a9c74e7a8da7e3cd1f92bb4b4b5e4812 +size 19270675 diff --git a/weights/heizou-jp/cover.png b/weights/heizou-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..1286c38020b758f2f17e84e1b9270291ee377e19 --- /dev/null +++ b/weights/heizou-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1705f8de0802a3b4010f30376fbaf2aad566400a71cb194730de9cd150be99aa +size 655834 diff --git a/weights/heizou-jp/heizou-jp.pth b/weights/heizou-jp/heizou-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..85f108f995df0e8e20ea08d36b5cbcec1dd772ac --- /dev/null +++ b/weights/heizou-jp/heizou-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:069502645d5790d7598f971450fbfffbcc9927bd55b262b7c54010d5507fd622 +size 55027589 diff --git a/weights/heizou-jp/total_fea.npy b/weights/heizou-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..57b2385801eb5b9c120e911d23007b9d8c55445a --- /dev/null +++ b/weights/heizou-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:196d069595f6c9471eb5cc5b97916597f3df7450ec4ecb6a58d1b2e1cbc875c0 +size 18644096 diff --git a/weights/hutao-jp/added_IVF265_Flat_nprobe_5.index b/weights/hutao-jp/added_IVF265_Flat_nprobe_5.index new file mode 100644 index 0000000000000000000000000000000000000000..b11623d9924d8f802bb4dcb6aa4e12bc4d557720 --- /dev/null +++ b/weights/hutao-jp/added_IVF265_Flat_nprobe_5.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1250005b613d5ffb368da9f93fbde733074757cdba9fb1fd04aa1f286b883e0a +size 10962043 diff --git a/weights/hutao-jp/cover.png b/weights/hutao-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..2679b51ee930530f9b541a16c884d5985814eb8c --- /dev/null +++ b/weights/hutao-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d7f42be2e382feec5ed0345196473715ef5be0c9ac68628dc77e75fae0e7316 +size 6616541 diff --git a/weights/hutao-jp/hutao-jp.pth b/weights/hutao-jp/hutao-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..75c2dd4bc0448275dc059299dca3d9c31a5a679f --- /dev/null +++ b/weights/hutao-jp/hutao-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52ae0bd715c555b8e0072bc98bf4b462aab42b93a48307652e7a9164a0539990 +size 55027130 diff --git a/weights/hutao-jp/total_fea.npy b/weights/hutao-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..bf396316f4cb1eabab289f6749d7959ac5856c49 --- /dev/null +++ b/weights/hutao-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e6c6687b5d0881113a54ca53b0486292538853c6a6488c702bf94d991b7aec5 +size 10605696 diff --git a/weights/itto-jp/added_IVF4454_Flat_nprobe_1_itto-jp_v2.index b/weights/itto-jp/added_IVF4454_Flat_nprobe_1_itto-jp_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..918ce7b8510c9a8710440b9c3ce57e179f40932d --- /dev/null +++ b/weights/itto-jp/added_IVF4454_Flat_nprobe_1_itto-jp_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:449be981798328db47a934432bafb22475f5d7cff4e4ce0688c15731cbe7cd49 +size 548843819 diff --git a/weights/itto-jp/cover.png b/weights/itto-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd4bc8b74aa53b35805331d8a94647099150fe7 --- /dev/null +++ b/weights/itto-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca9c27a5d1bf6d5a91b5c077d6ec533d727cb8650288c962e92d8d3cbeacebb9 +size 1964620 diff --git a/weights/itto-jp/itto-jp.pth b/weights/itto-jp/itto-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..56530f8d9e835a259bc57c6200cb6b8d873b5c9e --- /dev/null +++ b/weights/itto-jp/itto-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9307e39f5d55608f0f76107a9cff19bea8f9e456c9932b735aaf87234b632e1e +size 55228787 diff --git a/weights/kaeya-jp/added_IVF1655_Flat_nprobe_1.index b/weights/kaeya-jp/added_IVF1655_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..bb6bd1cd3fe27464f5bd63edb5c27817d9602922 --- /dev/null +++ b/weights/kaeya-jp/added_IVF1655_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1afba8e77f937bf76bd10f54fcbb4ca119dc3b2c599dc4cbf0843d618c26ad15 +size 68325763 diff --git a/weights/kaeya-jp/cover.png b/weights/kaeya-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..db149827664a46b4552b93dac4df82d8d0c2c118 --- /dev/null +++ b/weights/kaeya-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4b12f3c2ce55d28d8cadcd17464d0922e55aac37495654a7bcfbb03c8beffd5 +size 623087 diff --git a/weights/kaeya-jp/kaeya-jp.pth b/weights/kaeya-jp/kaeya-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..ede481f507e03d309edfa9afefbf538c01a72f59 --- /dev/null +++ b/weights/kaeya-jp/kaeya-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6492cc522ecaef80436bae3ebdb6e6bd9e6242dc6be74c4e6283c7825285d480 +size 55027130 diff --git a/weights/kaveh-jp/added_IVF4967_Flat_nprobe_1_kaveh-jp_v2.index b/weights/kaveh-jp/added_IVF4967_Flat_nprobe_1_kaveh-jp_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..29941bb80bb666823516c68f6db7483c80100739 --- /dev/null +++ b/weights/kaveh-jp/added_IVF4967_Flat_nprobe_1_kaveh-jp_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:964f5e602826c7d276468918bf9848d0adee099753e5f4fd12db49f176a61792 +size 611943779 diff --git a/weights/kaveh-jp/added_IVF613_Flat_nprobe_1_kaveh_v2_v2.index b/weights/kaveh-jp/added_IVF613_Flat_nprobe_1_kaveh_v2_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..b8c31afd3979e86fba9650c61ab181f8b3510007 --- /dev/null +++ b/weights/kaveh-jp/added_IVF613_Flat_nprobe_1_kaveh_v2_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ae118c5f5e5cdd1b0e37e7b46c95428e7d5305cb5f2708dbb8954a53ddafc07 +size 75540219 diff --git a/weights/kaveh-jp/cover.png b/weights/kaveh-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..fb653c6de451001a776bde68b184bc74634e9673 --- /dev/null +++ b/weights/kaveh-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b95bb4f18577150d55bf366b2c93e2475f5110c3ab460f09692e8636144649b9 +size 292685 diff --git a/weights/kaveh-jp/kaveh-jp.pth b/weights/kaveh-jp/kaveh-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..06de63235666319a4eb27cfc016019e6ad25052a --- /dev/null +++ b/weights/kaveh-jp/kaveh-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0731c70f58b771ce4edd2dc145e026ef3103f1e313bb3cdfac4fc67668fc1e7f +size 57583034 diff --git a/weights/kazuha-jp/added_IVF677_Flat_nprobe_7.index b/weights/kazuha-jp/added_IVF677_Flat_nprobe_7.index new file mode 100644 index 0000000000000000000000000000000000000000..932bd064bf70acaadc761da45a986ae7c1426552 --- /dev/null +++ b/weights/kazuha-jp/added_IVF677_Flat_nprobe_7.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47d1f762e5d990d317ee7fb7d18190a37d6a7169ededd726b912b013c67fa20f +size 27970435 diff --git a/weights/kazuha-jp/cover.png b/weights/kazuha-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..afe44007a48d63de51cbffc9b5e62fd073c14a2d --- /dev/null +++ b/weights/kazuha-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db361de17f6d33684be140dfedd74794dec79b85df97ba7595b3755680139f57 +size 5805839 diff --git a/weights/kazuha-jp/kazuha-jp.pth b/weights/kazuha-jp/kazuha-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..7507702fe3bf2b6c8ec207add11c65b5e19b6c22 --- /dev/null +++ b/weights/kazuha-jp/kazuha-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d69c9c77250cff7c47a74de33ac11089ccc41122f7a5461b77f14f28738dd7e7 +size 55027589 diff --git a/weights/kazuha-jp/total_fea.npy b/weights/kazuha-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..968b678ead5fe3f2163a08541fe825eb3e2d8e60 --- /dev/null +++ b/weights/kazuha-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f8bd3cc84c5e8230f4631dac4839b922f0b4e726b325813bc75773e19a2f19f +size 27060352 diff --git a/weights/keqing-jp/added_IVF1634_Flat_nprobe_1.index b/weights/keqing-jp/added_IVF1634_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..0ea872cc5dafa0a10aa7a80127ff81ccc944d680 --- /dev/null +++ b/weights/keqing-jp/added_IVF1634_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9937fc19ea1cfd7ce88478ebb746f7e41522ca9562bc33b81478a61843ae43ae +size 67465075 diff --git a/weights/keqing-jp/cover.png b/weights/keqing-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..221015d8650b9967ba3ee3b51d7d811359e59a98 --- /dev/null +++ b/weights/keqing-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af5af757312915725a637d3e26af82be378ed2af18cfc2ed498207d7c948b0c3 +size 2106388 diff --git a/weights/keqing-jp/keqing-jp.pth b/weights/keqing-jp/keqing-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..5a58ae9d1f0f740cdc3e556959d64ca33f9272ef --- /dev/null +++ b/weights/keqing-jp/keqing-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b0f2587bd933a2933364224b134fd6bd63cc9434c215f7f94adae46daa0ca90 +size 55027589 diff --git a/weights/kirara-jp/added_IVF672_Flat_nprobe_1.index b/weights/kirara-jp/added_IVF672_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..951570e9d8fb09751f0b2d2feffc766d7a788068 --- /dev/null +++ b/weights/kirara-jp/added_IVF672_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d81665d33cf0b15b259a9142280a82869170b50fc99a70d90a4cb535b14d6115 +size 27741331 diff --git a/weights/kirara-jp/cover.png b/weights/kirara-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..257f6f330b843af640f411dcbdc9ce7b1f4af2fd --- /dev/null +++ b/weights/kirara-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:742a99d20fa0d2c3cae65907bae912c8d9edcf8015a3c1a084456127e8eb55a7 +size 330959 diff --git a/weights/kirara-jp/kirara-jp.pth b/weights/kirara-jp/kirara-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..6f48325ec973bc35364ec4be614ad6ddccc76855 --- /dev/null +++ b/weights/kirara-jp/kirara-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c444de82a81661354f96fd203f0f6535157abcb46e93bbb6bc5e19098fbdba9a +size 55019812 diff --git a/weights/kirara-jp/total_fea.npy b/weights/kirara-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..aaaabc66e369a850703accd52cffebd392e0cdf3 --- /dev/null +++ b/weights/kirara-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7c09bf1ef996bc4ec9ba26138a2baf9b4355d38a0c77b78d3a85ad445caab1f +size 26838144 diff --git a/weights/klee-jp/added_IVF282_Flat_nprobe_5.index b/weights/klee-jp/added_IVF282_Flat_nprobe_5.index new file mode 100644 index 0000000000000000000000000000000000000000..f3de57e253545ac0fa97bde6e448dc24f71a8382 --- /dev/null +++ b/weights/klee-jp/added_IVF282_Flat_nprobe_5.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bfb669f7b701d8bebb49660eaa50b6cfb1bae59d43e82ad054f1ffed73fcac2 +size 11671027 diff --git a/weights/klee-jp/cover.png b/weights/klee-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..0da6b6af0eb1d9e11a917ee007215dfdaa00222b --- /dev/null +++ b/weights/klee-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c30ca76b76807992b11f27ee49d0f1aa80ac81da6c9b1b60d2d2a3e75f609752 +size 3242773 diff --git a/weights/klee-jp/klee-jp.pth b/weights/klee-jp/klee-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..a3377722569ccc0f6364052f799d9240d4ae0e90 --- /dev/null +++ b/weights/klee-jp/klee-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:054e796c9c1214d400847e51cfc25f0f39bfd50437d1e8f001051d426303bbea +size 55026095 diff --git a/weights/klee-jp/total_fea.npy b/weights/klee-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..f330c0cb715f633160b567ad03927694a283329e --- /dev/null +++ b/weights/klee-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:070407ecc7c8b125c8f68723d579c5e002b37e21ec85cda096000f5c18b56bb0 +size 11291776 diff --git a/weights/kokomi-jp/added_IVF1723_Flat_nprobe_1.index b/weights/kokomi-jp/added_IVF1723_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..d67370301e7173cc830d0ba0977208928a358dbf --- /dev/null +++ b/weights/kokomi-jp/added_IVF1723_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5762d6c5e9d147844b1c6eda0ecd16595b7a33d77607e9d2b729e1dd0a0fc87f +size 71141059 diff --git a/weights/kokomi-jp/cover.png b/weights/kokomi-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..841330eca26152b1d21fd1c0ff561463f54d003d --- /dev/null +++ b/weights/kokomi-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebb00e1c70bdacfb5660333ce1f8d19e81e0b3c4dde9bb44bb2eeac0e6cfe3aa +size 292883 diff --git a/weights/kokomi-jp/kokomi-jp.pth b/weights/kokomi-jp/kokomi-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..5fb6249156c2fc3c70da8cc33726c71534edd2bb --- /dev/null +++ b/weights/kokomi-jp/kokomi-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bcd3d8988f86503cbec98170cd97da4a0187f9f603385a563ca0dc3d7758ba4 +size 55027589 diff --git a/weights/layla-jp/added_IVF1099_Flat_nprobe_1_layla-v2_v2.index b/weights/layla-jp/added_IVF1099_Flat_nprobe_1_layla-v2_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..530db8295de2a4f63b62d06531def25c0a542079 --- /dev/null +++ b/weights/layla-jp/added_IVF1099_Flat_nprobe_1_layla-v2_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83681f693197d19cff135daa155ea4c4d0d302f461473573dbdf55072e108209 +size 135501659 diff --git a/weights/layla-jp/cover.png b/weights/layla-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..f31e744b552ab938628ded8d63dce667b88cda40 --- /dev/null +++ b/weights/layla-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bbf868f3e8e6998416e8ed0f844d156c2c6566366636c03a1549fca8bab5cd6 +size 311684 diff --git a/weights/layla-jp/layla-jp.pth b/weights/layla-jp/layla-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..fef4b13476b9e5ebf931b43df2fbb8893fe4de1b --- /dev/null +++ b/weights/layla-jp/layla-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3921520217fdbd60dbeaa0dfacde610171a7417d27d656afafc33086d9d4b95 +size 55223738 diff --git a/weights/lisa-jp/added_IVF758_Flat_nprobe_1_lisa_v2.index b/weights/lisa-jp/added_IVF758_Flat_nprobe_1_lisa_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..3c6115f8e1d56b585176d255d1eb0b8eb7e204e0 --- /dev/null +++ b/weights/lisa-jp/added_IVF758_Flat_nprobe_1_lisa_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1104ddc0bf73c98a8d69496535e0055385266315b54aacd016ea8d970e08b742 +size 93468899 diff --git a/weights/lisa-jp/cover.png b/weights/lisa-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..033942fb314b6c228e90d51f397c3320be5d2a92 --- /dev/null +++ b/weights/lisa-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b07cbc5378f35950da17667ec6d23fab426b30e5bd8eed70811534045b781dd9 +size 291648 diff --git a/weights/lisa-jp/lisa-jp.pth b/weights/lisa-jp/lisa-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..18f20d057572fa660992242e29ec440d91284f28 --- /dev/null +++ b/weights/lisa-jp/lisa-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f70b41090008cffa4d8d4f6eebcb9319f79587aeb15b84a0e4e8c72a7c8336dc +size 55192782 diff --git a/weights/lumine-jp/added_IVF1165_Flat_nprobe_1_lumine-v2-new_v2.index b/weights/lumine-jp/added_IVF1165_Flat_nprobe_1_lumine-v2-new_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..a4c39ed4161518e5cf6c8592f9612f981efd49c7 --- /dev/null +++ b/weights/lumine-jp/added_IVF1165_Flat_nprobe_1_lumine-v2-new_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:671ed09251150cbdf54bd46983a22d399c32256e6a83b50fa3e1e207c316d986 +size 143555859 diff --git a/weights/lumine-jp/cover.png b/weights/lumine-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae170ff5e91403574d09c708f04b555fb4d4508 --- /dev/null +++ b/weights/lumine-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fb57ac1dbc9f3022581dc4776118239a6751734129c05ca30746e0bf5d9fb30 +size 285892 diff --git a/weights/lumine-jp/lumine-jp.pth b/weights/lumine-jp/lumine-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..a744dbc4ffbf5eabac7e52cbee5310dff470e22b --- /dev/null +++ b/weights/lumine-jp/lumine-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89811f0885b7dee838597a9ad1bfff306f1a0918a7902001cff4a6c6a0bd0b47 +size 55226033 diff --git a/weights/model_info.json b/weights/model_info.json new file mode 100644 index 0000000000000000000000000000000000000000..4a6320aa5d96f443c830c1b045ed86c42fa675c3 --- /dev/null +++ b/weights/model_info.json @@ -0,0 +1,437 @@ +{ + "aether-jp": { + "enable": true, + "model_path": "aether-jp.pth", + "title": "Genshin Impact - Aether", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF865_Flat_nprobe_1_aether-jp_v2.index", + "author":"ArkanDash" + }, + "albedo-jp": { + "enable": true, + "model_path": "albedo-jp.pth", + "title": "Genshin Impact - Albedo", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1336_Flat_nprobe_1_albedo-jp_v2.index", + "author":"KarmKarma" + }, + "alhaitham-jp": { + "enable": true, + "model_path": "alhaitham-jp.pth", + "title": "Genshin Impact - Alhaitham", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF519_Flat_nprobe_1.index", + "author":"NMEX" + }, + "amber-jp": { + "enable": true, + "model_path": "amber-jp.pth", + "title": "Genshin Impact - Amber", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF837_Flat_nprobe_1_amber-v2_v2.index", + "author": "HirumiM" + }, + "ayaka-jp": { + "enable": true, + "model_path": "ayaka-jp.pth", + "title": "Genshin Impact - Kamisato Ayaka", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF415_Flat_nprobe_6.index", + "feature_file": "total_fea.npy", + "author":"Ardha" + }, + "ayato-jp": { + "enable": true, + "model_path": "ayato-jp.pth", + "title": "Genshin Impact - Kamisato Ayato", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1304_Flat_nprobe_1.index", + "author":"ArkanDash" + }, + "barbara-jp": { + "enable": true, + "model_path": "barbara-jp.pth", + "title": "Genshin Impact - Barbara", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF548_Flat_nprobe_1.index", + "feature_file": "total_fea.npy", + "author":"firzaelbuho" + }, + "bennett-jp": { + "enable": true, + "model_path": "bennett-jp.pth", + "title": "Genshin Impact - Bennett", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF900_Flat_nprobe_1_benett-v2_v2.index", + "author": "HirumiM" + }, + "candace-jp": { + "enable": true, + "model_path": "candace-jp.pth", + "title": "Genshin Impact - Candace", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF920_Flat_nprobe_1_candez_v2.index", + "author": "Mocci24" + }, + "charlotte-jp": { + "enable": true, + "model_path": "charlotte-jp.pth", + "title": "Genshin Impact - Charlotte", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1318_Flat_nprobe_1_charlotte-jp_v2_400.index", + "author":"ArkanDash" + }, + "childe-jp": { + "enable": true, + "model_path": "childe-jp.pth", + "title": "Genshin Impact - Ajax, aka Tartaglia or 'Childe'", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF428_Flat_nprobe_6.index", + "feature_file": "total_fea.npy", + "author":"Ardha" + }, + "chongyun-jp": { + "enable": true, + "model_path": "chongyun-jp.pth", + "title": "Genshin Impact - Chongyun", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF545_Flat_nprobe_1.index", + "feature_file": "total_fea.npy", + "author":"Eugenia" + }, + "collei-jp": { + "enable": true, + "model_path": "collei-jp.pth", + "title": "Genshin Impact - Collei", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1127_Flat_nprobe_1_collei_v2.index", + "author": "HirumiM" + }, + "cyno-jp": { + "enable": true, + "model_path": "cyno-jp.pth", + "title": "Genshin Impact - Cyno", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF380_Flat_nprobe_1_cyno-jp_v1.index", + "feature_file": "total_fea.npy", + "author":"KarmKarma" + }, + "diluc-jp": { + "enable": true, + "model_path": "diluc-jp.pth", + "title": "Genshin Impact - Diluc", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1511_Flat_nprobe_1.index", + "author":"ArkanDash" + }, + "eula-jp": { + "enable": true, + "model_path": "eula-jp.pth", + "title": "Genshin Impact - Eula", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF2219_Flat_nprobe_1.index", + "author":"ArkanDash" + }, + "faruzan-jp": { + "enable": true, + "model_path": "faruzan-jp.pth", + "title": "Genshin Impact - Faruzan", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF256_Flat_nprobe_1_faruzan-jp_v2.index", + "author":"ArkanDash" + }, + "fischl-jp": { + "enable": true, + "model_path": "fischl-jp.pth", + "title": "Genshin Impact - Fischl", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1225_Flat_nprobe_1.index", + "author":"ArkanDash" + }, + "ganyu-jp": { + "enable": true, + "model_path": "ganyu-jp.pth", + "title": "Genshin Impact - Ganyu", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1636_Flat_nprobe_1.index", + "author":"ArkanDash" + }, + "heizou-jp": { + "enable": true, + "model_path": "heizou-jp.pth", + "title": "Genshin Impact - Heizou", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF466_Flat_nprobe_1_heizou-jp_v1.index", + "feature_file": "total_fea.npy", + "author":"KarmKarma" + }, + "hutao-jp": { + "enable": true, + "model_path": "hutao-jp.pth", + "title": "Genshin Impact - Hu Tao", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF265_Flat_nprobe_5.index", + "feature_file": "total_fea.npy", + "author":"Ardha" + }, + "itto-jp": { + "enable": true, + "model_path": "itto-jp.pth", + "title": "Genshin Impact - Itto", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF4454_Flat_nprobe_1_itto-jp_v2.index", + "author":"ArkanDash" + }, + "kaeya-jp": { + "enable": true, + "model_path": "kaeya-jp.pth", + "title": "Genshin Impact - Kaeya", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1655_Flat_nprobe_1.index", + "author":"ArkanDash" + }, + "kaveh-jp": { + "enable": true, + "model_path": "kaveh-jp.pth", + "title": "Genshin Impact - Kaveh", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF4967_Flat_nprobe_1_kaveh-jp_v2.index", + "author":"ArkanDash" + }, + "kazuha-jp": { + "enable": true, + "model_path": "kazuha-jp.pth", + "title": "Genshin Impact - Kaedehara Kazuha", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF677_Flat_nprobe_7.index", + "feature_file": "total_fea.npy", + "author":"Ardha" + }, + "keqing-jp": { + "enable": true, + "model_path": "keqing-jp.pth", + "title": "Genshin Impact - Keqing", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1634_Flat_nprobe_1.index", + "author":"ArkanDash" + }, + "kirara-jp": { + "enable": true, + "model_path": "kirara-jp.pth", + "title": "Genshin Impact - Kirara", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF672_Flat_nprobe_1.index", + "feature_file": "total_fea.npy", + "author":"Mocci24" + }, + "klee-jp": { + "enable": true, + "model_path": "klee-jp.pth", + "title": "Genshin Impact - Klee", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF282_Flat_nprobe_5.index", + "feature_file": "total_fea.npy", + "author":"Ardha" + }, + "kokomi-jp": { + "enable": true, + "model_path": "kokomi-jp.pth", + "title": "Genshin Impact - Sangonomiya Kokomi", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1723_Flat_nprobe_1.index", + "author":"ArkanDash" + }, + "layla-jp": { + "enable": true, + "model_path": "layla-jp.pth", + "title": "Genshin Impact - Layla", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1099_Flat_nprobe_1_layla-v2_v2.index", + "author": "HirumiM" + }, + "lisa-jp": { + "enable": true, + "model_path": "lisa-jp.pth", + "title": "Genshin Impact - Lisa", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF758_Flat_nprobe_1_lisa_v2.index", + "author": "Mocci24" + }, + "lumine-jp": { + "enable": true, + "model_path": "lumine-jp.pth", + "title": "Genshin Impact - Lumine", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1165_Flat_nprobe_1_lumine-v2-new_v2.index", + "author":"HirumiM" + }, + "mona-jp": { + "enable": true, + "model_path": "mona-jp.pth", + "title": "Genshin Impact - Mona", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF2165_Flat_nprobe_1.index", + "author":"ArkanDash" + }, + "nahida-jp": { + "enable": true, + "model_path": "nahida-jp.pth", + "title": "Genshin Impact - Nahida", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF265_Flat_nprobe_5.index", + "feature_file": "total_fea.npy", + "author":"Ardha" + }, + "nilou-jp": { + "enable": true, + "model_path": "nilou-jp.pth", + "title": "Genshin Impact - Nilou", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF218_Flat_nprobe_1.index", + "feature_file": "total_fea.npy", + "author":"ArkanDash" + }, + "noelle-jp": { + "enable": true, + "model_path": "noelle-jp.pth", + "title": "Genshin Impact - Noelle", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF3498_Flat_nprobe_1_noelle-jp_v2.index", + "author":"ArkanDash" + }, + "paimon-jp": { + "enable": true, + "model_path": "paimon-jp.pth", + "title": "Genshin Impact - Paimon", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF3904_Flat_nprobe_1_paimon-jp_v2.index", + "author":"ArkanDash" + }, + "raiden-jp": { + "enable": true, + "model_path": "raiden-jp.pth", + "title": "Genshin Impact - Raiden Shogun", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF783_Flat_nprobe_7.index", + "feature_file": "total_fea.npy", + "author":"Ardha" + }, + "shinobu-jp": { + "enable": true, + "model_path": "shinobu-jp.pth", + "title": "Genshin Impact - Kuki Shinobu", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF4218_Flat_nprobe_1_shinobu-jp_v2.index", + "author": "ArkanDash" + }, + "signora-jp": { + "enable": true, + "model_path": "signora-jp.pth", + "title": "Genshin Impact - Rosalyne-Kruzchka Lohefalter, aka La Signora or 'The Fair Lady'", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF478_Flat_nprobe_1_signora-jp_v2.index", + "author":"ArkanDash" + }, + "sucrose-jp": { + "enable": true, + "model_path": "sucrose-jp.pth", + "title": "Genshin Impact - Sucrose", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF884_Flat_nprobe_1.index", + "feature_file": "total_fea.npy", + "author":"Mocci24" + }, + "thoma-jp": { + "enable": true, + "model_path": "thoma-jp.pth", + "title": "Genshin Impact - Thoma", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF366_Flat_nprobe_1.index", + "feature_file": "total_fea.npy", + "author":"Eugenia" + }, + "tighnari-jp": { + "enable": true, + "model_path": "tighnari-jp.pth", + "title": "Genshin Impact - Tighnari", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF446_Flat_nprobe_1_tignari-jp_v1.index", + "feature_file": "total_fea.npy", + "author":"KarmKarma" + }, + "venti-jp": { + "enable": true, + "model_path": "venti-jp.pth", + "title": "Genshin Impact - Venti", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF3591_Flat_nprobe_1_venti-jp_v2.index", + "author":"ArkanDash" + }, + "wanderer-jp": { + "enable": true, + "model_path": "wanderer-jp.pth", + "title": "Genshin Impact - Wanderer", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF128_Flat_nprobe_4.index", + "feature_file": "total_fea.npy", + "author":"Ardha" + }, + "xiao-jp": { + "enable": true, + "model_path": "xiao-jp.pth", + "title": "Genshin Impact - Xiao", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF233_Flat_nprobe_5.index", + "feature_file": "total_fea.npy", + "author":"Ardha" + }, + "xinyan-jp": { + "enable": true, + "model_path": "xinyan-jp.pth", + "title": "Genshin Impact - Xinyan", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF971_Flat_nprobe_1_xinyan_v2.index", + "author": "HirumiM" + }, + "yae-jp": { + "enable": true, + "model_path": "yae-jp.pth", + "title": "Genshin Impact - Yae Miko", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF935_Flat_nprobe_1.index", + "feature_file": "total_fea.npy", + "author":"Ardha" + }, + "yanfei-jp": { + "enable": true, + "model_path": "yanfei-jp.pth", + "title": "Genshin Impact - Yanfei", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1271_Flat_nprobe_1_yanfei-v2_v2.index", + "author": "HirumiM" + }, + "yelan-jp": { + "enable": true, + "model_path": "yelan-jp.pth", + "title": "Genshin Impact - Yelan", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF2051_Flat_nprobe_1.index", + "author":"ArkanDash" + }, + "yoimiya-jp": { + "enable": true, + "model_path": "yoimiya-jp.pth", + "title": "Genshin Impact - Yoimiya", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF2034_Flat_nprobe_1.index", + "author":"ArkanDash" + }, + "zhongli-jp": { + "enable": true, + "model_path": "zhongli-jp.pth", + "title": "Genshin Impact - Zhongli", + "cover": "cover.png", + "feature_retrieval_library": "added_IVF1672_Flat_nprobe_1.index", + "author":"ArkanDash" + } +} \ No newline at end of file diff --git a/weights/mona-jp/added_IVF2165_Flat_nprobe_1.index b/weights/mona-jp/added_IVF2165_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..3c0be5910c81908a2e996ef20df2ee30c58ef6d2 --- /dev/null +++ b/weights/mona-jp/added_IVF2165_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f1b5f79673815bfe59bd02176e36a736890728db6e7a4d08a78ae164ffc1bcf +size 89383723 diff --git a/weights/mona-jp/cover.png b/weights/mona-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..367715bc261c5954f6b150bcf9748804393cd875 --- /dev/null +++ b/weights/mona-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:850d09a002fc645e45b097cedf3f05ee4db1b403e7f522525bb90be58c3e9a9f +size 2756373 diff --git a/weights/mona-jp/mona-jp.pth b/weights/mona-jp/mona-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..52eceb875676d3550e9a8135af956598e41544ad --- /dev/null +++ b/weights/mona-jp/mona-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d334231959d3eb9183f41d9d013136bc7163029f9fe2a44dc57487ecbb862188 +size 55124473 diff --git a/weights/nahida-jp/added_IVF265_Flat_nprobe_5.index b/weights/nahida-jp/added_IVF265_Flat_nprobe_5.index new file mode 100644 index 0000000000000000000000000000000000000000..6f8a20c89e5d9c77ed2d9c0e9290d919717eea29 --- /dev/null +++ b/weights/nahida-jp/added_IVF265_Flat_nprobe_5.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:223ac68eca791ce8ce7aaa4f56fcf3d7ddd9e5145f709a017191b0c9720daead +size 10942435 diff --git a/weights/nahida-jp/cover.png b/weights/nahida-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..162a0f6a2eb70db75f6deff67fac3a3c99c26f14 --- /dev/null +++ b/weights/nahida-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a40241729e26adf2d3500fd74e1a9fb082ef52578bf5dd7af4534aeac6089108 +size 5963743 diff --git a/weights/nahida-jp/nahida-jp.pth b/weights/nahida-jp/nahida-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..9186a0873944daebe3c4153fbfd0ae39477be3c3 --- /dev/null +++ b/weights/nahida-jp/nahida-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c598ebc6b4a2f2f4dfb5a9e46851ffd2e20b9f8adf2743fc88db11fc3836748c +size 55027589 diff --git a/weights/nahida-jp/total_fea.npy b/weights/nahida-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..9c60e76c88f8e2a575a35a4e49dbe5a0788af918 --- /dev/null +++ b/weights/nahida-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8552383d1feae96bdea2008261709de4ffd9ae2beebafcf519d3fe8f1e18b598 +size 10586240 diff --git a/weights/nilou-jp/added_IVF2384_Flat_nprobe_1.index b/weights/nilou-jp/added_IVF2384_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..2c9dd6c9ed103bfdca3b59fbb23d8af92fb7d21a --- /dev/null +++ b/weights/nilou-jp/added_IVF2384_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96437f096c1afb1c1de18d5beeedd7d95a688b801687013a5e7e5f5269f49c38 +size 98433331 diff --git a/weights/nilou-jp/cover.png b/weights/nilou-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..16c97a930a9b94fa55f10cd6f7573804fde36dc4 --- /dev/null +++ b/weights/nilou-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8baa3e813b4025804901d7b9028d3a08ff8b2814e0cc52ea9ad83326f929a521 +size 151336 diff --git a/weights/nilou-jp/nilou-jp.pth b/weights/nilou-jp/nilou-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..e5e78bc228ad97ddccefb7386dbe8566145aee5b --- /dev/null +++ b/weights/nilou-jp/nilou-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e64fe080b45e1a2b539090f88eb1813fc7310239bdc5e3abe3250d28e383d4af +size 55027130 diff --git a/weights/noelle-jp/added_IVF3498_Flat_nprobe_1_noelle-jp_v2.index b/weights/noelle-jp/added_IVF3498_Flat_nprobe_1_noelle-jp_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..3d4edb144ccc7dbd08c7b793662fececd18c926b --- /dev/null +++ b/weights/noelle-jp/added_IVF3498_Flat_nprobe_1_noelle-jp_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b1826ace2f2725c676a32256f4443663b6422676b7c244565c7326efa08f866 +size 430969139 diff --git a/weights/noelle-jp/cover.png b/weights/noelle-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd4c366e7816ed5e8f7d3c3e6f508a693033081 --- /dev/null +++ b/weights/noelle-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3678daa9cdc1179951a08d00f1125bd997dea0a4c2fcc6c33bd91985fdfd72df +size 1292298 diff --git a/weights/noelle-jp/noelle-jp.pth b/weights/noelle-jp/noelle-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..62875a2864c608815821f60946b46cffe9afa90c --- /dev/null +++ b/weights/noelle-jp/noelle-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6b77c63ea21631ae11edde6c7c987cad5efdfdf3eb1a31687a858497b9beb07 +size 57589001 diff --git a/weights/paimon-jp/added_IVF3904_Flat_nprobe_1_paimon-jp_v2.index b/weights/paimon-jp/added_IVF3904_Flat_nprobe_1_paimon-jp_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..e2cce762b7b822c715f72726d2fe76a21270e3de --- /dev/null +++ b/weights/paimon-jp/added_IVF3904_Flat_nprobe_1_paimon-jp_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41f253fd335a70447d3a2095e1eedf5909dc6e1e8b3f8a9fb9b75eedb3b57f7d +size 481003739 diff --git a/weights/paimon-jp/cover.png b/weights/paimon-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..e919e9c75ba7c6e4418b1df78635e94f3caa336d --- /dev/null +++ b/weights/paimon-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c37f81e3eb60c88f23f18907798cb77bf62f2fe3d8aa6a49be0424a13f885aa6 +size 365552 diff --git a/weights/paimon-jp/paimon-jp.pth b/weights/paimon-jp/paimon-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..b1e00df9b4686b79eb160331dab20f812a8f0d10 --- /dev/null +++ b/weights/paimon-jp/paimon-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a313f38098e2dd3a84e637607ecb3eb92948bfee533746014a5589162e4ef23d +size 57589001 diff --git a/weights/raiden-jp/added_IVF783_Flat_nprobe_7.index b/weights/raiden-jp/added_IVF783_Flat_nprobe_7.index new file mode 100644 index 0000000000000000000000000000000000000000..cdb04b02df5f6207adf94b394daca67773280427 --- /dev/null +++ b/weights/raiden-jp/added_IVF783_Flat_nprobe_7.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71e9568b307152547c45653c6e464a991223071933858047cb81cfbd9fbb9679 +size 32349211 diff --git a/weights/raiden-jp/cover.png b/weights/raiden-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..9715577da3f3267dff2762a50ef2de39e18a4c4e --- /dev/null +++ b/weights/raiden-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae435b5488b7ba6f911616e9fa8d3b4d4d8f61ea687af1f23f6083b7d9067ee7 +size 8036189 diff --git a/weights/raiden-jp/raiden-jp.pth b/weights/raiden-jp/raiden-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..1b119e9d8aa2a1fb863921524aad52701d394486 --- /dev/null +++ b/weights/raiden-jp/raiden-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7483e661b095a272b0c0fb7aa77075c7359d087c8d3e3ee8c362985a3d96fdd1 +size 55027589 diff --git a/weights/raiden-jp/total_fea.npy b/weights/raiden-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..07ce56cea533116472165f886944ac6096cd926f --- /dev/null +++ b/weights/raiden-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1374d1575f9ed5145bb7ea1d093c48ebe6142b9d0ea10c7ad0fc8ac3c8d1993a +size 31296640 diff --git a/weights/shinobu-jp/added_IVF4218_Flat_nprobe_1_shinobu-jp_v2.index b/weights/shinobu-jp/added_IVF4218_Flat_nprobe_1_shinobu-jp_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..9276baca01384b4028b5fa1e052e6c471000a40a --- /dev/null +++ b/weights/shinobu-jp/added_IVF4218_Flat_nprobe_1_shinobu-jp_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b19ea6ca6e55cb5ed1500da4b13553a21a6a815a266857e06259748edd8b460 +size 519676219 diff --git a/weights/shinobu-jp/cover.png b/weights/shinobu-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..998a00257f80e6d7258fe4255fe3f0ab3873ef0f --- /dev/null +++ b/weights/shinobu-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2bde21a8c7324e0c77448d0021e1b9a58dcc89539765b7cbd830e430a679f832 +size 583602 diff --git a/weights/shinobu-jp/shinobu-jp.pth b/weights/shinobu-jp/shinobu-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..37549fae342f1effeca7f947bb77a75bb9ee6a27 --- /dev/null +++ b/weights/shinobu-jp/shinobu-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3253fa46c13a42a4e6de3a0b79b69d58bed62dd17991f7cafda9640e57ffb33 +size 57588083 diff --git a/weights/signora-jp/added_IVF478_Flat_nprobe_1_signora-jp_v2.index b/weights/signora-jp/added_IVF478_Flat_nprobe_1_signora-jp_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..6ca4fef36ab6e5b9fd169c3a59ac40d877b32d5a --- /dev/null +++ b/weights/signora-jp/added_IVF478_Flat_nprobe_1_signora-jp_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d79f3865e6d416916b4c42e7cf798b6a21da768968b1ef8a895bb77cf2806065 +size 58948259 diff --git a/weights/signora-jp/cover.png b/weights/signora-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..b14547726a9a7b7417df9f711148a6df1d76386e --- /dev/null +++ b/weights/signora-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d85c88748da0ffcf4d0515a5f91c99104b792789bd2e31ce021fec43fde32fc6 +size 460720 diff --git a/weights/signora-jp/signora-jp.pth b/weights/signora-jp/signora-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..1090c495ee1d331355720f51c952dba3a8a5f124 --- /dev/null +++ b/weights/signora-jp/signora-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f0562d316357bf3c1af86bf228a69fd6a1e31e2f917528cf3908076d86bd05b +size 57589983 diff --git a/weights/sucrose-jp/added_IVF884_Flat_nprobe_1.index b/weights/sucrose-jp/added_IVF884_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..9f15329db441300b4d408031f1e6ad1ce42acbc9 --- /dev/null +++ b/weights/sucrose-jp/added_IVF884_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cc1bd428bcc9a7677c6c9799ad7a90aa02e33fc8116ab443fd04b964014cecd +size 36516427 diff --git a/weights/sucrose-jp/cover.png b/weights/sucrose-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..b87a20c176ee3c1a97746dd09c346558a18713bb --- /dev/null +++ b/weights/sucrose-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65a648e980eb0d1126a85829e2d78b070922e8c2fac808151b913b4a34674c9c +size 224600 diff --git a/weights/sucrose-jp/sucrose-jp.pth b/weights/sucrose-jp/sucrose-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..2901ee990881e27c7547a24b073bf9259011ec8e --- /dev/null +++ b/weights/sucrose-jp/sucrose-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de06f5c9b36cf276c48cdc9dc98756cf2357a5bef8375c945d77ea079c208655 +size 55026095 diff --git a/weights/sucrose-jp/total_fea.npy b/weights/sucrose-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..0f3d0ec93b76657facd26b8700bfd578813aa33b --- /dev/null +++ b/weights/sucrose-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69ced72b5675af5602fbe62f63d1a2b812d7f1c306de75c2cc4b89516743c9e1 +size 35328128 diff --git a/weights/thoma-jp/added_IVF366_Flat_nprobe_1.index b/weights/thoma-jp/added_IVF366_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..51cb68372c315c711943028a32315bd5110c6c69 --- /dev/null +++ b/weights/thoma-jp/added_IVF366_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7434c35d2b8462cea1e93d2aa215b3995ce9ee5660cae9fc5c62072197618097 +size 15144739 diff --git a/weights/thoma-jp/cover.png b/weights/thoma-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..ba36555b4bbb2cc930c860edada3d69b769540e7 --- /dev/null +++ b/weights/thoma-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8c4918b71ce15cbdf839ec37b2ab1c699892aa8b864f992fd697b5cb12d32a7 +size 2981457 diff --git a/weights/thoma-jp/thoma-jp.pth b/weights/thoma-jp/thoma-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..4c5aa8ca74c0812a44b133db617534aeb6e79892 --- /dev/null +++ b/weights/thoma-jp/thoma-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79308af33fe821940d8df3d48f9419a2d9d70df81e29a62c7a3cf1f7b3f5368d +size 55027130 diff --git a/weights/thoma-jp/total_fea.npy b/weights/thoma-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..d4f7e0e205b0f45c7a9f15fd3dab9bbf1d56ef82 --- /dev/null +++ b/weights/thoma-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4533c1becfc69ff1746c5ca1bb042352a81fc2901d40efa23bc58b528c87f0fc +size 14652544 diff --git a/weights/tighnari-jp/added_IVF446_Flat_nprobe_1_tignari-jp_v1.index b/weights/tighnari-jp/added_IVF446_Flat_nprobe_1_tignari-jp_v1.index new file mode 100644 index 0000000000000000000000000000000000000000..62d13a0f90b9c498f8b89278fb9d5069ec6c4461 --- /dev/null +++ b/weights/tighnari-jp/added_IVF446_Flat_nprobe_1_tignari-jp_v1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88827f9468860a8a37151cde4f593ce3ece1719d9fe5d4dff4b5c301ede53a3f +size 18418243 diff --git a/weights/tighnari-jp/cover.png b/weights/tighnari-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c565224c3f5935bb7ca095012f2a8fe84c0de4 --- /dev/null +++ b/weights/tighnari-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b64bb3e8ebe4fe64d147dcb46c5fe07f672f4f5d47662017a038c993d3e09b3b +size 1859544 diff --git a/weights/tighnari-jp/tighnari-jp.pth b/weights/tighnari-jp/tighnari-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..34b7f9863cc7d065a9d37b4bcba671bb49705345 --- /dev/null +++ b/weights/tighnari-jp/tighnari-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93662bed0e7f208a16c1ac36d008b086f1eb1c28b3a7a0c3a7612a784158d26e +size 55028048 diff --git a/weights/tighnari-jp/total_fea.npy b/weights/tighnari-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..0d57e0eda88d9e22eee20edf0fc3ae88bf26281d --- /dev/null +++ b/weights/tighnari-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cfa85f717c10e354c9414db146f7239a7391cbab7a5e18b770496f65cc84a64 +size 17818752 diff --git a/weights/venti-jp/added_IVF3591_Flat_nprobe_1_venti-jp_v2.index b/weights/venti-jp/added_IVF3591_Flat_nprobe_1_venti-jp_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..055d9ea9d4d865fac31cc673c008575cd05b41f8 --- /dev/null +++ b/weights/venti-jp/added_IVF3591_Flat_nprobe_1_venti-jp_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b4561f58fcff1371e803bb910da5c182f2faa92a66737612f6c12fef578f19c +size 442503739 diff --git a/weights/venti-jp/cover.png b/weights/venti-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..533db20d4ff140f34d9727b4b744aeef61a1d5d4 --- /dev/null +++ b/weights/venti-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a6d04b831c913989af37aa317dc6d57c2d492386d5a2d39df037aeb7079d8f0 +size 8028474 diff --git a/weights/venti-jp/venti-jp.pth b/weights/venti-jp/venti-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..f274ae9e185fcec7f26b6aa18565e4cd186b9c83 --- /dev/null +++ b/weights/venti-jp/venti-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd1c1885d3340b24213dd4bfe1bb0449eb5f32eab3a7a9ca5e0bf389f4a7f2e0 +size 57588542 diff --git a/weights/wanderer-jp/added_IVF128_Flat_nprobe_4.index b/weights/wanderer-jp/added_IVF128_Flat_nprobe_4.index new file mode 100644 index 0000000000000000000000000000000000000000..ce54db39fe85ac939452aadd69cc1741f5bcd9fc --- /dev/null +++ b/weights/wanderer-jp/added_IVF128_Flat_nprobe_4.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6642c9a48863247025fd9fb09e8de4ffa220ef659dff1a4a297c57bd08cf1ec4 +size 5314939 diff --git a/weights/wanderer-jp/cover.png b/weights/wanderer-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..3a85da4b70e37855f15f4bb546e220c58971c6d4 --- /dev/null +++ b/weights/wanderer-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af68ce227760b354d3c204b38589d328623ed869973d16db05daef784026526a +size 12522761 diff --git a/weights/wanderer-jp/total_fea.npy b/weights/wanderer-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..aca280acfcac1c9f65b4c22637d24c32e8ec2127 --- /dev/null +++ b/weights/wanderer-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edccbafbaa8512f9970686d305eb10b4ff5f9d79ca7118d3158b8699aac1975e +size 5142656 diff --git a/weights/wanderer-jp/wanderer-jp.pth b/weights/wanderer-jp/wanderer-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..7f03d9fd91a830477f37ecd7cbab2abf20bd454b --- /dev/null +++ b/weights/wanderer-jp/wanderer-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d2d89c3cac427a5ae0439b2cd635015f20e8d4e1d2d6c0af39daa44f6c02890 +size 55028507 diff --git a/weights/xiao-jp/added_IVF233_Flat_nprobe_5.index b/weights/xiao-jp/added_IVF233_Flat_nprobe_5.index new file mode 100644 index 0000000000000000000000000000000000000000..a5ae5974faffe91e6980205ad1d36e26972b22c6 --- /dev/null +++ b/weights/xiao-jp/added_IVF233_Flat_nprobe_5.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65c124d9021bf14703a4b4446f86dc0356f8ab43c46b99efdaab183ccb42ccf8 +size 9641083 diff --git a/weights/xiao-jp/cover.png b/weights/xiao-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..02234b440e411f22104dc245100ea2f96e2e9154 --- /dev/null +++ b/weights/xiao-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de0e9f3dfa8c1e5266fd519fc23e7365d06c1375caa47e4cc7cfcda4d1e26888 +size 10456216 diff --git a/weights/xiao-jp/total_fea.npy b/weights/xiao-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..42737c93b5ebc486dc64ecf2f80933acd9cf8cdf --- /dev/null +++ b/weights/xiao-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3650e806c3e9098c4a836d138c141b2d387351765317721d2331ff3428361fbe +size 9327744 diff --git a/weights/xiao-jp/xiao-jp.pth b/weights/xiao-jp/xiao-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..8c3e534232a678288a9dd7e073027e83609e89bc --- /dev/null +++ b/weights/xiao-jp/xiao-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f85bf34a96dffe7dcaec4fb434f0ca1ed08b56784ac9ab88545ab2df8b66e1a +size 55026095 diff --git a/weights/xinyan-jp/added_IVF971_Flat_nprobe_1_xinyan_v2.index b/weights/xinyan-jp/added_IVF971_Flat_nprobe_1_xinyan_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..a9256c3aac824afeb5f18f32589438be42bd42b8 --- /dev/null +++ b/weights/xinyan-jp/added_IVF971_Flat_nprobe_1_xinyan_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94955edd259bd10becaed2c4ccf67bd4c5a88af75c949bcd3d14cee6156c155d +size 119735139 diff --git a/weights/xinyan-jp/cover.png b/weights/xinyan-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..5009f6d6e6cf730cb2c5064030be18b34aa9f7da --- /dev/null +++ b/weights/xinyan-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46814695112bc091f81f4e208481245297d625459757dca4d76af707ca87009e +size 294265 diff --git a/weights/xinyan-jp/xinyan-jp.pth b/weights/xinyan-jp/xinyan-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..903a42baa106979f80bdf58a1ff2416bd40bfacd --- /dev/null +++ b/weights/xinyan-jp/xinyan-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9dec1ae0b4492343a07d66e1ba4b0216679dd5fed0bae39720805da113802c35 +size 55216420 diff --git a/weights/yae-jp/added_IVF935_Flat_nprobe_1.index b/weights/yae-jp/added_IVF935_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..4a1e7575b0220604e14317af55c7f1eb2ba43567 --- /dev/null +++ b/weights/yae-jp/added_IVF935_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f82e237ac49c261015c5159e4335f001653a5d3622ce7d7be95533060052314c +size 38622739 diff --git a/weights/yae-jp/cover.png b/weights/yae-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..651702b26b79bce9931189d481291405fb80afcc --- /dev/null +++ b/weights/yae-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b1f7e1b6fa0dde40ed9cc4b9a0ad6296f8a890c23c73dc897ea8f6734d74be6 +size 5027456 diff --git a/weights/yae-jp/total_fea.npy b/weights/yae-jp/total_fea.npy new file mode 100644 index 0000000000000000000000000000000000000000..b04f7ca3c44b29c737fd93f69694069d4461a216 --- /dev/null +++ b/weights/yae-jp/total_fea.npy @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e89f702186c72b99d4821ef641c4a057a335b5c0a273cc04e06a48ab9981151 +size 37365888 diff --git a/weights/yae-jp/yae-jp.pth b/weights/yae-jp/yae-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..7b4d5c92816307cea3b9bdea6a03dcf49f76e41f --- /dev/null +++ b/weights/yae-jp/yae-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdab6dbf1c3d045c872822b21e780fa6c8037cf88288d216abe8d69c3b02b8b1 +size 54995587 diff --git a/weights/yanfei-jp/added_IVF1271_Flat_nprobe_1_yanfei-v2_v2.index b/weights/yanfei-jp/added_IVF1271_Flat_nprobe_1_yanfei-v2_v2.index new file mode 100644 index 0000000000000000000000000000000000000000..df7ae2b4382692cfee6d68d9d83fd733c32004ef --- /dev/null +++ b/weights/yanfei-jp/added_IVF1271_Flat_nprobe_1_yanfei-v2_v2.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cf71cbde75213b451e5850ce6f6bde5647de1a1642a56df15367c0ff76783ba +size 156608899 diff --git a/weights/yanfei-jp/cover.png b/weights/yanfei-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..cf542f8d862f71b1a8ddf0fc7aa7e7d3691cc4b9 --- /dev/null +++ b/weights/yanfei-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d0687136bf908a0b05969cfd39dc396d1411a6f7e71b4a4b6d521bd5fa0c840 +size 310936 diff --git a/weights/yanfei-jp/yanfei-jp.pth b/weights/yanfei-jp/yanfei-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..28e57b006a425cdfe93d91d973761afd0688c77a --- /dev/null +++ b/weights/yanfei-jp/yanfei-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb0b7c6abad6e6f854d6a9c7a504147557481939fcfce837884d59784076e868 +size 55224197 diff --git a/weights/yelan-jp/added_IVF2051_Flat_nprobe_1.index b/weights/yelan-jp/added_IVF2051_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..d15cb9258a7bf4ea824d5df70ecf31a2bca856f5 --- /dev/null +++ b/weights/yelan-jp/added_IVF2051_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba725109af57b0c32075582e17571e59ee3a3c33b34b00e13481bd15c0bf0920 +size 84694315 diff --git a/weights/yelan-jp/cover.png b/weights/yelan-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..84c5e0d29602dc83c5e85300bae6e1bd9d66775c --- /dev/null +++ b/weights/yelan-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:415727226e6fd9e15042c69c925848ed80b39701ffe954f35b91d59437d9176f +size 583602 diff --git a/weights/yelan-jp/yelan-jp.pth b/weights/yelan-jp/yelan-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..6689d025fe95cfdfe02e41015794d4e3cd2f3cb8 --- /dev/null +++ b/weights/yelan-jp/yelan-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d62ff825db07022e7d380d13c827f27730c99f6d029e8fb8b1d7cd90018d3c49 +size 55027130 diff --git a/weights/yoimiya-jp/added_IVF2034_Flat_nprobe_1.index b/weights/yoimiya-jp/added_IVF2034_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..8eb29f4a40f427f9b105738ad7bd71224d51ac0a --- /dev/null +++ b/weights/yoimiya-jp/added_IVF2034_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af434a9142b070f7091dcdbbf957b7a01bbc96294add99d186ef1e0d4b226eac +size 83987395 diff --git a/weights/yoimiya-jp/cover.png b/weights/yoimiya-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..be502b43c4c802982ecbfeed4ea3385dd4ef65f2 --- /dev/null +++ b/weights/yoimiya-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c044b81dd758a4efac819bf8e86c6a3dc565517e6c77525c36245ca26b73b42f +size 199412 diff --git a/weights/yoimiya-jp/yoimiya-jp.pth b/weights/yoimiya-jp/yoimiya-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..84d7a9eb2db180ec681ac8b87c37ef8b352deff3 --- /dev/null +++ b/weights/yoimiya-jp/yoimiya-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:896fcee182ecdcea6645a691366ac50153bc63015f43c981da135a8cabe2f088 +size 55028048 diff --git a/weights/zhongli-jp/added_IVF1672_Flat_nprobe_1.index b/weights/zhongli-jp/added_IVF1672_Flat_nprobe_1.index new file mode 100644 index 0000000000000000000000000000000000000000..a59a5bed1cbedad0f946e73e56667658f59ececb --- /dev/null +++ b/weights/zhongli-jp/added_IVF1672_Flat_nprobe_1.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f112d545b6b6ea3063b91d072a745e38541bad2141273b84896102f727cdbe14 +size 69024427 diff --git a/weights/zhongli-jp/cover.png b/weights/zhongli-jp/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..a3eb27010d8baee2279b079a55fffcaa32ba137f --- /dev/null +++ b/weights/zhongli-jp/cover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b2ba0d51052e547052fd14affd7bf74c4dc3c3ee114ca94b45b058b137a2dea +size 2070002 diff --git a/weights/zhongli-jp/zhongli-jp.pth b/weights/zhongli-jp/zhongli-jp.pth new file mode 100644 index 0000000000000000000000000000000000000000..c3d5b9c9eff9c9540c7a7b6895eb9cfa21e49ff9 --- /dev/null +++ b/weights/zhongli-jp/zhongli-jp.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f31eb1a9446b26cf0893898b75c0a93ed83746cad9fc1f73f0990e7418afc23c +size 55028048