基于Pytorch实现的EcapaTdnn声纹识别模型

article/2025/8/20 7:32:36

前言

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

源码地址:VoiceprintRecognition-Pytorch(V1)

使用环境:

  • Python 3.7
  • PaddlePaddle 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点击下载

安装环境

  1. 安装Pytorch的GPU版本,如果已经安装过Pytorch,无需再次安装。
pip install torch==1.10.2
  1. 安装其他依赖库,命令如下,注意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

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

dataset/zhvoice/zhmagicdata/5_895/5_895_20170614203758.wav	3238
dataset/zhvoice/zhmagicdata/5_895/5_895_20170614214007.wav	3238
dataset/zhvoice/zhmagicdata/5_941/5_941_20170613151344.wav	3239
dataset/zhvoice/zhmagicdata/5_941/5_941_20170614221329.wav	3239
dataset/zhvoice/zhmagicdata/5_941/5_941_20170616153308.wav	3239
dataset/zhvoice/zhmagicdata/5_968/5_968_20170614162657.wav	3240
dataset/zhvoice/zhmagicdata/5_968/5_968_20170622194003.wav	3240
dataset/zhvoice/zhmagicdata/5_968/5_968_20170707200554.wav	3240
dataset/zhvoice/zhmagicdata/5_970/5_970_20170616000122.wav	3241

训练模型

使用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.yml
batch_size: 64
feature_method: melspectrogram
gpus: 0
learning_rate: 0.001
num_epoch: 30
num_speakers: 3242
num_workers: 4
pretrained_model: None
resume: None
save_model_dir: models/
test_list_path: dataset/test_list.txt
train_list_path: dataset/train_list.txt
use_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: 10max_snr_dB: 30noise_path: "dataset/noise"prob: 0.5

评估模型

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

python eval.py

输出类似如下:

-----------  Configuration Arguments -----------
feature_method: melspectrogram
list_path: dataset/test_list.txt
num_speakers: 3242
resume: 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.2
W0425 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.wav
audio_path2: audio/b_2.wav
feature_method: melspectrogram
resume: models/
threshold: 0.5
use_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.2
W0425 08:29:10.008555 21121 device_context.cc:465] device: 0, cuDNN Version: 7.6.
成功加载模型参数和优化方法参数:models/ecapa_tdnn/model.pdparams
audio/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_db
feature_method: melspectrogram
resume: models/
threshold: 0.5
use_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.2
W0425 08:30:13.260191 23889 device_context.cc:465] device: 0, cuDNN Version: 7.6.
成功加载模型参数和优化方法参数:models/ecapa_tdnn/model.pdparams
Loaded 沙瑞金 audio.
Loaded 李达康 audio.
请选择功能,0为注册音频到声纹库,1为执行声纹识别:0
按下回车键开机录音,录音3秒中:
开始录音......
录音已结束!
请输入该音频用户的名称:夜雨飘零
请选择功能,0为注册音频到声纹库,1为执行声纹识别:1
按下回车键开机录音,录音3秒中:
开始录音......
录音已结束!
识别说话的为:夜雨飘零,相似度为:0.920434

其他版本

  • Tensorflow:VoiceprintRecognition-Tensorflow
  • PaddlePaddle:VoiceprintRecognition-PaddlePaddle
  • Keras:VoiceprintRecognition-Keras

参考资料

  1. https://github.com/PaddlePaddle/PaddleSpeech
  2. https://github.com/yeyupiaoling/PaddlePaddle-MobileFaceNets
  3. https://github.com/yeyupiaoling/PPASR

http://chatgpt.dhexx.cn/article/q2v7Dems.shtml

相关文章

常用应用层协议的报文格式

常见应用层协议的报文格式 1.常用应用程序的端口号2.HTTP的报文格式 1.常用应用程序的端口号 名称应用层协议端口运输层协议说明超文本传输协议HTTP80TCP域名解析系统DNS53UDP/TCP长度超过512字节,使用TCP动态主机配置协议DHCP67/68UDP简单网络管理协议SNMP161/162UDP文件传输…

15-传输层协议和应用层协议

PS&#xff1a;针对上一篇tcp协议中说到的端到端服务&#xff0c;这里我们再通过传输层协议和应用层协议之间的关系来加深端到端服务的学习和理解。 1. 传输层协议和应用层层协议的关系 在应用层&#xff0c;我们知道有很多协议&#xff0c;比如常见的有http&#xff0c;tfp&am…

应用层协议(HTTP协议)

目录 HTTP 简介 URL urlencode&urldecode HTTP请求协议格式 HTTP响应格式 HTTP的常见方法 HTTP状态码 HTTP常见的Header HTTP 简介 HTTP协议(超文本传输协议HyperText Transfer Protocol)&#xff0c;它是基于TCP协议的应用层传输协议&#xff0c;简单来说就是客户端和服务…

应用层常见协议——知识点

这里总结了三种常见的应用层协议&#xff1a;HTTP、FTP、SMTP。供自己复习使用&#xff0c;也供大家参考&#xff01; 一、HTTP协议 1、HTTP简介 —超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW World Wide Web)服务器之间互相通信的…

应用层协议

应用层协议定义了什么 应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递消息。特别是定义了: 交换的消息类型&#xff0c;如请求消息和响应消息。 各种消息类型的语法&#xff0c;如消息中的各个字段及其详细描述。 字段的语义&#xff0c;即包含在字段中的信息的…

传输层协议、应用层协议

传输层协议、应用层协议 一、传输层协议 1、传输层概述 (1)传输层的作用 IP层提供点到点的连接 传输层提供端到端的连接 (2)传输层的协议 TCP(Transmission Control Protocol)传输控制协议 可靠的、面向连接的协议;传输效率低 UDP(User Datagram Protocol)用户数据报…

