位置: IT常识 - 正文

基于Pytorch实现的EcapaTdnn声纹识别模型(pytorch基础)

编辑:rootadmin
基于Pytorch实现的EcapaTdnn声纹识别模型 前言

推荐整理分享基于Pytorch实现的EcapaTdnn声纹识别模型(pytorch基础),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:pytorch教程,pytorch基础,pytorch csdn,pytorch csdn,pytorch functional,pytorch csdn,pytorch 简单例子,pytorch例程,内容如对您有帮助,希望把文章链接给更多的朋友!

本项目使用了EcapaTdnn模型实现的声纹识别,不排除以后会支持更多模型,同时本项目也支持了多种数据预处理方法,损失函数参考了人脸识别项目的做法PaddlePaddle-MobileFaceNets ,使用了ArcFace Loss,ArcFace loss:Additive Angular Margin Loss(加性角度间隔损失函数),对特征向量和权重归一化,对θ加上角度间隔m,角度间隔比余弦间隔在对角度的影响更加直接。

源码地址:VoiceprintRecognition-Pytorch(V1)

使用环境:

Python 3.7PaddlePaddle 1.10.2模型下载模型预处理方法数据集类别数量分类准确率两两对比准确率模型下载地址EcapaTdnnmelspectrogram中文语音语料数据集32420.96820.99982点击下载EcapaTdnnspectrogram中文语音语料数据集32420.96900.99982点击下载EcapaTdnnmelspectrogram更大的数据集63550.91660.99991点击下载EcapaTdnnspectrogram更大的数据集63550.91540.99990点击下载EcapaTdnnmelspectrogram超大的数据集137180.91790.99995点击下载EcapaTdnnspectrogram超大的数据集137180.93440.99995点击下载安装环境安装Pytorch的GPU版本,如果已经安装过Pytorch,无需再次安装。pip install torch==1.10.2安装其他依赖库,命令如下,注意librosa的版本是0.9.1,旧版本的梅尔频谱计算方式不一样。pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

注意: libsora和pyaudio安装出错解决办法

创建数据

本教程笔者使用的是中文语音语料数据集 ,这个数据集一共有3242个人的语音数据,有1130000+条语音数据,下载之前要全部解压数据集。如果读者有其他更好的数据集,可以混合在一起使用,但最好是要用python的工具模块aukit处理音频,降噪和去除静音。

首先是创建一个数据列表,数据列表的格式为<语音文件路径\t语音分类标签>,创建这个列表主要是方便之后的读取,也是方便读取使用其他的语音数据集,语音分类标签是指说话人的唯一ID,不同的语音数据集,可以通过编写对应的生成数据列表的函数,把这些数据集都写在同一个数据列表中。

在create_data.py写下以下代码,因为中文语音语料数据集 这个数据集是mp3格式的,作者发现这种格式读取速度很慢,所以笔者把全部的mp3格式的音频转换为wav格式,在创建数据列表之后,可能有些数据的是错误的,所以我们要检查一下,将错误的数据删除。执行下面程序完成数据准备。

python create_data.py基于Pytorch实现的EcapaTdnn声纹识别模型(pytorch基础)

执行上面的程序之后,会生成以下的数据格式,如果要自定义数据,参考如下数据列表,前面是音频的相对路径,后面的是该音频对应的说话人的标签,就跟分类一样。

dataset/zhvoice/zhmagicdata/5_895/5_895_20170614203758.wav3238dataset/zhvoice/zhmagicdata/5_895/5_895_20170614214007.wav3238dataset/zhvoice/zhmagicdata/5_941/5_941_20170613151344.wav3239dataset/zhvoice/zhmagicdata/5_941/5_941_20170614221329.wav3239dataset/zhvoice/zhmagicdata/5_941/5_941_20170616153308.wav3239dataset/zhvoice/zhmagicdata/5_968/5_968_20170614162657.wav3240dataset/zhvoice/zhmagicdata/5_968/5_968_20170622194003.wav3240dataset/zhvoice/zhmagicdata/5_968/5_968_20170707200554.wav3240dataset/zhvoice/zhmagicdata/5_970/5_970_20170616000122.wav3241训练模型

