import torch import numpy as np from scipy.io.wavfile import write import pickle import json from audioldm_eval.audio.audio_processing import griffin_lim def save_pickle(obj, fname): # print("Save pickle at " + fname) with open(fname, "wb") as f: pickle.dump(obj, f) def load_pickle(fname): # print("Load pickle at " + fname) with open(fname, "rb") as f: res = pickle.load(f) return res def write_json(my_dict, fname): # print("Save json file at " + fname) json_str = json.dumps(my_dict) with open(fname, "w") as json_file: json_file.write(json_str) def load_json(fname): with open(fname, "r") as f: data = json.load(f) return data def get_mel_from_wav(audio, _stft): audio = torch.clip(torch.FloatTensor(audio).unsqueeze(0), -1, 1) audio = torch.autograd.Variable(audio, requires_grad=False) melspec, energy = _stft.mel_spectrogram(audio) melspec = torch.squeeze(melspec, 0).numpy().astype(np.float32) energy = torch.squeeze(energy, 0).numpy().astype(np.float32) return melspec, energy def inv_mel_spec(mel, out_filename, _stft, griffin_iters=60): mel = torch.stack([mel]) 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, _stft.sampling_rate, audio)