|
import torch
|
|
from torchaudio import load
|
|
|
|
from pesq import pesq
|
|
from pystoi import stoi
|
|
|
|
from .other import si_sdr, pad_spec
|
|
|
|
|
|
sr = 16000
|
|
snr = 0.5
|
|
N = 30
|
|
corrector_steps = 1
|
|
|
|
|
|
def evaluate_model(model, num_eval_files):
|
|
|
|
clean_files = model.data_module.valid_set.clean_files
|
|
noisy_files = model.data_module.valid_set.noisy_files
|
|
|
|
|
|
total_num_files = len(clean_files)
|
|
indices = torch.linspace(0, total_num_files-1, num_eval_files, dtype=torch.int)
|
|
clean_files = list(clean_files[i] for i in indices)
|
|
noisy_files = list(noisy_files[i] for i in indices)
|
|
|
|
_pesq = 0
|
|
_si_sdr = 0
|
|
_estoi = 0
|
|
|
|
for (clean_file, noisy_file) in zip(clean_files, noisy_files):
|
|
|
|
x, _ = load(clean_file)
|
|
y, _ = load(noisy_file)
|
|
T_orig = x.size(1)
|
|
|
|
|
|
norm_factor = y.abs().max()
|
|
y = y / norm_factor
|
|
|
|
|
|
Y = torch.unsqueeze(model._forward_transform(model._stft(y.cuda())), 0)
|
|
Y = pad_spec(Y)
|
|
y = y * norm_factor
|
|
|
|
|
|
sampler = model.get_pc_sampler(
|
|
'reverse_diffusion', 'ald', Y.cuda(), N=N,
|
|
corrector_steps=corrector_steps, snr=snr)
|
|
sample, _ = sampler()
|
|
|
|
x_hat = model.to_audio(sample.squeeze(), T_orig)
|
|
x_hat = x_hat * norm_factor
|
|
|
|
x_hat = x_hat.squeeze().cpu().numpy()
|
|
x = x.squeeze().cpu().numpy()
|
|
y = y.squeeze().cpu().numpy()
|
|
|
|
_si_sdr += si_sdr(x, x_hat)
|
|
_pesq += pesq(sr, x, x_hat, 'wb')
|
|
_estoi += stoi(x, x_hat, sr, extended=True)
|
|
|
|
return _pesq/num_eval_files, _si_sdr/num_eval_files, _estoi/num_eval_files
|
|
|
|
|