Spaces:
Running
Running
| from basis import ScoreBasis | |
| import numpy as np | |
| import librosa | |
| EPS = 1e-12 | |
| class LSD(ScoreBasis): | |
| def __init__(self): | |
| super(LSD, self).__init__(name='LSD') | |
| self.intrusive = False | |
| self.mono = True | |
| def windowed_scoring(self, audios, score_rate): | |
| if len(audios) != 2: | |
| raise ValueError('NB_PESQ needs a reference and a test signals.') | |
| est = wav_to_spectrogram(audios[1], score_rate) | |
| target = wav_to_spectrogram(audios[0], score_rate) | |
| return cal_LSD(est, target) | |
| def wav_to_spectrogram(wav, rate): | |
| hop_length = int(rate / 100) | |
| n_fft = int(2048 / (48000 / rate)) | |
| spec = np.abs(librosa.stft(wav, hop_length=hop_length, n_fft=n_fft)) | |
| spec = np.transpose(spec, (1, 0)) | |
| return spec | |
| def cal_LSD(est, target): | |
| log_ratio = np.log10(target**2 / ((est + EPS) ** 2) + EPS) ** 2 | |
| lsd_ = np.mean(np.mean(log_ratio, axis=1) ** 0.5, axis=0) | |
| return lsd_ | |