Spaces:
Build error
Build error
import torch | |
import multiprocessing | |
from abc import ABC, abstractmethod | |
import deepafx_st.utils as utils | |
import numpy as np | |
class Processor(torch.nn.Module, ABC): | |
"""Processor base class.""" | |
def __init__( | |
self, | |
): | |
super().__init__() | |
def denormalize_params(self, p): | |
"""This method takes a tensor of parameters scaled from 0-1 and | |
restores them back to the original parameter range.""" | |
# check if the number of parameters is correct | |
params = p # torch.split(p, 1, -1) | |
if len(params) != self.num_control_params: | |
raise RuntimeError( | |
f"Invalid number of parameters. ", | |
f"Expected {self.num_control_params} but found {len(params)} {params.shape}.", | |
) | |
# iterate over the parameters and expand from 0-1 to full range | |
denorm_params = [] | |
for param, port in zip(params, self.ports): | |
# check if parameter exceeds range | |
if param > 1.0 or param < 0.0: | |
raise RuntimeError( | |
f"""Parameter '{port["name"]}' exceeds range: {param}""" | |
) | |
# denormalize and store result | |
denorm_params.append(utils.denormalize(param, port["max"], port["min"])) | |
return denorm_params | |
def normalize_params(self, *params): | |
"""This method creates a vector of parameters normalized from 0-1.""" | |
# check if the number of parameters is correct | |
if len(params) != self.num_control_params: | |
raise RuntimeError( | |
f"Invalid number of parameters. ", | |
f"Expected {self.num_control_params} but found {len(params)}.", | |
) | |
norm_params = [] | |
for param, port in zip(params, self.ports): | |
norm_params.append(utils.normalize(param, port["max"], port["min"])) | |
p = torch.tensor(norm_params).view(1, -1) | |
return p | |
# def run_series(self, inputs, params): | |
# """Run the process function in a loop given a list of inputs and parameters""" | |
# p_b_denorm = [p for p in self.denormalize_params(params)] | |
# y = self.process_fn(inputs, self.sample_rate, *p_b_denorm) | |
# return y | |
def run_series(self, inputs, params, sample_rate=24000): | |
"""Run the process function in a loop given a list of inputs and parameters""" | |
if params.ndim == 1: | |
params = np.reshape(params, (1, -1)) | |
inputs = np.reshape(inputs, (1, -1)) | |
bs = inputs.shape[0] | |
ys = [] | |
params = np.clip(params, 0, 1) | |
for bidx in range(bs): | |
p_b_denorm = [p for p in self.denormalize_params(params[bidx, :])] | |
y = self.process_fn( | |
inputs[bidx, ...].reshape(-1), | |
sample_rate, | |
*p_b_denorm, | |
) | |
ys.append(y) | |
y = np.stack(ys, axis=0) | |
return y | |
def forward(self, x, p): | |
pass | |