mirror of
https://github.com/storytold/storyteller-ml.git
synced 2026-10-13 23:53:02 +00:00
42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
import torch
|
|
import numpy as np
|
|
from scipy.io.wavfile import write
|
|
|
|
from audio.audio_processing import griffin_lim
|
|
|
|
|
|
def get_mel_from_wav(audio, _stft):
|
|
audio = torch.clamp(torch.FloatTensor(audio).unsqueeze(0), -1, 1)
|
|
audio = torch.autograd.Variable(audio, requires_grad=False)
|
|
melspec = _stft.mel_spectrogram(audio)
|
|
melspec = torch.squeeze(melspec, 0).numpy().astype(np.float32)
|
|
|
|
return melspec
|
|
|
|
|
|
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)
|
|
|
|
|
|
def mel_normalize(mel, m_min, m_max):
|
|
return 2 * (mel - m_min)/(m_max-m_min) - 1
|
|
|
|
|
|
def mel_denormalize(mel_norm, m_min, m_max):
|
|
return (m_max - m_min) * ((mel_norm)+1)/2 + m_min
|