前言

本章介绍如何使用Pytorch实现简单的声纹识别模型,本项目参考了人脸识别项目的做法Pytorch-MobileFaceNet ,使用了ArcFace Loss,ArcFace loss:Additive Angular Margin Loss(加性角度间隔损失函数),对特征向量和权重归一化,对θ加上角度间隔m,角度间隔比余弦间隔在对角度的影响更加直接。

源码地址:VoiceprintRecognition-Pytorch

使用环境:

  • Python 3.7
  • Pytorch 1.8.1

模型下载

数据集 类别数量 下载地址
中文语音语料数据集 3242 点击下载
更大数据集 6235 点击下载

安装环境

  1. 安装Pytorch,如果已经安装过Pytorch,测无需再次安装。
pip install torch==1.8.1
  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

数据读取

有了上面创建的数据列表和均值标准值,就可以用于训练读取。主要是把语音数据转换短时傅里叶变换的幅度谱,使用librosa可以很方便计算音频的特征,如梅尔频谱的API为librosa.feature.melspectrogram(),输出的是numpy值,可以直接用Pytorch训练和预测。跟梅尔频谱同样很重要的梅尔倒谱(MFCCs)更多用于语音识别中,对应的API为librosa.feature.mfcc()。在本项目中使用的API分别是librosa.stft()librosa.magphase()。在训练时,使用了数据增强,如随机翻转拼接,随机裁剪。经过处理,最终得到一个257*257的短时傅里叶变换的幅度谱。

wav, sr_ret = librosa.load(audio_path, sr=sr)
linear = librosa.stft(extended_wav, n_fft=n_fft, win_length=win_length, hop_length=hop_length)
mag, _ = librosa.magphase(linear)
freq, freq_time = mag.shape
spec_mag = mag[:, :spec_len]
mean = np.mean(spec_mag, 0, keepdims=True)
std = np.std(spec_mag, 0, keepdims=True)
spec_mag = (spec_mag - mean) / (std + 1e-5)

训练模型

创建train.py开始训练模型,使用的是经过修改过的resnet34模型,数据输入层设置为[None, 1, 257, 257],这个大小就是短时傅里叶变换的幅度谱的shape,如果读者使用了其他的语音长度,也需要修改这个值。每训练一轮结束之后,执行一次模型评估,计算模型的准确率,以观察模型的收敛情况。同样的,每一轮训练结束保存一次模型,分别保存了可以恢复训练的模型参数,也可以作为预训练模型参数。还保存预测模型,用于之后预测。

python train.py

评估模型

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

python eval.py

输出类似如下:

-----------  Configuration Arguments -----------
input_shape: (1, 257, 257)
list_path: dataset/test_list.txt
model_path: models/infer/model
------------------------------------------------开始提取全部的音频特征...
100%|█████████████████████████████████████████████████████| 5332/5332 [01:09<00:00, 77.06it/s]
开始两两对比音频特征...
100%|█████████████████████████████████████████████████████| 5332/5332 [01:43<00:00, 51.62it/s]
100%|█████████████████████████████████████████████████████| 100/100 [00:03<00:00, 28.04it/s]
当阈值为0.710000, 准确率最大,准确率为:0.999955

声纹对比

下面开始实现声纹对比,创建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
input_shape: (1, 257, 257)
model_path: models/infer/model
threshold: 0.71
------------------------------------------------audio/a_1.wav 和 audio/b_2.wav 不是同一个人,相似度为:-0.259855

声纹识别

在上面的声纹对比的基础上,我们创建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
input_shape: (1, 257, 257)
model_path: models/infer/model
threshold: 0.71
------------------------------------------------Loaded 李达康 audio.
Loaded 沙瑞金 audio.
请选择功能,0为注册音频到声纹库,1为执行声纹识别:0
按下回车键开机录音,录音3秒中:
开始录音......
录音已结束!
请输入该音频用户的名称:夜雨飘零
请选择功能,0为注册音频到声纹库,1为执行声纹识别:1
按下回车键开机录音,录音3秒中:
开始录音......
录音已结束!
识别说话的为:夜雨飘零,相似度为:0.920434

其他版本

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

