|
import subprocess |
|
import matplotlib |
|
|
|
matplotlib.use('Agg') |
|
import librosa |
|
import librosa.filters |
|
import numpy as np |
|
from scipy import signal |
|
from scipy.io import wavfile |
|
|
|
|
|
def save_wav(wav, path, sr, norm=False): |
|
if norm: |
|
wav = wav / np.abs(wav).max() |
|
wav *= 32767 |
|
|
|
wavfile.write(path, sr, wav.astype(np.int16)) |
|
|
|
|
|
def get_hop_size(hparams): |
|
hop_size = hparams['hop_size'] |
|
if hop_size is None: |
|
assert hparams['frame_shift_ms'] is not None |
|
hop_size = int(hparams['frame_shift_ms'] / 1000 * hparams['audio_sample_rate']) |
|
return hop_size |
|
|
|
|
|
|
|
def _stft(y, hparams): |
|
return librosa.stft(y=y, n_fft=hparams['fft_size'], hop_length=get_hop_size(hparams), |
|
win_length=hparams['win_size'], pad_mode='constant') |
|
|
|
|
|
def _istft(y, hparams): |
|
return librosa.istft(y, hop_length=get_hop_size(hparams), win_length=hparams['win_size']) |
|
|
|
|
|
def librosa_pad_lr(x, fsize, fshift, pad_sides=1): |
|
'''compute right padding (final frame) or both sides padding (first and final frames) |
|
''' |
|
assert pad_sides in (1, 2) |
|
|
|
pad = (x.shape[0] // fshift + 1) * fshift - x.shape[0] |
|
if pad_sides == 1: |
|
return 0, pad |
|
else: |
|
return pad // 2, pad // 2 + pad % 2 |
|
|
|
|
|
|
|
def amp_to_db(x): |
|
return 20 * np.log10(np.maximum(1e-5, x)) |
|
|
|
|
|
def normalize(S, hparams): |
|
return (S - hparams['min_level_db']) / -hparams['min_level_db'] |
|
|