Example #1
0
def eval_si_sdr(ori_dir, mdl_dir):
    s1_dir = join(ori_dir, 's1')
    s2_dir = join(ori_dir, 's2')
    # mix_dir = join(ori_dir, 'mix')
    es_dir = join(mdl_dir, 'wav')
    print('Compute SI-SDR for {} ...'.format(basename(mdl_dir)))

    # wavs = [ f for f in os.listdir(s1_dir) if isfile(join(s1_dir, f)) ]
    wavs = est_list_prep(es_dir)

    SI_SDR = []
    FF_SDR = []
    MM_SDR = []
    MF_SDR = []
    SG_SDR = []

    for i in range(len(wavs)):
        name = wavs[i][0:-4]
        est_wav1, _ = wavread(join(es_dir, name + '_1.wav'))
        est_wav2, _ = wavread(join(es_dir, name + '_2.wav'))
        # est_wav1, _ = wavread(join(mix_dir, name + '.wav'))
        # est_wav2, _ = wavread(join(mix_dir, name + '.wav'))

        ori_wav1, _ = wavread(join(s1_dir, name + '.wav'))
        ori_wav2, _ = wavread(join(s2_dir, name + '.wav'))

        min_len = min(np.size(est_wav1), np.size(ori_wav1))
        est_wav1, est_wav2 = est_wav1[:min_len], est_wav2[:min_len]
        ori_wav1, ori_wav2 = ori_wav1[:min_len], ori_wav2[:min_len]

        si_sdr = permute_si_sdr(est_wav1, est_wav2, ori_wav1, ori_wav2)
        SI_SDR.append(si_sdr)
        name = name.strip().split('_')
        spk1_gender = spk2gender_dict[name[0][0:3]]
        spk2_gender = spk2gender_dict[name[2][0:3]]
        if spk1_gender == 'F' and spk2_gender == 'F':
            FF_SDR.append(si_sdr)
            SG_SDR.append(si_sdr)
        elif spk1_gender == 'M' and spk2_gender == 'M':
            MM_SDR.append(si_sdr)
            SG_SDR.append(si_sdr)
        else:
            MF_SDR.append(si_sdr)

    mean_si_sdr = np.mean(np.array(SI_SDR)) if SI_SDR else 0.0
    mean_ff_sdr = np.mean(np.array(FF_SDR)) if FF_SDR else 0.0
    mean_mm_sdr = np.mean(np.array(MM_SDR)) if MM_SDR else 0.0
    mean_mf_sdr = np.mean(np.array(MF_SDR)) if MF_SDR else 0.0
    mean_sg_sdr = np.mean(np.array(SG_SDR)) if SG_SDR else 0.0

    print('=' * 20,  'SI-SDR (dB)', '='  * 20)
    print('The SI-SDR for Male & Female is {:.4f}'.format(mean_mf_sdr))
    print('The SI-SDR for Female & Female is {:.4f}'.format(mean_ff_sdr))
    print('The SI-SDR for Male & Male is {:.4f}'.format(mean_mm_sdr))
    print('The SI-SDR for the Same Gender is {:.4f}'.format(mean_sg_sdr))
    print('The mean SI-SDR is {:.4f}'.format(mean_si_sdr))
    sys.stdout.flush()
Example #2
0
def readwav(line):
    key, path = line.strip().split()
    wav, frame_rate = wavread(path)
    return key, wav
Example #3
0
def eval_si_sdr(ori_dir, mdl_dir):
    s1_dir = join(ori_dir, 's1')
    s2_dir = join(ori_dir, 's2')
    # es_dir = join(ori_dir, 'mix')
    es_dir = join(mdl_dir, 'wav')
    print('Compute SI-SDR for {} ...'.format(basename(mdl_dir)))

    # wavs = [ f for f in os.listdir(s1_dir) if isfile(join(s1_dir, f)) ]
    # wavs = est_list_prep(es_dir)
    SI_SDR = []
    FF_SDR = []
    MM_SDR = []
    MF_SDR = []
    SG_SDR = []

    # for i in range(len(wavs)):
    for line in open(
            "/home/work_nfs/yhfu/workspace/multichannel_enhancement/data_dual_channel_-5-5sdr/tt_channel1/test_3000.txt"
    ):
        name = line[0:-1]
        est_wav1, _ = wavread(join(es_dir, name))

        #est_wav2, _ = wavread(join(es_dir, name + '_2.wav'))
        # est_wav1, _ = wavread(join(mix_dir, name + '.wav'))
        # est_wav2, _ = wavread(join(mix_dir, name + '.wav'))

        ori_wav1, _ = wavread(join(s1_dir, name))
        #ori_wav2, _ = wavread(join(s2_dir, name + '.wav'))

        min_len = min(np.size(est_wav1), np.size(ori_wav1))
        est_wav1 = est_wav1[:min_len]
        ori_wav1 = ori_wav1[:min_len]
        # est_wav1, est_wav2 = est_wav1[:min_len], est_wav2[:min_len]
        # ori_wav1, ori_wav2 = ori_wav1[:min_len], ori_wav2[:min_len]

        si_sdr = permute_si_sdr_single(est_wav1, ori_wav1)
        SI_SDR.append(si_sdr)
        # name = name.strip().split('_')
        # spk1_gender = spk2gender_dict[name[0][0:3]]
        # spk2_gender = spk2gender_dict[name[2][0:3]]
        # if spk1_gender == 'F' and spk2_gender == 'F':
        #     FF_SDR.append(si_sdr)
        #     SG_SDR.append(si_sdr)
        # elif spk1_gender == 'M' and spk2_gender == 'M':
        #     MM_SDR.append(si_sdr)
        #     SG_SDR.append(si_sdr)
        # else:
        #     MF_SDR.append(si_sdr)

    mean_si_sdr = np.mean(np.array(SI_SDR)) if SI_SDR else 0.0
    # mean_ff_sdr = np.mean(np.array(FF_SDR)) if FF_SDR else 0.0
    # mean_mm_sdr = np.mean(np.array(MM_SDR)) if MM_SDR else 0.0
    # mean_mf_sdr = np.mean(np.array(MF_SDR)) if MF_SDR else 0.0
    # mean_sg_sdr = np.mean(np.array(SG_SDR)) if SG_SDR else 0.0

    print('=' * 20, 'SI-SDR (dB)', '=' * 20)
    # print('The SI-SDR for Male & Female is {:.4f}'.format(mean_mf_sdr))
    # print('The SI-SDR for Female & Female is {:.4f}'.format(mean_ff_sdr))
    # print('The SI-SDR for Male & Male is {:.4f}'.format(mean_mm_sdr))
    # print('The SI-SDR for the Same Gender is {:.4f}'.format(mean_sg_sdr))
    print('The mean SI-SDR is {:.4f}'.format(mean_si_sdr))
    sys.stdout.flush()
