Example #1
0
    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
Example #2
0
    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)