Spaces:
Build error
Build error
import numpy as np | |
from numpy import linalg as LA | |
import librosa | |
from scipy.io import wavfile | |
import soundfile as sf | |
import librosa.filters | |
def load_wav(wav_path, raw_sr, target_sr=16000, win_size=800, hop_size=200): | |
audio = librosa.core.load(wav_path, sr=raw_sr)[0] | |
if raw_sr != target_sr: | |
audio = librosa.core.resample(audio, | |
raw_sr, | |
target_sr, | |
res_type='kaiser_best') | |
target_length = (audio.size // hop_size + | |
win_size // hop_size) * hop_size | |
pad_len = (target_length - audio.size) // 2 | |
if audio.size % 2 == 0: | |
audio = np.pad(audio, (pad_len, pad_len), mode='reflect') | |
else: | |
audio = np.pad(audio, (pad_len, pad_len + 1), mode='reflect') | |
return audio | |
def save_wav(wav, path, sample_rate, norm=False): | |
if norm: | |
wav *= 32767 / max(0.01, np.max(np.abs(wav))) | |
wavfile.write(path, sample_rate, wav.astype(np.int16)) | |
else: | |
sf.write(path, wav, sample_rate) | |
_mel_basis = None | |
_inv_mel_basis = None | |
def _build_mel_basis(hparams): | |
assert hparams.fmax <= hparams.sample_rate // 2 | |
return librosa.filters.mel(hparams.sample_rate, | |
hparams.n_fft, | |
n_mels=hparams.acoustic_dim, | |
fmin=hparams.fmin, | |
fmax=hparams.fmax) | |
def _linear_to_mel(spectogram, hparams): | |
global _mel_basis | |
if _mel_basis is None: | |
_mel_basis = _build_mel_basis(hparams) | |
return np.dot(_mel_basis, spectogram) | |
def _mel_to_linear(mel_spectrogram, hparams): | |
global _inv_mel_basis | |
if _inv_mel_basis is None: | |
_inv_mel_basis = np.linalg.pinv(_build_mel_basis(hparams)) | |
return np.maximum(1e-10, np.dot(_inv_mel_basis, mel_spectrogram)) | |
def _stft(y, hparams): | |
return librosa.stft(y=y, | |
n_fft=hparams.n_fft, | |
hop_length=hparams.hop_size, | |
win_length=hparams.win_size) | |
def _amp_to_db(x, hparams): | |
min_level = np.exp(hparams.min_level_db / 20 * np.log(10)) | |
return 20 * np.log10(np.maximum(min_level, x)) | |
def _normalize(S, hparams): | |
return hparams.max_abs_value * np.clip(((S - hparams.min_db) / | |
(-hparams.min_db)), 0, 1) | |
def _db_to_amp(x): | |
return np.power(10.0, (x) * 0.05) | |
def _stft(y, hparams): | |
return librosa.stft(y=y, | |
n_fft=hparams.n_fft, | |
hop_length=hparams.hop_size, | |
win_length=hparams.win_size) | |
def _istft(y, hparams): | |
return librosa.istft(y, | |
hop_length=hparams.hop_size, | |
win_length=hparams.win_size) | |
def melspectrogram(wav, hparams): | |
D = _stft(wav, hparams) | |
S = _amp_to_db(_linear_to_mel(np.abs(D), hparams), | |
hparams) - hparams.ref_level_db | |
return _normalize(S, hparams) | |