Spaces:
Configuration error
Configuration error
| import torch | |
| import onnx | |
| import platform | |
| import onnx2torch | |
| import numpy as np | |
| from typing import Dict, Any, List | |
| class MDXNet(): | |
| def __init__( | |
| self, | |
| dim_f: int, | |
| n_fft: int, | |
| hop_length: int, | |
| compensation: float = 1.0, | |
| **kwargs | |
| ): | |
| self.dim_f = dim_f | |
| self.n_fft = n_fft | |
| self.dim_c = 4 | |
| self.compensation = compensation | |
| self.n_bins = self.n_fft // 2 + 1 | |
| self.onnx_model_path = None | |
| self.providers = [] | |
| self.provider_options = None | |
| def init_onnx_session(self, onnx_model_path: str, device: torch.device, device_ids: list): | |
| self.onnx_model_path = onnx_model_path | |
| if platform.system() == 'Windows': | |
| onnx_model = onnx.load(self.onnx_model_path) | |
| self.model = onnx2torch.convert(onnx_model) | |
| else: | |
| self.model = onnx2torch.convert(self.onnx_model_path) | |
| self.model.to(device).eval() | |
| def post_init(self, dim_t, device): | |
| self.window = torch.hann_window(window_length=self.n_fft, periodic=True) | |
| out_c = self.dim_c | |
| self.freq_pad = torch.zeros([1, out_c, self.n_bins - self.dim_f, dim_t]) | |
| def stft(self, x: torch.Tensor, chunk_size: int, hop_length: int, dim_t: int) -> torch.Tensor: | |
| window = self.window.to(x.device) | |
| x = x.reshape([-1, chunk_size]) | |
| x = torch.stft( | |
| x, | |
| n_fft=self.n_fft, | |
| hop_length=hop_length, | |
| window=window, | |
| center=True, | |
| return_complex=True, | |
| ) | |
| x = torch.view_as_real(x) | |
| x = x.permute([0, 3, 1, 2]) | |
| x = x.reshape([-1, 2, 2, self.n_bins, dim_t]).reshape( | |
| [-1, 4, self.n_bins, dim_t] | |
| ) | |
| return x[:, :, : self.dim_f] | |
| def istft(self, x: torch.Tensor, chunk_size: int, hop_length: int, dim_t: int) -> torch.Tensor: | |
| window = self.window.to(x.device) | |
| freq_pad = self.freq_pad.repeat([x.shape[0], 1, 1, 1]).to(x.device) | |
| x = torch.cat([x, freq_pad], -2) | |
| x = x.reshape([-1, 2, 2, self.n_bins, dim_t]).reshape( | |
| [-1, 2, self.n_bins, dim_t] | |
| ) | |
| x = x.permute([0, 2, 3, 1]) | |
| x = x.contiguous() | |
| x = torch.view_as_complex(x) | |
| x = torch.istft( | |
| x, | |
| n_fft=self.n_fft, | |
| hop_length=hop_length, | |
| window=window, | |
| center=True, | |
| ) | |
| return x.reshape([-1, 2, chunk_size]) | |
| def forward(self, x: torch.Tensor) -> torch.Tensor: | |
| return self.model(x) | |