CoolFace
Apppublic

RabbitRUI/ruispace

sourceHugging Facemitupdated 3y agoView on Hugging Face
0likes
audio.py137 linesDownload Raw Back to utils
1import librosa2import librosa.filters3import numpy as np4# import tensorflow as tf5from scipy import signal6from scipy.io import wavfile7from src.utils.hparams import hparams as hp8 9def load_wav(path, sr):10    return librosa.core.load(path, sr=sr)[0]11 12def save_wav(wav, path, sr):13    wav *= 32767 / max(0.01, np.max(np.abs(wav)))14    #proposed by @dsmiller15    wavfile.write(path, sr, wav.astype(np.int16))16 17def save_wavenet_wav(wav, path, sr):18    librosa.output.write_wav(path, wav, sr=sr)19 20def preemphasis(wav, k, preemphasize=True):21    if preemphasize:22        return signal.lfilter([1, -k], [1], wav)23    return wav24 25def inv_preemphasis(wav, k, inv_preemphasize=True):26    if inv_preemphasize:27        return signal.lfilter([1], [1, -k], wav)28    return wav29 30def get_hop_size():31    hop_size = hp.hop_size32    if hop_size is None:33        assert hp.frame_shift_ms is not None34        hop_size = int(hp.frame_shift_ms / 1000 * hp.sample_rate)35    return hop_size36 37def linearspectrogram(wav):38    D = _stft(preemphasis(wav, hp.preemphasis, hp.preemphasize))39    S = _amp_to_db(np.abs(D)) - hp.ref_level_db40    41    if hp.signal_normalization:42        return _normalize(S)43    return S44 45def melspectrogram(wav):46    D = _stft(preemphasis(wav, hp.preemphasis, hp.preemphasize))47    S = _amp_to_db(_linear_to_mel(np.abs(D))) - hp.ref_level_db48    49    if hp.signal_normalization:50        return _normalize(S)51    return S52 53def _lws_processor():54    import lws55    return lws.lws(hp.n_fft, get_hop_size(), fftsize=hp.win_size, mode="speech")56 57def _stft(y):58    if hp.use_lws:59        return _lws_processor(hp).stft(y).T60    else:61        return librosa.stft(y=y, n_fft=hp.n_fft, hop_length=get_hop_size(), win_length=hp.win_size)62 63##########################################################64#Those are only correct when using lws!!! (This was messing with Wavenet quality for a long time!)65def num_frames(length, fsize, fshift):66    """Compute number of time frames of spectrogram67    """68    pad = (fsize - fshift)69    if length % fshift == 0:70        M = (length + pad * 2 - fsize) // fshift + 171    else:72        M = (length + pad * 2 - fsize) // fshift + 273    return M74 75 76def pad_lr(x, fsize, fshift):77    """Compute left and right padding78    """79    M = num_frames(len(x), fsize, fshift)80    pad = (fsize - fshift)81    T = len(x) + 2 * pad82    r = (M - 1) * fshift + fsize - T83    return pad, pad + r84##########################################################85#Librosa correct padding86def librosa_pad_lr(x, fsize, fshift):87    return 0, (x.shape[0] // fshift + 1) * fshift - x.shape[0]88 89# Conversions90_mel_basis = None91 92def _linear_to_mel(spectogram):93    global _mel_basis94    if _mel_basis is None:95        _mel_basis = _build_mel_basis()96    return np.dot(_mel_basis, spectogram)97 98def _build_mel_basis():99    assert hp.fmax <= hp.sample_rate // 2100    return librosa.filters.mel(sr=hp.sample_rate, n_fft=hp.n_fft, n_mels=hp.num_mels,101                               fmin=hp.fmin, fmax=hp.fmax)102 103def _amp_to_db(x):104    min_level = np.exp(hp.min_level_db / 20 * np.log(10))105    return 20 * np.log10(np.maximum(min_level, x))106 107def _db_to_amp(x):108    return np.power(10.0, (x) * 0.05)109 110def _normalize(S):111    if hp.allow_clipping_in_normalization:112        if hp.symmetric_mels:113            return np.clip((2 * hp.max_abs_value) * ((S - hp.min_level_db) / (-hp.min_level_db)) - hp.max_abs_value,114                           -hp.max_abs_value, hp.max_abs_value)115        else:116            return np.clip(hp.max_abs_value * ((S - hp.min_level_db) / (-hp.min_level_db)), 0, hp.max_abs_value)117    118    assert S.max() <= 0 and S.min() - hp.min_level_db >= 0119    if hp.symmetric_mels:120        return (2 * hp.max_abs_value) * ((S - hp.min_level_db) / (-hp.min_level_db)) - hp.max_abs_value121    else:122        return hp.max_abs_value * ((S - hp.min_level_db) / (-hp.min_level_db))123 124def _denormalize(D):125    if hp.allow_clipping_in_normalization:126        if hp.symmetric_mels:127            return (((np.clip(D, -hp.max_abs_value,128                              hp.max_abs_value) + hp.max_abs_value) * -hp.min_level_db / (2 * hp.max_abs_value))129                    + hp.min_level_db)130        else:131            return ((np.clip(D, 0, hp.max_abs_value) * -hp.min_level_db / hp.max_abs_value) + hp.min_level_db)132    133    if hp.symmetric_mels:134        return (((D + hp.max_abs_value) * -hp.min_level_db / (2 * hp.max_abs_value)) + hp.min_level_db)135    else:136        return ((D * -hp.min_level_db / hp.max_abs_value) + hp.min_level_db)137