import torch import numpy as np from scipy.io.wavfile import read from scipy.io.wavfile import write import audio.stft as stft import audio.hparams as hparams from audio.audio_processing import griffin_lim _stft = stft.TacotronSTFT( hparams.filter_length, hparams.hop_length, hparams.win_length, hparams.n_mel_channels, hparams.sampling_rate, hparams.mel_fmin, hparams.mel_fmax) def load_wav_to_torch(full_path): sampling_rate, data = read(full_path) return torch.FloatTensor(data.astype(np.float32)), sampling_rate def get_mel(filename): audio, sampling_rate = load_wav_to_torch(filename) if sampling_rate != _stft.sampling_rate: raise ValueError("{} {} SR doesn't match target {} SR".format( sampling_rate, _stft.sampling_rate)) audio_norm = audio / hparams.max_wav_value audio_norm = audio_norm.unsqueeze(0) audio_norm = torch.autograd.Variable(audio_norm, requires_grad=False) melspec = _stft.mel_spectrogram(audio_norm) melspec = torch.squeeze(melspec, 0) # melspec = torch.from_numpy(_normalize(melspec.numpy())) return melspec def get_mel_from_wav(audio): sampling_rate = hparams.sampling_rate if sampling_rate != _stft.sampling_rate: raise ValueError("{} {} SR doesn't match target {} SR".format( sampling_rate, _stft.sampling_rate)) audio_norm = audio / hparams.max_wav_value audio_norm = audio_norm.unsqueeze(0) audio_norm = torch.autograd.Variable(audio_norm, requires_grad=False) melspec = _stft.mel_spectrogram(audio_norm) melspec = torch.squeeze(melspec, 0) return melspec def inv_mel_spec(mel, out_filename, griffin_iters=60): mel = torch.stack([mel]) # mel = torch.stack([torch.from_numpy(_denormalize(mel.numpy()))]) mel_decompress = _stft.spectral_de_normalize(mel) mel_decompress = mel_decompress.transpose(1, 2).data.cpu() spec_from_mel_scaling = 1000 spec_from_mel = torch.mm(mel_decompress[0], _stft.mel_basis) spec_from_mel = spec_from_mel.transpose(0, 1).unsqueeze(0) spec_from_mel = spec_from_mel * spec_from_mel_scaling audio = griffin_lim(torch.autograd.Variable( spec_from_mel[:, :, :-1]), _stft.stft_fn, griffin_iters) audio = audio.squeeze() audio = audio.cpu().numpy() audio_path = out_filename write(audio_path, hparams.sampling_rate, audio)