使用train.py训练模型,本项目支持多个音频预处理方式,通过参数feature_method可以指定,melspectrogram为梅尔频谱,spectrogram为声谱图。通过参数augment_conf_path可以指定数据增强方式。训练过程中,会使用VisualDL保存训练日志,通过启动VisualDL可以随时查看训练结果,启动命令visualdl --logdir=log --host 0.0.0.0

# 单卡训练python train.py# 多卡训练python train.py --gpus=0,1

训练输出日志:

----------- Configuration Arguments -----------augment_conf_path: configs/augment.ymlbatch_size: 64feature_method: melspectrogramgpus: 0learning_rate: 0.001num_epoch: 30num_speakers: 3242num_workers: 4pretrained_model: Noneresume: Nonesave_model_dir: models/test_list_path: dataset/test_list.txttrain_list_path: dataset/train_list.txtuse_model: ecapa_tdnn------------------------------------------------······[2022-04-24 09:25:10.481272] Train epoch [0/30], batch: [7500/8290], loss: 9.03724, accuracy: 0.33252, lr: 0.00100000, eta: 14:58:26[2022-04-24 09:25:32.909873] Train epoch [0/30], batch: [7600/8290], loss: 9.00004, accuracy: 0.33600, lr: 0.00100000, eta: 15:09:07[2022-04-24 09:25:55.321806] Train epoch [0/30], batch: [7700/8290], loss: 8.96284, accuracy: 0.33950, lr: 0.00100000, eta: 15:13:13[2022-04-24 09:26:17.836304] Train epoch [0/30], batch: [7800/8290], loss: 8.92626, accuracy: 0.34294, lr: 0.00100000, eta: 14:57:15[2022-04-24 09:26:40.306800] Train epoch [0/30], batch: [7900/8290], loss: 8.88968, accuracy: 0.34638, lr: 0.00100000, eta: 14:51:06[2022-04-24 09:27:02.778450] Train epoch [0/30], batch: [8000/8290], loss: 8.85430, accuracy: 0.34964, lr: 0.00100000, eta: 15:00:36[2022-04-24 09:27:25.240278] Train epoch [0/30], batch: [8100/8290], loss: 8.81858, accuracy: 0.35294, lr: 0.00100000, eta: 14:51:58[2022-04-24 09:27:47.690570] Train epoch [0/30], batch: [8200/8290], loss: 8.78368, accuracy: 0.35630, lr: 0.00100000, eta: 14:55:41======================================================================[2022-04-24 09:28:12.084404] Test 0, accuracy: 0.76057 time: 0:00:04======================================================================[2022-04-24 09:28:12.909394] Train epoch [1/30], batch: [0/8290], loss: 5.83753, accuracy: 0.68750, lr: 0.00099453, eta: 2 days, 3:47:48[2022-04-24 09:28:35.346418] Train epoch [1/30], batch: [100/8290], loss: 5.80430, accuracy: 0.64527, lr: 0.00099453, eta: 15:00:01[2022-04-24 09:28:57.873686] Train epoch [1/30], batch: [200/8290], loss: 5.78946, accuracy: 0.64218, lr: 0.00099453, eta: 14:46:39······

VisualDL页面:

数据增强

本项目提供了几种音频增强操作,分布是随机裁剪,添加背景噪声,调节语速,调节音量,和SpecAugment。其中后面4种增加的参数可以在configs/augment.yml修改,参数prob是指定该增强操作的概率,如果不想使用该增强方式,可以设置为0。要主要的是,添加背景噪声需要把多个噪声音频文件存放在dataset/noise,否则会跳过噪声增强

noise: min_snr_dB: 10 max_snr_dB: 30 noise_path: "dataset/noise" prob: 0.5评估模型

训练结束之后会保存预测模型,我们用预测模型来预测测试集中的音频特征,然后使用音频特征进行两两对比,阈值从0到1,步长为0.01进行控制,找到最佳的阈值并计算准确率。

python eval.py

输出类似如下:

