原文博客:Doi技术团队
链接地址:https://blog.doiduoyi.com/authors/1584446358138
初心:记录优秀的Doi技术团队学习经历
本文链接:使用PaddlePaddle实现声纹识别

前言

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

项目源码地址:VoiceprintRecognition-PaddlePaddle

使用环境:

  • Python 3.7
  • PaddlePaddle 2.1.0

模型下载

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

安装环境

  1. 安装PaddlePaddle的GPU版本,如果已经安装过PaddlePaddle,测无需再次安装。
pip install paddlepaddle-gpu==2.1.0 -i https://mirrors.aliyun.com/pypi/simple/
  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值,可以直接用PaddlePaddle训练和预测。跟梅尔频谱同样很重要的梅尔倒谱(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

训练过程中,会使用VisualDL保存训练日志,通过启动VisualDL可以随时查看训练结果,启动命令visualdl --logdir=log --host 0.0.0.0

评估模型

训练结束之后会保存预测模型,我们用预测模型来预测测试集中的音频特征,然后使用音频特征进行两两对比,阈值从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.700000, 准确率最大,准确率为:0.999950

声纹对比

下面开始实现声纹对比,创建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.7
------------------------------------------------audio/a_1.wav 和 audio/b_2.wav 不是同一个人,相似度为:0.020499

声纹识别

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

其他版本

  • Tensorflow:VoiceprintRecognition-Tensorflow
  • Pytorch:VoiceprintRecognition-Pytorch
  • Keras:VoiceprintRecognition-Keras

基于PaddlePaddle实现声纹识别相关推荐

  1. 基于Tensorflow实现声纹识别

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

  2. [声纹识别]基于MFCC的声纹识别算法

    Mel频率倒谱系数(melfrequency cepstral coefficients,MFCC)是声音的短期功率谱的表示,基于非线性频谱上的对数功率谱的线性余弦变换.在自动语音识别领域,MFCC是 ...

  3. 基于matlab的声纹识别技术(matlabR2021b版)

    文章目录 宏观理解 技术细节 声纹识别发展流程 传统方法 深度学习的方法 多看:声纹识别技术简介--化繁为简的艺术,深入浅出了解声纹识别. 宏观理解 1.困难在哪? 不同的人说话语音波形不同,但是相同 ...

  4. 人工智能Java SDK:声纹识别

    声纹识别 所谓声纹(Voiceprint),是用电声学仪器显示的携带言语信息的声波频谱.人类语言的产生是人体语言中枢与发音器官之间一个复杂的生理物理过程, 人在讲话时使用的发声器官–舌.牙齿.喉头.肺 ...

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

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

  6. 声纹识别(说话人识别)技术

    说话人识别(Speaker Recognition,SR),又称声纹识别(Voiceprint Recognition,VPR),顾名思义,即通过声音来识别出来"谁在说话",是根据 ...

  7. 批训练、注意力模型及其声纹分割应用,谷歌三篇论文揭示其声纹识别技术原理

    声纹识别技术在谷歌的诸多产品中有着重要应用.除了安卓手机目前所独有的声纹解锁功能外,谷歌的家庭语音助手 Google Home 也能通过声纹识别支持多用户模式,从而针对不同用户提供个性化服务.当你向 ...

  8. 声纹识别技术小结(1):声纹建模技术

    文章目录 1. 概论和流程 概论 流程 2. 核心:声纹建模 2.1 深度学习之前的方法 高斯混合模型(GMM) 高斯混合-通用背景模型(GMM-UBM) 联合因子分析(JFA)+ GMM-UBM i ...

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

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

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

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

最新文章

  1. Ora-12154:无法解析连接字符串
  2. linux下载文件的常用命令wget
  3. Spring源码分析-深入理解生命周期之BeanFactoryProcessor
  4. 【Python学习】内置函数(不断更新)
  5. 免费 | 开源操作系统年度盛会最新日程曝光,邀您一同开启烧脑模式!
  6. 《BUG创造队》第九次团队作业:Beta冲刺与验收准备
  7. C语言日字,【C语言日日练(二)】static关键字
  8. 怎样解决DEDE织梦友情链接字数限制与链接个数限制
  9. 利用linux打造工科男的办公娱乐利器 ——以centos为例
  10. 档案管理制度计算机管理制度,档案管理制度保密制度
  11. linux每周2 4 6执行定时任务,linux计划任务crontab例子
  12. java 电子签章 开源_java操作pdf制作电子签章 - CSDN博客
  13. 计算机网络:端到端原则对互联网的影响与面临的问题
  14. win7下安装MySQL的步骤
  15. 华为鸿蒙杀毒,华为鸿蒙系统
  16. 涉密计算机不得接入 网络,任何组织和个人都不得将涉密计算机、涉密存储设备接入互联网或其他公共信息网络 - 作业在线问答...
  17. 【论文阅读01】2021 兵棋推演的智能决策技术与挑战 尹奇跃
  18. 快速理解论文主旨框架:论文十问法
  19. AD20 PCB导出Gerber、拼板,华秋DFM一键拼板,同理支持其他PCB EDA软件的Gerber导入与拼板
  20. 地球形状与重力场简述总结

热门文章

  1. dos2unix介绍
  2. 说话人识别ALIZE工具包的编译
  3. 某职业院校二级学院的发展规划
  4. AI智能电子名片开发
  5. iir 滤波器 结构介绍
  6. 华为USG6000防火墙配置合集
  7. CMAKE Opencv配置
  8. javascript常用正则表达式
  9. GD32F103基础教程—注意事项(三)
  10. javascript轮播图超详细