基于Pytorch实现的声纹识别模型相关推荐

  1. android声纹识别技术,基于Android平台的声纹识别系统的研究与实现

    摘要: 社会的发展越来越快,计算机技术的应用也愈来愈广,已经渗透到生活的各个方面.在快节奏.信息化的时代,需要识别和交互的应用日益广泛,要求验证身份的场合越来越多,迅速判定一个人的身份是一个非常重要的 ...

  2. 基于深度学习的声纹识别

    一.选题 1.1 题目: 基于深度学习的声纹识别 1.2 研究内容: ① 研究用于声纹识别的语音参数以及这些参数对声纹识别性能的影响. ② 研究声纹识别的传统方法及性能. ③ 在研究声纹识别的传统方法 ...

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

    前言 本项目使用了EcapaTdnn模型实现的声纹识别,不排除以后会支持更多模型,同时本项目也支持了多种数据预处理方法,损失函数参考了人脸识别项目的做法PaddlePaddle-MobileFaceN ...

  4. 基于PaddlePaddle实现的EcapaTdnn声纹识别模型

    前言 本项目使用了EcapaTdnn模型实现的声纹识别,不排除以后会支持更多模型,同时本项目也支持了多种数据预处理方法,损失函数参考了人脸识别项目的做法PaddlePaddle-MobileFaceN ...

  5. 基于深度学习方法的声纹识别(Speaker Recognition)论文综述

    声纹识别(Speaker Recognition),是一项提取说话人声音特征和说话内容信息,自动核验说话人身份的技术. 声纹识别通常分为两类:Speaker Verification (说话人验证)和 ...

  6. 基于Pytorch实现的快速人脸识别模型

    前言 本项目参考了ArcFace的损失函数结合MobileNet,意在开发一个模型较小,但识别准确率较高且推理速度快的一种人脸识别项目,该项目训练数据使用emore数据集,一共有85742个人,共58 ...

  7. 基于Tensorflow2实现的中文声纹识别

    前言 本章介绍如何使用Tensorflow实现简单的声纹识别模型,首先你需要熟悉音频分类,没有了解的可以查看这篇文章<基于Tensorflow实现声音分类> .基于这个知识基础之上,我们训 ...

  8. 基于Kersa实现的中文语音声纹识别

    原文博客:Doi技术团队 链接地址:https://blog.doiduoyi.com/authors/1584446358138 初心:记录优秀的Doi技术团队学习经历 本文链接:基于Kersa实现 ...

  9. 基于Tensorflow实现声纹识别

    前言 本章介绍如何使用Tensorflow实现简单的声纹识别模型,首先你需要熟悉音频分类,没有了解的可以查看这篇文章<基于Tensorflow实现声音分类>.基于这个知识基础之上,我们训练 ...

最新文章

  1. 你了解如何用GAN做语义分割吗
  2. 深入Windows原理杂记
  3. 《系统集成项目管理工程师》必背100个知识点-13项目经理是整合者
  4. 设置Dialog全屏显示(转)
  5. 《盗墓笔记》使用的这套技术,让美术可以在场景中任意使用灯光
  6. uniapp H5页面嵌入微信小程序 ios 下 video组件 播放视频 设置 border-radius overflow:hidden 不生效
  7. 点击图片弹出固定或自适应窗口
  8. CentOS下安装SVN
  9. 【解决方案】施工现场如何实现全方位视频监控?EasyGBS视频智能告警分析平台搭建智慧工地
  10. 工商数据返回:“企业不存在或企业信息未更新”,法定代表人验证失败的解决方法
  11. BP算法(误差逆传播算法)简单实现
  12. 五脏六腑在脸上的反射区图片_痘痘脸部反射区图痘痘的位置反射五脏六腑的病症 [哈哈镜]...
  13. Labview实现信号频域分析
  14. mac字体能用在linux吗,mac的字体和win通用吗
  15. 胖大海和罗汉果可以同泡吗
  16. 低功耗设计(low power design)和UPF介绍(含代码示例)
  17. Web实现:flex弹性布局三栏自适应布局
  18. uniapp onReachBottom 不触发
  19. 正态后验分布的MCMC方法
  20. HTML及CSS学习笔记 06 - CSS简介和常见的选择器

热门文章

  1. 线稿上色V3(比V2差别在于这个参考图的处理方式),并且更好用哦
  2. 前端报表导出成word文档(含echarts图表)
  3. 【Linux学习笔记】27:环境变量中的语系变量
  4. STM32外部中断及串口
  5. Anaconda/Conda创建环境时报错的解决方案
  6. odoo 邮件自动发送相关知识
  7. PTA-- 快速排序(25)
  8. 水平拉滑轮组计算机械效率的题,中考典型题:滑轮组机械效率分类计算(1).doc...
  9. python tkinter怎么读_Tkinter是什么意思
  10. spring security logout(spring security登出示例)