IEMOCAP-数据集文件预处理

IEMOCAP-数据集文件预处理,第1张

IEMOCAP-数据文件预处理
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()

这里是模型第一步将数据预处理
接来下是第二步将数据进行特征提取

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5625408.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存