|
import json |
|
|
|
import numpy as np |
|
import torch |
|
from tqdm import tqdm |
|
|
|
|
|
def load_data(file_name: str = "./infer/lib/uvr5_pack/name_params.json") -> dict: |
|
with open(file_name, "r") as f: |
|
data = json.load(f) |
|
|
|
return data |
|
|
|
|
|
def make_padding(width, cropsize, offset): |
|
left = offset |
|
roi_size = cropsize - left * 2 |
|
if roi_size == 0: |
|
roi_size = cropsize |
|
right = roi_size - (width % roi_size) + left |
|
|
|
return left, right, roi_size |
|
|
|
|
|
def inference(X_spec, device, model, aggressiveness, data): |
|
""" |
|
data : dic configs |
|
""" |
|
|
|
def _execute( |
|
X_mag_pad, roi_size, n_window, device, model, aggressiveness, is_half=True |
|
): |
|
model.eval() |
|
with torch.no_grad(): |
|
preds = [] |
|
|
|
iterations = [n_window] |
|
|
|
total_iterations = sum(iterations) |
|
for i in tqdm(range(n_window)): |
|
start = i * roi_size |
|
X_mag_window = X_mag_pad[ |
|
None, :, :, start : start + data["window_size"] |
|
] |
|
X_mag_window = torch.from_numpy(X_mag_window) |
|
if is_half: |
|
X_mag_window = X_mag_window.half() |
|
X_mag_window = X_mag_window.to(device) |
|
|
|
pred = model.predict(X_mag_window, aggressiveness) |
|
|
|
pred = pred.detach().cpu().numpy() |
|
preds.append(pred[0]) |
|
|
|
pred = np.concatenate(preds, axis=2) |
|
return pred |
|
|
|
def preprocess(X_spec): |
|
X_mag = np.abs(X_spec) |
|
X_phase = np.angle(X_spec) |
|
|
|
return X_mag, X_phase |
|
|
|
X_mag, X_phase = preprocess(X_spec) |
|
|
|
coef = X_mag.max() |
|
X_mag_pre = X_mag / coef |
|
|
|
n_frame = X_mag_pre.shape[2] |
|
pad_l, pad_r, roi_size = make_padding(n_frame, data["window_size"], model.offset) |
|
n_window = int(np.ceil(n_frame / roi_size)) |
|
|
|
X_mag_pad = np.pad(X_mag_pre, ((0, 0), (0, 0), (pad_l, pad_r)), mode="constant") |
|
|
|
if list(model.state_dict().values())[0].dtype == torch.float16: |
|
is_half = True |
|
else: |
|
is_half = False |
|
pred = _execute( |
|
X_mag_pad, roi_size, n_window, device, model, aggressiveness, is_half |
|
) |
|
pred = pred[:, :, :n_frame] |
|
|
|
if data["tta"]: |
|
pad_l += roi_size // 2 |
|
pad_r += roi_size // 2 |
|
n_window += 1 |
|
|
|
X_mag_pad = np.pad(X_mag_pre, ((0, 0), (0, 0), (pad_l, pad_r)), mode="constant") |
|
|
|
pred_tta = _execute( |
|
X_mag_pad, roi_size, n_window, device, model, aggressiveness, is_half |
|
) |
|
pred_tta = pred_tta[:, :, roi_size // 2 :] |
|
pred_tta = pred_tta[:, :, :n_frame] |
|
|
|
return (pred + pred_tta) * 0.5 * coef, X_mag, np.exp(1.0j * X_phase) |
|
else: |
|
return pred * coef, X_mag, np.exp(1.0j * X_phase) |
|
|
|
|
|
def _get_name_params(model_path, model_hash): |
|
data = load_data() |
|
flag = False |
|
ModelName = model_path |
|
for type in list(data): |
|
for model in list(data[type][0]): |
|
for i in range(len(data[type][0][model])): |
|
if str(data[type][0][model][i]["hash_name"]) == model_hash: |
|
flag = True |
|
elif str(data[type][0][model][i]["hash_name"]) in ModelName: |
|
flag = True |
|
|
|
if flag: |
|
model_params_auto = data[type][0][model][i]["model_params"] |
|
param_name_auto = data[type][0][model][i]["param_name"] |
|
if type == "equivalent": |
|
return param_name_auto, model_params_auto |
|
else: |
|
flag = False |
|
return param_name_auto, model_params_auto |
|
|