模型训练前,一定要对数据处理熟悉!
ztj100 2024-11-21 00:29 19 浏览 0 评论
在开始模型训练前,一定要对数据处理熟悉!
一、预处理:
1、IEMOCAP语音数据部份
根据人(1F,1M,2F,2M,3F,3M,4F,4M,5F,5M):
ang有语音数目:[147,82,67,70,92,148,205,122,78,92]
exc有语音数目:[63,80,96,114,48,103,154,84,82,217]
hap有语音数目:[69,66,70,47,80,55,31,34,77,66]
neu有语音数目:[171,213,135,227,130,190,76,182,221,163]
sad有语音数目:[78,116,113,84,172,133,62,81,132,113]
混和:
ang有语音数目:1103exc有语音数目:1041hap有语音数目:595
neu有语音数目:1708sad有语音数目:1084总共5531条
若果是4490条的话,就是除去了exc的1041条。
在可以看见这个5分类各自的语音数目并不是很均衡。一大多数SER论文是做四分类即,'ang','hap','neu','sad',把'hap'与'exc'语音合并。那我也做4分类的SER,以便后期与其他论文的模型性能的比较。
2、数据界定
大多数论文笔用5折交叉验证或则10折交叉验证。
K折交叉验证:把数据平均分成k等份,每次实验拿一份做测试,其余用做训练。实验k次求平均值。如5折交叉验证就是把数据平均分成5等份,每次实验拿一份做测试,其余用做训练。实验5次求平均值。
在IEMOCAP上的SER论文实验有speakerindependent与speakerdependent之分:
(1)speakerdependent(SD):若采用5折交叉验证法,将语音情感数据库中的所有数据随机搅乱,之后平均成5份,逐一选定1份作为测试数据,其他4份做训练数据,最后将得到的确切率求和取平均。这么重复5次5折交叉验证,之后再求和取平均。
(2)speakerindependent(SI):将IEMOCAP中逐一选定不同的说话人做测试数据,其他说话人做训练数据,最后将每位人的语音情感辨识确切率求和取平均;若采用5倍交叉验证,按照说话人的数目以80%:20%的比列分割数据,80%的数据用于模型训练,剩余的数据用于模型测试。具体就是:IEMOCAP有10个人,1/2/3/4/5/6/7/8-thperson做训练集(80%),9/10-th做测试集(20%);1/2/3/4/5/6/9/10-thperson做训练集(80%),7/8-th做测试集(20%);1/2/3/4/7/8/9/10-thperson做训练集(80%),5/6-th做测试集(20%);1/2/5/6/7/8/9/10-thperson做训练集(80%),3/4-th做测试集(20%);3/4/5/6/7/8/9/10-thperson做训练集(80%),1/2-th做测试集(20%)。这与根据session做5折交叉验证类似了。
IEMOCAP有5个session:1/2/3/4/5,比较非常,一个session里有两个人,所以假如依照session做5折交叉验证的话就相当于speakerindependent了。
按session的5折交叉验证:
fold1:2/3/4/5-thsession组成训练集,1-thsession为测试集;
fold2:1/3/4/5-thsession组成训练集,2-thsession为测试集;
fold3:1/2/4/5-thsession组成训练集,3-thsession为测试集;
fold4:1/2/3/5-thsession组成训练集,4-thsession为测试集;
fold5:1/2/3/4-thsession组成训练集,5-thsession为测试集;
本次实验策略采用SI,说话人独立的策略。
3、特征提取
常用的特点:语谱图、MFCC等。语谱图(语音频谱图):有线性频谱图、梅尔频谱图、log-Mel频谱图。
此次我就提取梅尔频谱图:
(1)首先把IEMOCAP的语音统一到相同宽度,这儿我统一到2秒,即把一条语音切分成2秒一段,重叠1.6秒;不足2秒的语音用0补充。
def cut_wav(wav, seg_length, overlap, rate):
"""波形数据切割"""
seg_len_points = seg_length * rate # 一个segment所包含的采样点数
seg_overlap_points = overlap * rate # segment重叠的采样点数
seg_hop_points = (seg_length - overlap) * rate # segment移动
start = 0 # 开始指针
end = start + seg_len_points # 结尾指针
segs = [] # 存储切分片段的
# 一段语音可被分割的数量
seg_num = int((len(wav) - seg_len_points + seg_hop_points) / seg_hop_points)
# 长度不足一个片段的补零处理
if len(wav) < seg_len_points:
segs.append(np.hstack([wav, np.array([0] * (seg_len_points - len(wav)))]))
# segs.append(wav)
for _ in range(seg_num): # 从头开始切分
segs.append(wav[int(start): int(end)]) # 添加新片段
start += seg_hop_points # 更新起始指针
end = start + seg_len_points # 更新结尾指针
return segs
(2)预加重:
def pre_emphasis(signal): # 定义预加重函数
pre_emphasis = 0.97
emphasized_signal = np.append(signal[0],signal[1:] - pre_emphasis * signal[: -1])
return emphasized_signal # 返回预加重以后的采样数组
(3)生成梅尔语谱图:先librosa.load加载语音;之后调用cut_wav把语音切分成2秒一段,该函数返回一条语音的所有段;循环,对每一个语音段seg执行:预加重,stft变换,np.abs,平方,mel混频器组,dot,power_to_db操作,就可以得到mel-spectrum;最后生成图象。
def get_spectrogram(root_path, new_path):
emos = ['ang', 'exc', 'hap', 'neu', 'sad']
label_dict = {'ang': 0, 'exc': 1, 'hap': 1, 'neu': 2, 'sad': 3} # 把exc与hap合并
fold_name = ["Session1F", "Session1M", "Session2F", "Session2M", "Session3F",
"Session3M", "Session4F", "Session4M", "Session5F", "Session5M"]
print("数据收集阶段:")
time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(time)
for name in fold_name: # 遍历每一折文件夹
for emo in emos: # 遍历每一种情感
files = os.listdir(os.path.join(root_path, name, emo)) # 列出该折中该类情感的文件
for f_name in files: # 针对每一个wav文件#D:\Workspace\FLDNetOnIEMOCAP\IEMOCAP\Session1F\ang\Ses01F_impro01_F012.wav
f_path = os.path.join(root_path, name, emo, f_name) # 获取文件名
print(f_path)
(sig, rate) = librosa.load(f_path, sr=16000)
print(len(sig))
segs = cut_wav(sig, seg_length=2, overlap=1.6, rate=rate) # 切分波形数组为2s长,重叠1.6s片段
for i, seg in enumerate(segs):
y = pre_emphasis(seg) # 预加重
# 对每一段(2秒)segment进行变换
linear = librosa.stft(y=y, n_fft=1024, hop_length=512)
mag = np.abs(linear) # (1+n_fft//2, T) 复数的实部:np.abs(D(f,t))频率的振幅
mag = mag ** 2 # 平方
mel_basis = librosa.filters.mel(sr = rate, n_fft=1024, n_mels=40) # (n_mels, 1+n_fft//2) 梅尔谱矩阵
mel = np.dot(mel_basis, mag) # (n_mels, t) 梅尔谱=梅尔谱矩阵*幅度谱矩阵 mel spectrogram
mel = librosa.power_to_db(mel) # mel-spec
# logmelspec = librosa.amplitude_to_db(melspec) # 转换到对数刻度
plt.figure(figsize=(3, 3)) #
librosa.display.specshow(mel, y_axis='mel', fmax=8000, x_axis='time', sr=rate) # ???
# plt.title('Mel spectrogram')
plt.axis('off') # 关闭坐标轴
before = f_path[: -4] # 前缀D:\Workspace\FLDNetOnIEMOCAP\IEMOCAP\Session1F\ang\Ses01F_impro01_F012
seg_name = before + "-" + str(i) + ".png"
save_path = os.path.join(new_path, name, emo) # 存储路径创建
if not os.path.exists(save_path):
os.makedirs(save_path)
plt.savefig(os.path.join(save_path, seg_name.split('\\')[-1]), bbox_inches='tight', pad_inches=0)
# seg_name.split('\\')[-1] 就是Ses01F_impro01_F012
plt.close()
右图显示,session1F中impro04_F031语音的第四段的梅尔语谱图:Ses01F_impro04_F031-3
最后得到的数据结构:
fold0:训练集:1-8-thperson的梅尔语谱图测试集:9-10-thperson的语谱图
fold1:训练集:1-8-thperson的梅尔语谱图测试集:9-10-thperson的语谱图
fold2:训练集:1-8-thperson的梅尔语谱图测试集:9-10-thperson的语谱图
fold3:训练集:1-8-thperson的梅尔语谱图测试集:9-10-thperson的语谱图
fold4:训练集:1-8-thperson的梅尔语谱图测试集:9-10-thperson的语谱图
相关推荐
- WPS 隐藏黑科技!OCT2HEX 函数用法全攻略,数据转换不再愁
-
WPS隐藏黑科技!OCT2HEX函数用法全攻略,数据转换不再愁在WPS表格的强大函数库中,OCT2HEX函数堪称数据进制转换的“魔法钥匙”。无论是程序员处理代码数据,还是工程师进行电路设计...
- WPS 表格隐藏神器!LEFTB 函数让文本处理更高效
-
WPS表格隐藏神器!LEFTB函数让文本处理更高效在职场办公和日常数据处理中,WPS表格堪称我们的得力助手,而其中丰富多样的函数更是提升效率的关键。今天,要为大家介绍一个“宝藏函数”——LEF...
- Java lombok 使用教程(lombok.jar idea)
-
简介Lombok是...
- PART 48: 万能结果自定义,SWITCH函数!
-
公式解析SWITCH:根据值列表计算表达式并返回与第一个匹配值对应的结果。如果没有匹配项,则返回可选默认值用法解析1:评级=SWITCH(TRUE,C2>=90,"优秀",C2...
- Excel 必备if函数使用方法详解(excel表if函数使用)
-
excel表格if函数使用方法介绍打开Excel,在想输出数据的单元格点击工具栏上的“公式”--“插入函数”--“IF”,然后点击确定。...
- Jetty使用场景(jetty入门)
-
Jetty作为一款高性能、轻量级的嵌入式Web服务器和Servlet容器,其核心优势在于模块化设计、快速启动、低资源消耗...
- 【Java教程】基础语法到高级特性(java语言高级特性)
-
Java作为一门面向对象的编程语言,拥有清晰规范的语法体系。本文将系统性地介绍Java的核心语法特性,帮助开发者全面掌握Java编程基础。...
- WPS里这个EVEN 函数,90%的人都没用过!
-
一、开篇引入在日常工作中,我们常常会与各种数据打交道。比如,在统计员工绩效时,需要对绩效分数进行一系列处理;在计算销售数据时,可能要对销售额进行特定的运算。这些看似简单的数据处理任务,实则隐藏着许多技...
- 64 AI助力Excel,查函数查用法简单方便
-
在excel表格当中接入ai之后会是一种什么样的使用体验?今天就跟大家一起来分享一下小程序商店的下一步重大的版本更新。下一个版本将会加入ai功能,接下来会跟大家演示一下基础的用法。ai功能规划的是有三...
- python入门到脱坑 函数—函数的调用
-
Python函数调用详解函数调用是Python编程中最基础也是最重要的操作之一。下面我将详细介绍Python中函数调用的各种方式和注意事项。...
- 从简到繁,一文说清vlookup函数的常见用法
-
VLOOKUP函数是Excel中常用的查找与引用函数,用于在表格中按列查找数据。本文将从简单到复杂,逐步讲解VLOOKUP的用法、语法、应用场景及注意事项。一、VLOOKUP基础:快速入门1.什么是...
- Java新特性:Lambda表达式(java lambda表达式的3种简写方式)
-
1、Lambda表达式概述1.1、Lambda表达式的简介Lambda表达式(Lambdaexpression),也可称为闭包(Closure),是Java(SE)8中一个重要的新特性。Lam...
- WPS 冷门却超实用!ODD 函数用法大揭秘,轻松解决数据处理难题
-
WPS冷门却超实用!ODD函数用法大揭秘,轻松解决数据处理难题在WPS表格庞大的函数家族里,有一些函数虽然不像SUM、VLOOKUP那样广为人知,却在特定场景下能发挥出令人惊叹的作用,OD...
- Python 函数式编程的 8 大核心技巧,不允许你还不会
-
函数式编程是一种强调使用纯函数、避免共享状态和可变数据的编程范式。Python虽然不是纯函数式语言,但提供了丰富的函数式编程特性。以下是Python函数式编程的8个核心技巧:...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)