• Stars
    star
    267
  • Rank 153,621 (Top 4 %)
  • Language
    Python
  • License
    Apache License 2.0
  • Created over 4 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

使用Tensorflow实现声纹识别

前言

本章介绍如何使用Tensorflow实现简单的声纹识别模型,首先你需要熟悉音频分类,没有了解的可以查看这篇文章《基于Tensorflow实现声音分类》 。基于这个知识基础之上,我们训练一个声纹识别模型,通过这个模型我们可以识别说话的人是谁,可以应用在一些需要音频验证的项目。不同的是本项目使用了ArcFace Loss,ArcFace loss:Additive Angular Margin Loss(加性角度间隔损失函数),对特征向量和权重归一化,对θ加上角度间隔m,角度间隔比余弦间隔在对角度的影响更加直接。

建议你使用这个版本 VoiceprintRecognition-Pytorch 或者 VoiceprintRecognition-PaddlePaddle ,本项目已不维护。 使用环境:

  • Python 3.7
  • Tensorflow 2.3.0

模型下载

数据集 类别数量 准确率 下载地址
中文语音语料数据集 3242 0.999693 点击下载

安装环境

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

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

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

数据读取

有了上面创建的数据列表和均值标准值,就可以用于训练读取。主要是把语音数据转换短时傅里叶变换的幅度谱,使用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)
linear_T = linear.T
mag, _ = librosa.magphase(linear_T)
mag_T = mag.T
freq, freq_time = mag_T.shape
spec_mag = mag_T[:, :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

训练过程中,会使用tensorboard保存训练日志,通过启动tensorboard可以随时查看训练结果,启动命令tensorboard --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.990000, 准确率最大,准确率为:0.999693

声纹对比

下面开始实现声纹对比,创建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_1.wav
input_shape: (257, 257, 1)
model_path: models/infer_model.h5
threshold: 0.7
------------------------------------------------
Model: "functional_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
resnet50v2_input (InputLayer [(None, 257, 257, 1)]     0         
_________________________________________________________________
resnet50v2 (Functional)      (None, 2048)              23558528  
_________________________________________________________________
batch_normalization (BatchNo (None, 2048)              8192      
=================================================================
Total params: 23,566,720
Trainable params: 23,517,184
Non-trainable params: 49,536
_________________________________________________________________

audio/a_1.wav 和 audio/b_1.wav 不是同一个人,相似度为:0.503458

声纹识别

在上面的声纹对比的基础上,我们创建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: (257, 257, 1)
model_path: models/infer_model.h5
threshold: 0.7
------------------------------------------------
Model: "functional_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
resnet50v2_input (InputLayer [(None, 257, 257, 1)]     0         
_________________________________________________________________
resnet50v2 (Functional)      (None, 2048)              23558528  
_________________________________________________________________
batch_normalization (BatchNo (None, 2048)              8192      
=================================================================
Total params: 23,566,720
Trainable params: 23,517,184
Non-trainable params: 49,536
_________________________________________________________________

Loaded 李达康 audio.
Loaded 沙瑞金 audio.
请选择功能,0为注册音频到声纹库,1为执行声纹识别:0
按下回车键开机录音,录音3秒中:
开始录音......
录音已结束!
请输入该音频用户的名称:夜雨飘零
请选择功能,0为注册音频到声纹库,1为执行声纹识别:1
按下回车键开机录音,录音3秒中:
开始录音......
录音已结束!
识别说话的为:夜雨飘零,相似度为:0.920434

其他版本

More Repositories

1

PPASR

基于PaddlePaddle实现端到端中文语音识别,从入门到实战,超简单的入门案例,超实用的企业项目。支持当前最流行的DeepSpeech2、Conformer、Squeezeformer模型
Python
699
star
2

PaddlePaddle-DeepSpeech

基于PaddlePaddle实现的语音识别,中文语音识别。项目完善,识别效果好。支持Windows,Linux下训练和预测,支持Nvidia Jetson开发板预测。
Python
583
star
3

VoiceprintRecognition-Pytorch

This project uses a variety of advanced voiceprint recognition models such as EcapaTdnn, ResNetSE, ERes2Net, CAM++, etc. It is not excluded that more models will be supported in the future. At the same time, this project also supports MelSpectrogram, Spectrogram data preprocessing methods
Python
503
star
4

MASR

Pytorch实现的流式与非流式的自动语音识别框架,同时兼容在线和离线识别,目前支持Conformer、Squeezeformer、DeepSpeech2模型,支持多种数据增强方法。
Python
462
star
5

Whisper-Finetune

Fine-tune the Whisper speech recognition model to support training without timestamp data, training with timestamp data, and training without speech data. Accelerate inference and support Web deployment, Windows desktop deployment, and Android deployment
C
443
star
6

LearnPaddle

PaddlePaddle V2版本系列教程,博客专栏:
Python
359
star
7

AudioClassification-Pytorch

The Pytorch implementation of sound classification supports EcapaTdnn, PANNS, TDNN, Res2Net, ResNetSE and other models, as well as a variety of preprocessing methods.
Python
207
star
8

VoiceprintRecognition-PaddlePaddle

本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM++等多种先进的声纹识别模型,同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法
Python
163
star
9

LearnPaddle2

PaddlePaddle Fluid 版本系列教程,CSDN博客专栏:
Python
153
star
10

ClassificationForAndroid

在Android使用深度学习模型实现图像识别,本项目提供了多种使用方式,使用到的框架如下:Tensorflow Lite、Paddle Lite、MNN、TNN
C++
144
star
11

VoiceprintRecognition-Keras

基于Kersa实现的声纹识别模型
Python
103
star
12

PP-YOLOE

PaddlePaddle实现的目标检测模型PP-YOLOE
Python
99
star
13

Pytorch-MTCNN

基于Pytorch实现的MTCNN模型,人脸检测,人脸关键点检测。
Python
96
star
14

PunctuationModel

中文标点符号模型,可以给文本添加标点符号。
Python
88
star
15

Pytorch-MobileFaceNet

Pytorch实现的人脸识别明细MobileFaceNet模型,在预测使用MTCNN检测人脸,然后使用MobileFaceNet模型识别。
Python
83
star
16

FaceDataset

制作亚洲人脸数据集
Python
83
star
17

AudioClassification-Tensorflow

基于Tensorflow实现声音分类,博客地址:
Python
82
star
18

AudioClassification-PaddlePaddle

基于PaddlePaddle实现的音频分类,支持EcapaTdnn、PANNS、TDNN、Res2Net、ResNetSE等各种模型,还有多种预处理方法
Python
71
star
19

SpeechEmotionRecognition-Pytorch

基于Pytorch实现的语音情感识别
Python
54
star
20

PaddlePaddle-MobileFaceNets

PaddlePaddle实现的人脸识别模型MobileFaceNets,在预测的是使用MTCNN检测人脸,然后MobileFaceNets模型识别。
Python
53
star
21

PaddlePaddle-SSD

基于PaddlePaddle实现的SSD,包括MobileNetSSD,MobileNetV2SSD,VGGSSD,ResNetSSD
Python
53
star
22

Tensorflow-FaceRecognition

基于MTCNN和MobileFaceNet实现的人脸识别,提供三种预测方式,满足各种需求 。
Python
50
star
23

PaddlePaddle-CrowdNet

基于PaddlePaddle实现的人流密度识别模型CrowdNet
Python
42
star
24

FaceKeyPointsMask

人脸检测、口罩识别、关键检测
Java
37
star
25

SpeechEmotionRecognition-PaddlePaddle

语音感情识别
Python
26
star
26

PaddlePaddle-MTCNN

基于PaddlePaddle复现的MTCNN人脸检测模型
Python
24
star
27

PaddlePaddleCourse

《PaddlePaddle从入门到实战》源码
Python
22
star
28

ReinforcementLearning

强化学习教程
Python
22
star
29

PaddlePaddle-CRNN

基于PaddlePaddle2.0实现的CRNN模型,文字识别
Python
21
star
30

Age-Gender-MXNET

MXNET实现的年龄性别识别,训练了超大数据集得到的模型。
Python
19
star
31

ChangeHumanBackground

人物更换背景
Java
18
star
32

BookSource

《深度学习应用实战之PaddlePaddle》的源码
Python
18
star
33

Chinese-LLM-Chat

大语言模型微调的项目,包含了使用QLora微调ChatGLM和LLama
Python
16
star
34

CameraXApp

CameraX实现的相机
Kotlin
12
star
35

yeyupiaoling

8
star
36

Pytorch-PPO

基于Pytorch实现的PPO强化学习模型,支持训练各种游戏,如超级马里奥,雪人兄弟,魂斗罗等等。
Python
7
star
37

VITS-Pytorch

本项目是基于Pytorch的语音合成项目,使用的是VITS,VITS是一种语音合成方法,这种时端到端的模型使用起来非常简单,不需要文本对齐等太复杂的流程,直接一键训练和生成,大大降低了学习门槛。
Python
6
star
38

PaddlePaddle-Classification

PaddlePaddle实现的图像分类模型
Python
5
star
39

PaddlePaddle-OCR

基于PaddlePaddle实现的OCR,包括CRNN和Attention模型
Python
3
star
40

DetectionForAndroid

C++
3
star
41

VITS-PaddlePaddle

本项目是基于PaddlePaddle的语音合成项目,使用的是VITS,VITS是一种语音合成方法,这种时端到端的模型使用起来非常简单,不需要文本对齐等太复杂的流程,直接一键训练和生成,大大降低了学习门槛。
Python
3
star
42

NettySendPhoto

在Android中使用Netty互相发送图片和文字
Java
2
star
43

YeAudio

Python的音频工具
Python
2
star
44

yeyupiaoling.github.io

夜雨飘零的个人博客
HTML
1
star