RawNet代码解析
Github代码地址
代码路径:RawNet\RawNet-master\keras
下载好Voxceleb1的数据集,经过00-pre_process_waveforms.py预处理,再用01-trn_RawNet.py训练,然后用02-trn_bvec.py验证。
【遇到的问题】
- 01-trn_RawNet.py跑aishell1数据集,需要自动生成trials.txt(test数据)和val_trials.txt(dev数据)。里面有三列:target, spkMd, utt。
spkMd和utt为语音的相对路径,如test/S0916/BAC009S0916W0495.wav,target为spkMd与utt这两段语音是否为同一人的真实值(0或者1)。
【完成】
Aishell1
trials.txt:len:7176, 其中匹配个数:384,不匹配个数:6792。
val_trials.txt:len:14331, 其中匹配个数:357,不匹配个数:13974
VoxCeleb1
trials.txt:len:4874, 其中匹配个数:21,不匹配个数:4853
val_trials.txt:len:148642, 其中匹配个数:12,不匹配个数:148630
【注意】可能需要更改trails.txt和val_trails.txt,不平衡。
【解决】trials.txt,val_trials.txt存在问题,voxceleb1数据集需要划分为dev,train,test,然后再跑test.py得到trials.txt和val_trials.txt。
【完成】
trials.txt:len:7137, 其中匹配个数:21,不匹配个数:4853
val_trials.txt:len:16404, 其中匹配个数:171,不匹配个数:148630
VCTK
trials.txt:len:1858, 其中匹配个数:170,不匹配个数:6967
val_trials.txt:len:4151, 其中匹配个数:425,不匹配个数:16233
- 改代码路径。
dev_scp:/hehua/DB/Aishell1/scp/train/train_wav_pe.scp
eval_scp: /hehua/DB/Aishell1/scp/test/test_wav_pe.scp
还需要增加一个验证路径(val_scp): /hehua/DB/Aishell1/scp/dev/dev_wav_pe.scp(代码中的变量:153行的val_lines)
【完成】 - 01-trn_RawNet.py的104行代码assert _nb_samp >= nb_samp,不懂参数意义,注释了该行代码,采样率吗?
【已处理】取消注释,略过不满足条件的音频。 - aishell1跑01-trn_RawNet.py
(1) 【报错】:MemoryError:Unable to allocate array with shape…
【解决】报错原因在于矩阵维度过大。解决方法win10 pycharm 出现MemoryError 和 Unable to allocate array with shape
(2) 【卡死】:代码卡死在1-trn_RawNet.py的第296行loss, loss1, loss2, acc1, acc2 = model.train_on_batch([x, y], [dummy_y, dummy_y])
【可能原因1———不是这个原因】分析是第288行代码y = to_categorical(y, num_classes=parser[‘model’][‘nb_spk’])将y值one-hot编码,要求y为[0,num_classes)间的整型,而当前y=[‘S0002’]这种字符串。后面打印验证,如果确认,则写dic[‘S0002’] = 2这种字典,可能涉及test函数的标签修改。
【可能原因2———是这个原因】在处理一个批次时,对于提取特征失败的speaker我直接舍弃了(01-trn_RawNet.py的compose_batch函数),但是一个批次固定102个说话者,最终x,y矩阵维度不匹配。
修改y和dummy_y矩阵维度。
(3) 【本地cpu跑的太慢】准备用pycharm连接谷歌服务器,用免费GPU跑本地代码。
【解决】用学校GPU - vctk 跑00-pre_process_waveforms.py
分了train:94个Speakers,dev:10个,test:5个。[参考Aishell1数据集划分比例]
音频文件总个数:44243。 - vctk跑01-trn_RawNet.pys
(1)epoch原为100,现设置成epoch=10,预计跑一天。
(2)【问题】 使用两块gpu失败。
【办法】 代码里参数mg=0,设置mg=1即可。 - 【问题】都没跑02-trn_bvec.py,不知道什么作用。
- aishell1跑01-trn_RawNet.pys
(1)代码332行报错
fpr, tpr, thresholds = roc_curve(y, y_score, pos_label=1)
Input contains NaN, infinity or a value too large for dtype('float32').
【分析】极大可能y_score中含有NAN => 代码320行
cos_score = cos_sim(dic_val[spkMd], dic_val[utt])
计算得到的cos_score可能存在NAN => 计算余弦相似度的分母可能存在为0的情况。
【解决办法】法1:余弦相似度计算分母加上一个小数,保证分母不为0;
法2:如果计算得到的cos_score为NAN,直接舍弃这个y, y_score对。
采取法2,原因:为NAN的数据量可能不大
【注意】同时更改trival.txt处的代码
一、01-trn_RawNet.py
A. 功能:
Yaml load
Pre-train:make folders,train one epoch,validate(验证,用dev,文本存于val_trials.txt),evaluate(评估,用test,文本存于trials.txt)。
Train RawNet
Extract RawNet Embeddings
· 总共做了两次训练,一次预训练Pre-train,一次训练Train RawNet。
· 训练集的标签是在process_epoch(lines, q, batch_size, nb_samp, dic_spk, base_dir)函数和compose_batch(…)函数中处理的,(x,y)存储在队列q中,其中y对为每个说话人的编号,从0到399。
B. 函数
· make_spkdic(lines)
功能:返回一个字典,键是(str)说话人名称,值是(int)每个说话人的唯一整数(0,1,2…)。
· compose_spkFeat_dic(lines, model, f_desc_dic, base_dir)
功能:从给定模型中提取说话人嵌入。
lines:(列表)指示每种话语的字符串列表
model:(keras模型)DNN,用于提取说话者嵌入,
输出层应该被移动(model_pred)
f_desc_dic :(字典)文件对象的字典
· cos_sim(a,b)
功能:计算a,b矩阵的余弦。
二、model_RawNet_pre_train.py
A. 功能:
创建预训练RawNet模型。
B. 函数
· get_model(argDic)
功能:创建预训练模型。
三、00-pre_process_waveforms.py
A. 功能:
预训练波形图。
B. 函数
· get_model(argDic)
功能:创建预训练模型。
· extract_waveforms(lines, dir_trg)
功能:提取lines各目录下音频的波形图,存入dir_trg。
· pre_emp(x)
功能:预强调原始波形。(算式不太懂)
· join_scp(f_dir, nb_proc)
功能:归并scp文件。
四、02-trn_bvec.py
A. 功能:
B. 函数
· make_spkdic(lines)
功能:返回一个字典和一个list,字典的键是(str)说话人名称,值是(int)每个说话人的唯一整数(0,1,2…),list是说话人名称的列表。
·get_spk2utt_dic(lines)
功能:返回字典,键为说话人名字,值为对应语音路径。
五、model_bvec.py
A. 功能:
创建模型。
B. 函数
· get_model(argDic)
功能:创建模型。
RawNet代码解析相关推荐
- matrix_multiply代码解析
matrix_multiply代码解析 关于matrix_multiply 程序执行代码里两个矩阵的乘法,并将相乘结果打印在屏幕上. 示例的主要目的是展现怎么实现一个自定义CPU计算任务. 参考:ht ...
- CornerNet代码解析——损失函数
CornerNet代码解析--损失函数 文章目录 CornerNet代码解析--损失函数 前言 总体损失 1.Heatmap的损失 2.Embedding的损失 3.Offset的损失 前言 今天要解 ...
- 视觉SLAM开源算法ORB-SLAM3 原理与代码解析
来源:深蓝学院,文稿整理者:何常鑫,审核&修改:刘国庆 本文总结于上交感知与导航研究所科研助理--刘国庆关于[视觉SLAM开源算法ORB-SLAM3 原理与代码解析]的公开课. ORB-SLA ...
- java获取object属性值_java反射获取一个object属性值代码解析
有些时候你明明知道这个object里面是什么,但是因为种种原因,你不能将它转化成一个对象,只是想单纯地提取出这个object里的一些东西,这个时候就需要用反射了. 假如你这个类是这样的: privat ...
- python中的doc_基于Python获取docx/doc文件内容代码解析
这篇文章主要介绍了基于Python获取docx/doc文件内容代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 整体思路: 下载文件并修改后缀 ...
- mongoose框架示例代码解析(一)
mongoose框架示例代码解析(一) 参考: Mongoose Networking Library Documentation(Server) Mongoose Networking Librar ...
- ViBe算法原理和代码解析
ViBe - a powerful technique for background detection and subtraction in video sequences 算法官网:http:// ...
- 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中进行断点调试 | ELFFile 实例对象分析 )
文章目录 一.PyCharm 中进行断点调试 二.ELFFile 实例对象分析 一.PyCharm 中进行断点调试 在上一篇博客 [Android 逆向]使用 Python 代码解析 ELF 文件 ( ...
- 密码算法中iv值是什么_?标检测中的?极?值抑制算法(nms):python代码解析
⾮极⼤值抑制(Non-Maximum Suppression)原理 ⾮极⼤值抑制,顾名思义,找出极⼤值,抑制⾮极⼤值.这种思路和算法在各个领域中应⽤⼴泛,⽐如边缘检测算法canny算⼦中就使⽤了该⽅法 ...
- python批量处理csv_Python批量处理csv并保存过程代码解析
本篇文章小编给大家分享一下Python批量处理csv并保存过程代码解析,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 需求: 1.大量csv文件,以数字命 ...
最新文章
- Android 你知道界面布局嵌套多少层之后会Crash吗
- c# redis 如何设置过期时间_Redis Hash存储token、及设置过期时间
- 一起学asp.net基础文章二 服务器控件、客户端控件和html表单控件
- Spark笔记:复杂RDD的API的理解(上)
- GitHub 上100个优质前端项目整理,值得收藏!
- 如何进入zabbix的wab界面_如何不用光盘重装系统呢?
- 【数据库系统】笛卡尔积与自然连接
- Linux下实现流水灯等功能的LED驱动代码及测试实例
- IPv4的路由选择计算步骤
- SharePoint2010企业开发最佳实践(八)---- SPWeb 对象
- 拥抱模块化的javascript
- steam邮件认证出现Access Denied You don't have permission to....
- 队列fifo和lifo C语言数组实现
- nginx反向代理指定dns
- 《Linux Device Driver》——时间、延迟及延缓操作
- linux怎么查找接口,Linux终端命令接口(五)查找与搜索
- 分享几个学习翻译的方法
- 转载 解决 #65279 隐形字符的问题
- java解析asn.1编码_asn1编码格式的解析过程
- 算法学习(十六)——D3QN