| import torch | |
| import numpy as np | |
| from tqdm import tqdm | |
| import json | |
| def load_data(file_name: str = "./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 | |