----------- Configuration Arguments -----------feature_method: melspectrogramlist_path: dataset/test_list.txtnum_speakers: 3242resume: models/use_model: ecapa_tdnn------------------------------------------------W0425 08:27:32.057426 17654 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.5, Driver API Version: 11.6, Runtime API Version: 10.2W0425 08:27:32.065165 17654 device_context.cc:465] device: 0, cuDNN Version: 7.6.成功加载模型参数和优化方法参数:models/ecapa_tdnn/model.pdparams开始提取全部的音频特征...167it [00:15, 10.70it/s]分类准确率为:0.9608开始两两对比音频特征...100%|███████████████████████████| 5332/5332 [00:05<00:00, 1027.83it/s]找出最优的阈值和对应的准确率...100%|███████████████████████████| 100/100 [00:06<00:00, 16.54it/s]当阈值为0.58, 两两对比准确率最大,准确率为:0.99980声纹对比

下面开始实现声纹对比,创建infer_contrast.py程序,编写infer()函数,在编写模型的时候,模型是有两个输出的,第一个是模型的分类输出,第二个是音频特征输出。所以在这里要输出的是音频的特征值,有了音频的特征值就可以做声纹识别了。我们输入两个语音,通过预测函数获取他们的特征数据,使用这个特征数据可以求他们的对角余弦值,得到的结果可以作为他们相识度。对于这个相识度的阈值threshold,读者可以根据自己项目的准确度要求进行修改。

python infer_contrast.py --audio_path1=audio/a_1.wav --audio_path2=audio/b_2.wav

输出类似如下:

----------- Configuration Arguments -----------audio_path1: audio/a_1.wavaudio_path2: audio/b_2.wavfeature_method: melspectrogramresume: models/threshold: 0.5use_model: ecapa_tdnn------------------------------------------------W0425 08:29:10.006249 21121 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.5, Driver API Version: 11.6, Runtime API Version: 10.2W0425 08:29:10.008555 21121 device_context.cc:465] device: 0, cuDNN Version: 7.6.成功加载模型参数和优化方法参数:models/ecapa_tdnn/model.pdparamsaudio/a_1.wav 和 audio/b_2.wav 不是同一个人,相似度为:-0.09565544128417969声纹识别

在上面的声纹对比的基础上,我们创建infer_recognition.py实现声纹识别。同样是使用上面声纹对比的infer()预测函数,通过这两个同样获取语音的特征数据。 不同的是笔者增加了load_audio_db()和register(),以及recognition(),第一个函数是加载声纹库中的语音数据,这些音频就是相当于已经注册的用户,他们注册的语音数据会存放在这里,如果有用户需要通过声纹登录,就需要拿到用户的语音和语音库中的语音进行声纹对比,如果对比成功,那就相当于登录成功并且获取用户注册时的信息数据。第二个函数register()其实就是把录音保存在声纹库中,同时获取该音频的特征添加到待对比的数据特征中。最后recognition()函数中,这个函数就是将输入的语音和语音库中的语音一一对比。 有了上面的声纹识别的函数,读者可以根据自己项目的需求完成声纹识别的方式,例如笔者下面提供的是通过录音来完成声纹识别。首先必须要加载语音库中的语音,语音库文件夹为audio_db,然后用户回车后录音3秒钟,然后程序会自动录音,并使用录音到的音频进行声纹识别,去匹配语音库中的语音,获取用户的信息。通过这样方式,读者也可以修改成通过服务请求的方式完成声纹识别,例如提供一个API供APP调用,用户在APP上通过声纹登录时,把录音到的语音发送到后端完成声纹识别,再把结果返回给APP,前提是用户已经使用语音注册,并成功把语音数据存放在audio_db文件夹中。

python infer_recognition.py

输出类似如下:

----------- Configuration Arguments -----------audio_db: audio_dbfeature_method: melspectrogramresume: models/threshold: 0.5use_model: ecapa_tdnn------------------------------------------------W0425 08:30:13.257884 23889 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.5, Driver API Version: 11.6, Runtime API Version: 10.2W0425 08:30:13.260191 23889 device_context.cc:465] device: 0, cuDNN Version: 7.6.成功加载模型参数和优化方法参数:models/ecapa_tdnn/model.pdparamsLoaded 沙瑞金 audio.Loaded 李达康 audio.请选择功能,0为注册音频到声纹库,1为执行声纹识别:0按下回车键开机录音,录音3秒中:开始录音......录音已结束!请输入该音频用户的名称:夜雨飘零请选择功能,0为注册音频到声纹库,1为执行声纹识别:1按下回车键开机录音,录音3秒中:开始录音......录音已结束!识别说话的为:夜雨飘零,相似度为:0.920434其他版本Tensorflow:VoiceprintRecognition-TensorflowPaddlePaddle:VoiceprintRecognition-PaddlePaddleKeras:VoiceprintRecognition-Keras参考资料https://github.com/PaddlePaddle/PaddleSpeechhttps://github.com/yeyupiaoling/PaddlePaddle-MobileFaceNetshttps://github.com/yeyupiaoling/PPASR
本文链接地址:https://www.jiuchutong.com/zhishi/292944.html 转载请保留说明!