def eval_sdr_sources(ori_dir, mdl_dir):
    s1_dir = join(ori_dir, 's1')
    s2_dir = join(ori_dir, 's2')
    # mix_dir = join(ori_dir, 'mix')
    es_dir = join(mdl_dir, 'wav')
    print('Compute SDR.sources for {} ...'.format(basename(mdl_dir)))

    # wavs = [ f for f in os.listdir(s1_dir) if isfile(join(s1_dir, f)) ]
    wavs = est_list_prep(es_dir)

    SDR = []
    FF_SDR = []
    MM_SDR = []
    MF_SDR = []
    SG_SDR = []

    for i in range(len(wavs)):
        name = wavs[i][0:-4]
        est_wav1, _ = wavread(join(es_dir, name + '_1.wav'))
        est_wav2, _ = wavread(join(es_dir, name + '_2.wav'))
        # est_wav1, _ = wavread(join(mix_dir, name + '.wav'))
        # est_wav2, _ = wavread(join(mix_dir, name + '.wav'))

        ori_wav1, _ = wavread(join(s1_dir, name + '.wav'))
        ori_wav2, _ = wavread(join(s2_dir, name + '.wav'))

        min_len = min(np.size(est_wav1), np.size(ori_wav1))
        est_wav1, est_wav2 = est_wav1[:min_len], est_wav2[:min_len]
        ori_wav1, ori_wav2 = ori_wav1[:min_len], ori_wav2[:min_len]

        est_wav1 = est_wav1.reshape(-1, 1)
        est_wav2 = est_wav2.reshape(-1, 1)
        ori_wav1 = ori_wav1.reshape(-1, 1)
        ori_wav2 = ori_wav2.reshape(-1, 1)

        reference_sources = np.stack((ori_wav1, ori_wav2), axis=0)
        estimated_sources = np.stack((est_wav1, est_wav2), axis=0)

        # pdb.set_trace()
        (sdr, sir, sar,
         perm) = museval.metrics.bss_eval_sources(reference_sources,
                                                  estimated_sources)
        sdr_back = sdr
        sdr = np.mean(sdr_back)
        if np.isnan(sdr):
            sdr = np.mean(np.nan_to_num(sdr_back))
        SDR.append(sdr)
        name = name.strip().split('_')
        spk1_gender = spk2gender_dict[name[0][0:3]]
        spk2_gender = spk2gender_dict[name[2][0:3]]
        if spk1_gender == 'F' and spk2_gender == 'F':
            FF_SDR.append(sdr)
            SG_SDR.append(sdr)
        elif spk1_gender == 'M' and spk2_gender == 'M':
            MM_SDR.append(sdr)
            SG_SDR.append(sdr)
        else:
            MF_SDR.append(sdr)

    mean_sdr = np.mean(np.array(SDR)) if SDR else 0.0
    mean_ff_sdr = np.mean(np.array(FF_SDR)) if FF_SDR else 0.0
    mean_mm_sdr = np.mean(np.array(MM_SDR)) if MM_SDR else 0.0
    mean_mf_sdr = np.mean(np.array(MF_SDR)) if MF_SDR else 0.0
    mean_sg_sdr = np.mean(np.array(SG_SDR)) if SG_SDR else 0.0

    print('=' * 20, 'SDR.sources (dB)', '=' * 20)
    print('The SDR for Male & Female is {:.4f}'.format(mean_mf_sdr))
    print('The SDR for Female & Female is {:.4f}'.format(mean_ff_sdr))
    print('The SDR for Male & Male is {:.4f}'.format(mean_mm_sdr))
    print('The SDR for the Same Gender is {:.4f}'.format(mean_sg_sdr))
    print('The mean SDR is {:.4f}'.format(mean_sdr))
    print('=' * 20, 'SDRi.sources (dB)', '=' * 20)
    print('The SDRi for Male & Female is {:.4f}'.format(mean_mf_sdr - 0.1524))
    print('The SDRi for Female & Female is {:.4f}'.format(mean_ff_sdr -
                                                          0.1619))
    print('The SDRi for Male & Male is {:.4f}'.format(mean_mm_sdr - 0.1452))
    print('The SDRi for the Same Gender is {:.4f}'.format(mean_sg_sdr -
                                                          0.1496))
    print('The mean SDRi is {:.4f}'.format(mean_sdr - 0.1510))
    sys.stdout.flush()