import os import glob import wave import python_speech_features as ps import numpy as np import pickle def read_wavefile(filename): #开始读取wav文件 file = wave.open(filename,'r') params = file.getparams() #获取得到的所有参数 n_channels, samp_with, fram_rate, wav_length = params[:4] str_data = file.readframes(wav_length) wave_data = np.fromstring(str_data,dtype=np.short) time = np.arange(0,wav_length)*(1.0/fram_rate) file.close() return wave_data, time, fram_rate def read_IEMocap(): #设置数据库的路径 data_DIR = r"G:IEMOCAP_full_release" #设置训练数据和标签 train_data = [] train_label = [] #开始对数据库进行遍历过程 for speaker in os.listdir(data_DIR): """ 直接开始对每个进行搜索 并且设置缩小的范围 需要的数据进行查找 """ #因为还有其他的不是所需要的文件所以直接进行排除 if speaker[0] == 'S': #语音存储的文件夹 speech_subdir = os.path.join(data_DIR,speaker,"sentences\wav") #语音标记的文件夹 speech_labledir = os.path.join(data_DIR,speaker,"dialog\Emoevaluation") #将训练文件夹也保存 speech_file_dir = [] for sess in os.listdir(speech_subdir): #sess 代表的是每个单独的文件夹 里面包含着每个单独的txt文件所以需要单独读取 lable_text = speech_labledir+"\"+sess+".txt" #获取到了 然后开始读取,这时要知道 读取文件需要用个list 或者是字典来进行存取 emotion_lable = {} with open(lable_text,'r') as txt_read: """ 这里表达的是,文件读取第一行 看第一行如果有文件则进行保存对应的标签和结果 其中包含标注信息 直到文件最后读取结束 """ while True: line = txt_read.readline() if not line: break if (line[0] == '['): t = line.split() emotion_lable[t[3]] = t[4] #-------------------------------------------------------- """ 读取所有的音频文件 """ wava_file = os.path.join(speech_subdir,sess,'*wav') files= glob.glob(wava_file)#glob 主要是将目标的所有 来进行返回一个list集合 for filename in files: #开始读取speech文件内的信息了 文件标签 存储数据内容 wavaname = filename.split("\")[-1][:-4] #得到文件名 emotion = emotion_lable[wavaname] #通过对应来得到情感的对应标记 #这里开始筛选是不是你需要的文件类型 比如你只想要hap ang neu sad 不要fear 那就可以不用把这个fear放入 if emotion in ['hap','ang','neu','sad']: data, time, rate = read_wavefile(filename) mel_spec = ps.logfbank(data, rate, nfilt = 40)#滤波器的个数为40个 time = mel_spec.shape[0] print("开始对{}文件的计算".format(filename)) #开始对不满足时间少于300的进行padding 0 if time <=300: padding_data = mel_spec #后面补充0 #padding_data=np.pad(padding_data,((0,300-padding_data.shape[0]),(0,0)),'constant',constant_value=0) padding_data = np.pad(padding_data, ((0, 300 - padding_data.shape[0]), (0, 0)), 'constant', constant_values=0) train_data.append(padding_data) train_label.append(emotion) speech_file_dir.append(filename) else: begin = 0 end = 300 padding_data = mel_spec[begin:end,:] train_data.append(padding_data) train_label.append(emotion) speech_file_dir.append(filename) #写入pkl文件中 print("开始写入文件中") f = open('./IEMOCAP.pkl', 'wb') #将数据 放入pickle中保存 pickle.dump((train_data,train_label,speech_file_dir),f) f.close() print("写入完毕") pass def read_picklefile(): f = open('./IEMOCAP.pkl','rb') train_data,train_lable,speech_file = pickle.load(f) print(len(train_lable)) if __name__ == "__main__": read_picklefile()
这里是模型第一步将数据预处理
接来下是第二步将数据进行特征提取
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)