TIMIT数据集拼接(只使用SI部分),比较暴力

TIMIT数据集拼接(只使用SI部分)

在离线语音分离等语音信号处理领域,因采用最大似然对参数进行估计,所以要求语音长度不能太短,在看到的一些论文中作者常常将语音拼接为8s、10s、20s的长度。TIMIT数据集作为语音信号处理领域广泛使用的语音数据集,但其语音长度不一,大多比较短,故需要对数据集中的语音按照说话人进行拼接。因本人主要研究语音分离,故只采用每人说不同句子的SI部分。程序实现的主要思路是
在给定男性与女性说话人的数量后,则按照给定的语音范围进行拼接,因为每个人有三句语音,相当于一个组合问题,按顺序原来的语音为A、B、C,那么可能的组合有[(A),(B),(C),(AB),(AC),(BC),(ABC)],则这些组合按照判断的先后顺序,选取符合长度要求的组合。

代码如下:

import numpy as np
import soundfile as sf


def gen_all_wav_file(file_path):
    file_spkrinfo = []
    file_spkrsent = []
    file_name = []
    file_sex = []
    spkr_num = 630
    sntns_num = 3
    path_dict = {
        'TRN': 'TRAIN',  # 将txt文件中的名称映射到路径名称
        'TST': 'TEST'
    }
    with open(file_path + 'spkr_info.txt', 'r') as f:
        for line in f.readlines():
            line = line.strip('\n')
            line = line.split()
            file_spkrinfo.append(line)
    with open(file_path + 'spkr_sent.txt', 'r') as f:
        for line in f.readlines():
            line = line.strip('\n')
            line = line.split()
            file_spkrsent.append(line)
    for n in range(spkr_num):  # 拼接完整的文件路径
        file_sex.append(file_spkrinfo[n][1])
        for s in range(sntns_num):
            file_name.append('{}\\DR{}\\{}{}\\SI{}.wav'.format(path_dict[file_spkrinfo[n][3]],
                             file_spkrinfo[n][2], file_spkrinfo[n][1],
                             file_spkrinfo[n][0], file_spkrsent[n][-(s + 1)]))
    return file_name, file_sex


if __name__ == '__main__':

    file_path = 'E:\\PythonWorkSpace\\timit_concat\\TIMIT\\'
    file_name, file_sex = gen_all_wav_file(file_path)
    flag = 0  # 若不满足所要求长度则置1

    female_num = 50  # 女生数量
    female_cnt = 0  # 计数用
    male_cnt = 0  # 计数用
    male_num = 50

    len_sec_l = 4.8  # 下界 单位:秒
    len_sec_u = 5.2  # 上界

    max_len = 1
    wav_num = 0
    for n in range(0, 630 * 3, 3):  # 每人三句话
        wav0, sample_rate = sf.read(file_path + file_name[n])
        wav1, _ = sf.read(file_path + file_name[n + 1])
        wav2, _ = sf.read(file_path + file_name[n + 2])
        len0 = wav0.shape[0]
        len1 = wav1.shape[0]
        len2 = wav2.shape[0]
        len_sample_l = len_sec_l * sample_rate
        len_sample_u = len_sec_u * sample_rate
        if len_sample_l < len0 < len_sample_u:
            wav = wav0
        elif len_sample_l < len1 < len_sample_u:
            wav = wav1
        elif len_sample_l < len2 < len_sample_u:
            wav = wav2
        elif len_sample_l < (len0 + len1) < len_sample_u:
            wav = np.concatenate((wav0, wav1))
        elif len_sample_l < (len1 + len2) < len_sample_u:
            wav = np.concatenate((wav1, wav2))
        elif len_sample_l < (len0 + len2) < len_sample_u:
            wav = np.concatenate((wav0, wav2))
        elif len_sample_l < (len0 + len1 + len2) < len_sample_u:
            wav = np.concatenate((wav0, wav1, wav2))
        else:
            flag = 1
        if flag == 0:
            if file_sex[n // 3] == 'F' and female_cnt < female_num:
                print(wav.shape[0] / 16000)
                sf.write('E:\\PythonWorkSpace\\timit_concat\\wav_concated\\' + str(wav_num) + 
                         '.wav', wav, sample_rate)
                sf.write('E:\\PythonWorkSpace\\timit_concat\\wav_concated\\' + str(wav_num) + 
                         '_' + 'F.wav', wav,
                         sample_rate)
                female_cnt += 1
                wav_num += 1
            elif file_sex[n // 3] == 'M' and male_cnt < male_num:
                print(wav.shape[0] / 16000)
                sf.write('E:\\PythonWorkSpace\\timit_concat\\wav_concated\\' + str(wav_num) + 
                         '.wav', wav, sample_rate)
                sf.write('E:\\PythonWorkSpace\\timit_concat\\wav_concated\\' + str(wav_num) + 
                         '_' + 'M.wav', wav, sample_rate)
                male_cnt += 1
                wav_num += 1
        flag = 0
    print(wav_num)

为了程序实现的需要,对TIMIT数据集中原有的SPKRINFO.TXT和SPKRSENT.TXT进行了修改(主要是删除了一些内容,使程序更容易实现),修改后的文件可以点击这个链接下载。

posted @ 2022-07-03 20:37  大鱼dayu  阅读(284)  评论(0)    收藏  举报