Exemplo n.º 1
0
    def inverse(self, magnitude, phase):
        recombine_magnitude_phase = torch.cat(
            [magnitude * torch.cos(phase), magnitude * torch.sin(phase)],
            dim=1)

        inverse_transform = F.conv_transpose1d(recombine_magnitude_phase,
                                               Variable(self.inverse_basis,
                                                        requires_grad=False),
                                               stride=self.hop_length,
                                               padding=0)

        if self.window is not None:
            window_sum = window_sumsquare(self.window,
                                          magnitude.size(-1),
                                          hop_length=self.hop_length,
                                          win_length=self.win_length,
                                          n_fft=self.filter_length,
                                          dtype=np.float32)
            # remove modulation effects
            approx_nonzero_indices = torch.from_numpy(
                np.where(window_sum > tiny(window_sum))[0])
            window_sum = torch.autograd.Variable(torch.from_numpy(window_sum),
                                                 requires_grad=False).cuda()
            inverse_transform[:, :, approx_nonzero_indices] /= window_sum[
                approx_nonzero_indices]

            # scale by hop ratio
            inverse_transform *= float(self.filter_length) / self.hop_length

        inverse_transform = inverse_transform[:, :,
                                              int(self.filter_length / 2):]
        inverse_transform = inverse_transform[:, :, :-int(self.filter_length /
                                                          2):]

        return inverse_transform
Exemplo n.º 2
0
    def inverse(self, magnitude, phase):
        recombine_magnitude_phase = torch.cat(
            [magnitude * torch.cos(phase), magnitude * torch.sin(phase)],
            dim=1)

        if magnitude.device.type == "cuda":
            inverse_transform = F.conv_transpose1d(recombine_magnitude_phase,
                                                   self.inverse_basis,
                                                   stride=self.hop_length,
                                                   padding=0)

            if self.window is not None:
                window_sum = window_sumsquare(self.window,
                                              magnitude.size(-1),
                                              hop_length=self.hop_length,
                                              win_length=self.win_length,
                                              n_fft=self.filter_length,
                                              dtype=np.float32)
                # remove modulation effects
                approx_nonzero_indices = torch.from_numpy(
                    np.where(window_sum > tiny(window_sum))[0])
                window_sum = torch.from_numpy(window_sum).to(
                    inverse_transform.device)
                inverse_transform[:, :, approx_nonzero_indices] /= window_sum[
                    approx_nonzero_indices]

                # scale by hop ratio
                inverse_transform *= float(
                    self.filter_length) / self.hop_length

            inverse_transform = inverse_transform[:, :,
                                                  int(self.filter_length / 2):]
            inverse_transform = inverse_transform[:, :, :-int(
                self.filter_length / 2):]
            inverse_transform = inverse_transform.squeeze(1)
        else:
            x_org = recombine_magnitude_phase.detach().numpy()
            n_b, n_f, n_t = x_org.shape
            x = np.empty([n_b, n_f // 2, n_t], dtype=np.complex64)
            x.real = x_org[:, :n_f // 2]
            x.imag = x_org[:, n_f // 2:]
            inverse_transform = []
            for y in x:
                y_ = istft(y, self.hop_length, self.win_length, self.window)
                inverse_transform.append(y_[None, :])
            inverse_transform = np.concatenate(inverse_transform, 0)
            inverse_transform = torch.from_numpy(inverse_transform).to(
                recombine_magnitude_phase.dtype)

        return inverse_transform