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进行了修改(主要是删除了一些内容,使程序更容易实现),修改后的文件可以点击这个链接下载。

浙公网安备 33010602011771号