上一篇:高德地图 API,点击地图标记获取自定义标记 (Marker) 中的信息(高德地图api是什么意思)

下一篇:塔霍河上空的银河,西班牙蒙弗拉圭国家公园 (© Miguel Angel Muñoz Ruiz/Cavan Images)(塔河流域)

  • 无法验证游戏文件完整性(无法验证游戏版本)(游戏显示无法验证app)

    无法验证游戏文件完整性(无法验证游戏版本)(游戏显示无法验证app)

  • 微信怎么把图片保存到手机相册(微信怎么把图片转换成文字)

    微信怎么把图片保存到手机相册(微信怎么把图片转换成文字)

  • 苹果手机怎么用wps打开文档(苹果手机怎么用电池寿命长)

    苹果手机怎么用wps打开文档(苹果手机怎么用电池寿命长)

  • ipadpro129二代三代区别(ipadpro129第二代评测)

    ipadpro129二代三代区别(ipadpro129第二代评测)

  • 调相机在电力系统中起什么作用(调相机是电动机还是发电机)

    调相机在电力系统中起什么作用(调相机是电动机还是发电机)

  • 热水器一级二级三级有什么区别(热水器一级二级什么意思)

    热水器一级二级三级有什么区别(热水器一级二级什么意思)

  • ipad充电器拆开能干嘛(ipad充电头拆解步骤)

    ipad充电器拆开能干嘛(ipad充电头拆解步骤)

  • 无线耳机充电仓红灯闪烁(无线耳机充电仓上的按钮是干嘛的)

    无线耳机充电仓红灯闪烁(无线耳机充电仓上的按钮是干嘛的)

  • 机顶盒光信号红灯亮怎么回事(机顶盒光信号红灯亮怎么办)

    机顶盒光信号红灯亮怎么回事(机顶盒光信号红灯亮怎么办)

  • 小米手环4无睡眠数据(小米手环无睡眠数据的原因)

    小米手环4无睡眠数据(小米手环无睡眠数据的原因)

  • 爱奇艺没字幕怎么回事(爱奇艺没字幕怎么调)

    爱奇艺没字幕怎么回事(爱奇艺没字幕怎么调)

  • 滴滴车主余额和可用余额区别(滴滴车主余额图片)

    滴滴车主余额和可用余额区别(滴滴车主余额图片)

  • mtk6763t相当于骁龙多少(mtk6769相当于骁龙)

    mtk6763t相当于骁龙多少(mtk6769相当于骁龙)

  • 名片分享能知道谁分享的吗(名片分享过一次就不能分享了吗)

    名片分享能知道谁分享的吗(名片分享过一次就不能分享了吗)

  • g1820cpu是i几处理器(g1820cpu怎么样)

    g1820cpu是i几处理器(g1820cpu怎么样)

  • 华为64和128g的区别

    华为64和128g的区别

  • 二进制的基符共几个(二进制的基符共有)

    二进制的基符共几个(二进制的基符共有)

  • 电信691错误代码是什么意思(电信网错误代码691)

    电信691错误代码是什么意思(电信网错误代码691)

  • 备忘录怎么统计字数(备忘录没有最近删除怎么恢复)

    备忘录怎么统计字数(备忘录没有最近删除怎么恢复)

  • vivo手机lte什么意思(vivo lte手机开关在哪里)

    vivo手机lte什么意思(vivo lte手机开关在哪里)

  • vivo v1838a什么意思(vivo手机v1838a是什么型号)

    vivo v1838a什么意思(vivo手机v1838a是什么型号)

  • soul为什么打不开(soul为什么打不开我的遇见)

    soul为什么打不开(soul为什么打不开我的遇见)

  • 怎么才算拼多多新用户(怎么才算拼多多新人)

    怎么才算拼多多新用户(怎么才算拼多多新人)

  • 荣耀9x人脸解锁在哪(荣耀9x人脸解锁摄像头有弹出来吗?)

    荣耀9x人脸解锁在哪(荣耀9x人脸解锁摄像头有弹出来吗?)

  • 公众号怎样使用菜单键(微信公众号怎样使用)

    公众号怎样使用菜单键(微信公众号怎样使用)

  • 抖音的随拍和作品有什么区别(抖音的随拍和作者的区别)

    抖音的随拍和作品有什么区别(抖音的随拍和作者的区别)

  • 苹果手机怎样设置备忘录字体大小(苹果手机怎样设置来电铃声)

    苹果手机怎样设置备忘录字体大小(苹果手机怎样设置来电铃声)

  • Web 1.0、Web 2.0 和 Web 3.0 之间的比较

    Web 1.0、Web 2.0 和 Web 3.0 之间的比较

  • 资产负债率高说明偿债能力怎么样
  • 百旺金税盘官网
  • 计提维保费
  • 代扣个人所得税怎么算
  • 增值税税控系统产品及维护服务价格
  • 小规模的开专票怎么征税
  • 地方教育费附加的计税依据是什么
  • 进项税额转出忘记填在申报表里
  • 行政事业单位无偿调拨资产会计处理
  • 服务行业印花税税率
  • 编制利润表会计等式
  • 长期股权投资的交易费用计入哪里
  • 单位社保没推送
  • 应交税费是什么科目借贷方向
  • 高速公路抵税
  • 货物返利怎么做分录
  • 车间未完工的产品属于什么
  • 合并报表的编制主体
  • 金融机构在境外
  • 仓库的租赁费
  • 勒索病毒文件怎么恢复
  • 免征增值税的会计处理方法有哪些
  • 推荐几个优秀的电影
  • 文档自动填写怎么弄
  • 利润分配未分配利润期末有余额吗
  • 企业抄报税怎样操作
  • PHP:xml_set_processing_instruction_handler()的用法_XML解析器函数
  • 劳务外包开什么样的发票
  • kb4507449安装失败
  • 核定征收的企业怎么交所得税
  • 商业企业低值易耗品科目核算的内容
  • macOS 11 Big Sur 开发者预览版 Beta 8推送
  • 开出转账支票补付款项
  • 酒店装修费用如何抵扣税
  • 药品生产企业应建立
  • 银行承兑汇票贴现怎么算
  • pnp算法简介与代码解析
  • 瓦尔加德
  • php浮点数
  • 工程服务费会计怎么做账
  • 云计算技术是学什么的
  • 简单的php文件
  • 工程项目科学技术方法工具过程之间的关系
  • 收到利息收入计入什么科目
  • 已开发票作废和空白发票作废有什么不一样?
  • 普通发票可以抵扣进项吗
  • 帝国cms建站实例教程
  • 织梦使用手册
  • 自然人独资公司可以变更法人吗
  • 股权投资公司属于证券公司
  • mysql数据库注入
  • 留抵进项税太多怎么办
  • 小规模纳税人差额征税
  • 转让不动产增值税征收管理办法
  • 代扣代缴公积金现金流量
  • 代收代缴的水电费怎么开票
  • 以前多计提的税款怎么办
  • 净利润递延所得税
  • 农业合作社销售农产品怎样纳税
  • 吊装费是属于什么报销项目
  • sql数据库死锁产生的原因及解决方案
  • mysql查询语句大全及用法
  • solaris安装软件包
  • win8.1快捷键
  • mac itunes
  • 防火墙ddos攻击防范
  • 打开电脑显示配置windows,可是一直0%,怎么办
  • linux系统如何安装软件包
  • unity as
  • nodejs ddd
  • jQuery中ajax错误调试分析
  • unity3d题库
  • 汉诺塔游戏教程
  • python怎么爬
  • javascript教程完整版
  • javascript总结笔记
  • sql怎么增删改
  • javascript制作小程序
  • 湖北耕地占用税标准
  • 螺丝钉的税率
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设