应用层协议和传输层协议

数字是离散的&#xff0c;模拟是连续的&#xff0c;对连续的信号进行采样就会变成数字信号&#xff08;A/D转换&#xff09; 在意念传输发明出来之前&#xff0c;计算机之间传输信息&#xff0c;总是需要介质的&#xff01;要么有线传输&#xff0c;要么无线电波传输。你能接收…

传输层协议和应用层协议及它们之间的关系(端口)

一、传输层的两个协议 1、TCP协议 ①TCP协议的作用&#xff1a;TCP为应用层协议提供可靠传输&#xff0c;发送端按顺序发送&#xff0c;接收端按顺序接收&#xff0c;其间发生的丢包、乱序&#xff0c;TCP会负责其重传和排序&#xff0c;另外TCP还可实现流量空制和拥塞避免等…

基于TCP或UDP协议的应用层协议

TCP和UDP都是传输层协议&#xff0c;上面是应用层&#xff0c;下面是网络层 TCP与UDP区别&#xff1a; TCP&#xff08;传输控制协议&#xff09;提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前&#xff0c;必须先在双方之间建立一个TCP连接&#xff0c;…

网络:应用层相关协议

应用层位于传输层之上&#xff0c;在OSI七层模型中&#xff0c;分为了三层&#xff0c;从上到下分别是应用层、表示层、会话层。这里对这三层不做具体区分。 应用层是面向用户的一层&#xff0c;主要包括FTP、HTTP、HTTPS、DNS、TELNET等协议。 1、DNS协议 1.1 DNS和域名 DNS…

基于TCP或UDP的应用层协议有哪些?——Linux网络编程

参考博文01&#xff1a;https://blog.csdn.net/Wu000999/article/details/89293717 博文02 https://blog.csdn.net/u014082714/article/details/44994719 这个面试的时候面试官经常会问我&#xff0c;然后就总结了一下。 TCP/IP四层模型&#xff08;数网传应&#xff09;&#…

应用层——协议

前言&#xff1a;本章将介绍关于应用层的协议&#xff0c;如下图所示 一、应用协议的概要 利用网络的应用程序有很多&#xff0c;包括Web浏览器、电子邮件、远程登陆、文件传输、网络管理等&#xff0c;能够让这些应用进行通信处理的正是应用协议。 网络应用由不同的用户和软…

常见应用层协议

常见应用层协议 1、超文本传输协议 用于传输浏览器使用的普通文本、超文本、音频和视频等数据。 详细情况请看&#xff1a;超文本传输协议HTTP/HTTPS 2、邮件协议 在互联网中&#xff0c;电子邮件的传送是依靠这些协议完成的。 详细情况请看&#xff1a;邮件协议SMTP/POP3…

《白帽子讲web安全》读书笔记以及读后感

因为本书作于2010年前&#xff0c;书中所使用的部分技术版本已经过于老旧&#xff0c;很多书中提到的攻击方法和绕过思路都已经严重落后&#xff0c;但之所以本书会成为安全界的经典必读书目&#xff0c;就是因为本书所讨论的安全思想尤为精华&#xff0c;对于企业来说的安全建…

《白帽子讲Web安全 -- 纪念版 吴翰清著》读后随笔

《白帽子讲Web安全 – 纪念版 吴翰清著》 该书大多数内容举例大多数是2010年左右的 相隔11年左右, 但是内容并没有被淘汰, 感觉很适合入门, 因为内容详细且比较基础 当然, 这只是对我而言 该书一共 四篇 18章 第一篇世界观安全 - 第一章 我的安全世界观 第一章第一节介绍了…

《白帽子讲web安全》第3章 跨站脚本攻击(XSS)

一、XSS简介 跨站脚本攻击(Cross Site Script):本来缩写是CSS&#xff0c;为了和层叠样式表示(Cascading Style Sheet,CSS)有所区别&#xff0c;所以在安全领域叫做“XSS”。通常指黑客通过“HTML注入”篡改了网页&#xff0c;插入了恶意的脚本&#xff0c;从而在用户浏览网页…

在学习web安全的小白看过来,这本《白帽子讲web安全》强烈推荐,必读!(附PDF)

Web是互联网的核心&#xff0c;是未来云计算和移动互联网的最佳载体&#xff0c;因此Web安全也是互联网公司安全业务中最重要的组成部分。 前排提醒&#xff1a;文末有pdf领取 下面来看看几种常见的web漏洞&#xff1a; 1.XSS跨站脚本攻击 XSS跨站脚本攻击&#xff0c;通常…

白帽子讲Web安全(纪念版)笔记

白帽子讲Web安全&#xff08;纪念版&#xff09; 只是笔记&#xff0c;详情请查阅吴翰清老师的《白帽子讲Web安全》 前言 安全工程师的核心竞争力不在于他能拥有多少个0day&#xff0c;掌握多少中安全技术&#xff0c;而是在于他对安全理解的深度&#xff0c;以及由此引申的看…

《白帽子讲Web安全》学习笔记

一、为何要了解Web安全 最近加入新公司后&#xff0c;公司的官网突然被Google标记为了不安全的诈骗网站&#xff0c;一时间我们信息技术部门成为了众矢之的&#xff0c;虽然老官网并不是我们开发的&#xff08;因为开发老官网的前辈们全都跑路了&#xff09;。我们花了很多时间…

笔记《白帽子讲Web安全》吴翰清

第一篇&#xff1a;世界观安全 第一章&#xff1a;我的安全世界观 一个网站的数据库&#xff0c;在没有任何保护的情况下&#xff0c;数据库服务端口是允许任何人随意连接的&#xff1b;在有了防火墙的保护后&#xff0c;通过ACL可以控制只允许信任来源的访问。这些措施在很大…