def validate_with_metrics(self, net, eval_loader): print( '********** Started metrics evaluation on validation set ********') accu_stoi = 0.0 accu_pesq = 0.0 accu_snr = 0.0 net.eval() with torch.no_grad(): mtime = 0. ttime = 0. count = 0. for k, (mix_raw, cln_raw) in enumerate(eval_loader): start = timeit.default_timer() est_s = self.eval_forward(mix_raw, net) # <class 'tuple'>: (70656,) est_s = est_s[:mix_raw.size] # <class 'tuple'>: (70537,) ideal_s = cln_raw # <class 'tuple'>: (70537,) # 主要就是得到est_s和ideal_s,把他俩能逆变换成语音,注意cln_raw st = stoi(cln_raw, est_s, self.srate) sn = snr(cln_raw, est_s) accu_stoi += st accu_snr += sn est_path = os.path.join(self.wav_path, '{}_est.wav'.format(k + 1)) ideal_path = os.path.join(self.wav_path, '{}_ideal.wav'.format(k + 1)) sf.write(est_path, normalize_wav(est_s)[0], self.srate) sf.write(ideal_path, normalize_wav(ideal_s)[0], self.srate) pe = getPESQ(self.tool_path, ideal_path, est_path) accu_pesq += pe count += 1 # print('{}, STOI: {:.4f}, SNR: {:.4f}, PESQ: {:.4f}'.format(k+1, st, sn, pe)) avg_stoi = accu_stoi / count avg_snr = accu_snr / count avg_pesq = accu_pesq / count net.train() return avg_stoi, avg_snr, avg_pesq
def getSTOI(self): for i in range(len(self.assess_list)): #print '\n[%d/%d] Assess on %s...' % ((i+1),len(self.assess_list), self.assess_list[i]) start1 = timeit.default_timer() print('') print('{}/{}, Started assess on {} ...'.format(i+1, len(self.assess_list), self.assess_list[i])) print('') f_mix = h5py.File(os.path.join(self.test_mixture_path, self.assess_list[i]+'_mix.dat'), 'r') f_s = h5py.File(os.path.join(self.test_mixture_path, self.assess_list[i]+'_s.dat'), 'r') f_est_s = h5py.File(os.path.join(self.prediction_path, self.assess_list[i]+'_s_est.dat'), 'r') f_ideal_s = h5py.File(os.path.join(self.prediction_path, self.assess_list[i]+'_s_ideal.dat'), 'r') # create arrays for stoi and snr est_stoi_s_accu = 0.0 ideal_stoi_s_accu = 0.0 mix_stoi_s_accu = 0.0 est_snr_s_accu = 0.0 ideal_snr_s_accu = 0.0 mix_snr_s_accu = 0.0 for j in range(self.num_test_sentences): mix = f_mix[str(j)][:] s = f_s[str(j)][:] est_s = f_est_s[str(j)][:] ideal_s = f_ideal_s[str(j)][:] # compute stoi est_stoi_s = stoi(s, est_s, self.srate) ideal_stoi_s = stoi(s, ideal_s, self.srate) mix_stoi_s = stoi(s, mix, self.srate) # compute snr est_snr_s = snr(s, est_s) ideal_snr_s = snr(s, ideal_s) mix_snr_s = snr(s, mix) # compute accu of them est_stoi_s_accu += est_stoi_s ideal_stoi_s_accu += ideal_stoi_s mix_stoi_s_accu += mix_stoi_s est_snr_s_accu += est_snr_s ideal_snr_s_accu += ideal_snr_s mix_snr_s_accu += mix_snr_s print('#' * 5) print('{}/{}, mix_stoi = {:.4f}, ideal_stoi = {:.4f}, est_stoi = {:.4f}'.format(j +1, self.num_test_sentences, mix_stoi_s, ideal_stoi_s, est_stoi_s)) print('{}/{}, mix_snr = {:.4f}, ideal_snr = {:.4f}, est_snr = {:.4f}'.format(j+1, self.num_test_sentences, mix_snr_s, ideal_snr_s, est_snr_s)) mix_norm, scale_mix = normalize_wav(mix) est_s_norm, scale_est_s = normalize_wav(est_s) ideal_s_norm, scale_ideal_s = normalize_wav(ideal_s) s_norm, scale_s = normalize_wav(s) # save them into wav files filepath = os.path.join(self.wav_path, self.assess_list[i]) if not os.path.isdir(filepath): os.makedirs(filepath) filename_mix = '%d_mix.wav' % (j) filename_s_est = '%d_s_est.wav' % (j) filename_s_ideal = '%d_s_ideal.wav' % (j) filename_s = '%d_s.wav' % (j) sf.write(os.path.join(filepath, filename_mix), mix_norm,int(self.srate)) sf.write(os.path.join(filepath, filename_s_est), est_s_norm,int(self.srate)) sf.write(os.path.join(filepath, filename_s_ideal), ideal_s_norm,int(self.srate)) sf.write(os.path.join(filepath, filename_s), s_norm,int(self.srate)) #bar.finish() f_mix.close() f_s.close() f_est_s.close() f_ideal_s.close() mix_stoi_s_ave = mix_stoi_s_accu / float(self.num_test_sentences) ideal_stoi_s_ave = ideal_stoi_s_accu / float(self.num_test_sentences) est_stoi_s_ave = est_stoi_s_accu / float(self.num_test_sentences) mix_snr_s_ave = mix_snr_s_accu / float(self.num_test_sentences) ideal_snr_s_ave = ideal_snr_s_accu / float(self.num_test_sentences) est_snr_s_ave = est_snr_s_accu / float(self.num_test_sentences) end1 = timeit.default_timer() print('') print('{}/{}, Finished assess on {}. time taken = {:.4f}'.format(i+1, len(self.assess_list), self.assess_list[i], end1 - start1)) print('') print('#'*100) print('#'*100) print('mix_stoi: %.4f | ideal_stoi: %.4f | mix_stoi: %.4f' % (mix_stoi_s_ave, ideal_stoi_s_ave, est_stoi_s_ave)) print('mix_snr: %.2f | ideal_snr: %.2f | mix_snr: %.2f' % (mix_snr_s_ave, ideal_snr_s_ave, est_snr_s_ave)) print('#'*100) print('#'*100)