{"id":15628546,"url":"https://github.com/yeyupiaoling/voiceprintrecognition-tensorflow","last_synced_at":"2025-04-06T03:07:54.421Z","repository":{"id":37750715,"uuid":"259839085","full_name":"yeyupiaoling/VoiceprintRecognition-Tensorflow","owner":"yeyupiaoling","description":"使用Tensorflow实现声纹识别","archived":false,"fork":false,"pushed_at":"2024-06-16T03:30:51.000Z","size":1058,"stargazers_count":308,"open_issues_count":0,"forks_count":66,"subscribers_count":4,"default_branch":"develop","last_synced_at":"2025-03-30T01:11:46.319Z","etag":null,"topics":["arcface","speaker-recognition","tensorflow","voice-recognition"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yeyupiaoling.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-04-29T06:05:38.000Z","updated_at":"2025-03-08T22:57:45.000Z","dependencies_parsed_at":"2024-06-16T04:30:41.477Z","dependency_job_id":null,"html_url":"https://github.com/yeyupiaoling/VoiceprintRecognition-Tensorflow","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeyupiaoling%2FVoiceprintRecognition-Tensorflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeyupiaoling%2FVoiceprintRecognition-Tensorflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeyupiaoling%2FVoiceprintRecognition-Tensorflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeyupiaoling%2FVoiceprintRecognition-Tensorflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yeyupiaoling","download_url":"https://codeload.github.com/yeyupiaoling/VoiceprintRecognition-Tensorflow/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247427006,"owners_count":20937201,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arcface","speaker-recognition","tensorflow","voice-recognition"],"created_at":"2024-10-03T10:23:01.224Z","updated_at":"2025-04-06T03:07:54.401Z","avatar_url":"https://github.com/yeyupiaoling.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 前言\n本章介绍如何使用Tensorflow实现简单的声纹识别模型，首先你需要熟悉音频分类，没有了解的可以查看这篇文章[《基于Tensorflow实现声音分类》](https://blog.doiduoyi.com/articles/1587654005620.html) 。基于这个知识基础之上，我们训练一个声纹识别模型，通过这个模型我们可以识别说话的人是谁，可以应用在一些需要音频验证的项目。不同的是本项目使用了ArcFace Loss，ArcFace loss：Additive Angular Margin Loss（加性角度间隔损失函数），对特征向量和权重归一化，对θ加上角度间隔m，角度间隔比余弦间隔在对角度的影响更加直接。\n\n**建议你使用这个版本 [VoiceprintRecognition-Pytorch](https://github.com/yeyupiaoling/VoiceprintRecognition-Pytorch) 或者 [VoiceprintRecognition-PaddlePaddle](https://github.com/yeyupiaoling/VoiceprintRecognition-PaddlePaddle) ，本项目已不维护。**\n\n**欢迎大家扫码入知识星球或者QQ群讨论，知识星球里面提供项目的模型文件和博主其他相关项目的模型文件，也包括其他一些资源。**\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://yeyupiaoling.cn/zsxq.png\" alt=\"知识星球\" width=\"400\"\u003e\n  \u003cimg src=\"https://yeyupiaoling.cn/qq.png\" alt=\"QQ群\" width=\"400\"\u003e\n\u003c/div\u003e\n\n\n使用环境：\n\n - Python 3.8\n - Tensorflow 2.13.0\n - Ubuntu 18.04 or Windows 10\n\n# 模型下载\n|                                 数据集                                 | 类别数量 | threshold |   EER   |   下载地址   |\n|:-------------------------------------------------------------------:|:----:|:---------:|:-------:|:--------:|\n| [zhvoice](https://aistudio.baidu.com/aistudio/datasetdetail/133922) | 2798 |  0.06820  | 0.06789 | 加入知识星球获取 |\n\n# 安装环境\n1. 安装Tensorflow，如果已经安装过Tensorflow，测无需再次安装。\n```shell\npip install tensorflow==2.13.0 -i https://pypi.tuna.tsinghua.edu.cn/simple\n```\n\n如果安装麻烦，也可以使用Docker容器，但要提前安装[安装 NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html)。\n```shell\nsudo docker pull tensorflow/tensorflow:2.13.0-gpu\nsudo docker run -itd --gpus all --name tensorflow -v $PWD/:/workspace/ tensorflow/tensorflow:2.13.0-gpu\nsudo docker exec -it tensorflow /bin/bash\n\n```\n\n2. 安装其他依赖库，命令如下。\n```shell\npip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple\n```\n\n2. 如果需要安装pyaudio，请用conda命令安装，pip安装很难成功，命令如下。\n```shell\nconda install pyaudio\n```\n\n# 创建数据\n本教程笔者使用的是[zhvoice](https://aistudio.baidu.com/aistudio/datasetdetail/133922) ，这个数据集经过处理，一共有2798个人的训练数据，91个人的评估数据，有80W+条语音数据。如果读者有其他更好的数据集，可以混合在一起使用，但要用python的工具模块aukit处理音频，降噪和去除静音。\n\n首先是创建一个数据列表，数据列表的格式为`\u003c语音文件路径\\t语音分类标签\u003e`，创建这个列表主要是方便之后的读取，也是方便读取使用其他的语音数据集，语音分类标签是指说话人的唯一ID，不同的语音数据集，可以通过编写对应的生成数据列表的函数，把这些数据集都写在同一个数据列表中。\n\n在`create_data.py`创建数据列表，在创建数据列表之后，可能有些数据的是错误的，所以我们要检查一下，将错误的数据删除。执行下面程序完成数据准备。\n```shell\npython create_data.py\n```\n\n执行上面的程序之后，会生成以下的数据格式，如果要自定义数据，参考如下数据列表，前面是音频的相对路径，后面的是该音频对应的说话人的标签，就跟分类一样。\n```\ndataset/zhvoice/zhaishell/S0002/BAC009S0002W0129.mp3    1104\ndataset/zhvoice/zhaishell/S0002/BAC009S0002W0130.mp3    1104\ndataset/zhvoice/zhaishell/S0002/BAC009S0002W0131.mp3    1104\ndataset/zhvoice/zhaishell/S0002/BAC009S0002W0132.mp3    1104\ndataset/zhvoice/zhaishell/S0002/BAC009S0002W0133.mp3    1104\ndataset/zhvoice/zhaishell/S0002/BAC009S0002W0134.mp3    1104\ndataset/zhvoice/zhaishell/S0002/BAC009S0002W0135.mp3    1104\ndataset/zhvoice/zhaishell/S0002/BAC009S0002W0136.mp3    1104\ndataset/zhvoice/zhaishell/S0002/BAC009S0002W0137.mp3    1104\ndataset/zhvoice/zhaishell/S0002/BAC009S0002W0138.mp3    1104\n```\n\n\n# 数据读取\n有了上面创建的数据列表和均值标准值，就可以用于训练读取。主要是把语音数据转换短时傅里叶变换的幅度谱，使用librosa可以很方便计算音频的特征，如梅尔频谱的API为`librosa.feature.melspectrogram()`，输出的是numpy值，可以直接用PaddlePaddle训练和预测。跟梅尔频谱同样很重要的梅尔倒谱（MFCCs）更多用于语音识别中，对应的API为`librosa.feature.mfcc()`。在本项目中使用的API分别是`librosa.stft()`和`librosa.magphase()`。在训练时，使用了数据增强，如随机翻转拼接，随机裁剪。经过处理，最终得到一个`257*257`的短时傅里叶变换的幅度谱。\n```python\nwav, sr_ret = librosa.load(audio_path, sr=sr)\nlinear = librosa.stft(extended_wav, n_fft=n_fft, win_length=win_length, hop_length=hop_length)\nlinear_T = linear.T\nmag, _ = librosa.magphase(linear_T)\nmag_T = mag.T\nfreq, freq_time = mag_T.shape\nspec_mag = mag_T[:, :spec_len]\nmean = np.mean(spec_mag, 0, keepdims=True)\nstd = np.std(spec_mag, 0, keepdims=True)\nspec_mag = (spec_mag - mean) / (std + 1e-5)\n```\n\n\n# 训练模型\n创建`train.py`开始训练模型，使用的是经过修改过的`resnet34`模型，数据输入层设置为`[None, 1, 257, 257]`，这个大小就是短时傅里叶变换的幅度谱的shape，如果读者使用了其他的语音长度，也需要修改这个值。每训练一轮结束之后，执行一次模型评估，计算模型的准确率，以观察模型的收敛情况。同样的，每一轮训练结束保存一次模型，分别保存了可以恢复训练的模型参数，也可以作为预训练模型参数。还保存预测模型，用于之后预测。\n```shell\npython train.py\n```\n\n训练过程中，会使用tensorboard保存训练日志，通过启动tensorboard可以随时查看训练结果，启动命令`tensorboard --logdir=log --host 0.0.0.0`\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./docs/images/loss.jpg\" alt=\"loss\" width=\"400\"\u003e\n  \u003cimg src=\"./docs/images/accuracy.jpg\" alt=\"准确率\" width=\"400\"\u003e\n\u003c/div\u003e\n\n# 评估模型\n训练结束之后会保存预测模型，我们用预测模型来预测测试集中的音频特征，然后使用音频特征进行两两对比，阈值从0到1,步长为0.01进行控制，找到最佳的阈值并计算准确率。\n```shell\npython eval.py\n```\n\n输出类似如下：\n```shell\n-----------  Configuration Arguments -----------\ninput_shape: (1, 257, 257)\nlist_path: dataset/test_list.txt\nmodel_path: models/infer/model\n------------------------------------------------\n\n开始提取全部的音频特征...\n100%|█████████████████████████████████████████████████████| 5332/5332 [01:09\u003c00:00, 77.06it/s]\n开始两两对比音频特征...\n100%|█████████████████████████████████████████████████████| 5332/5332 [01:43\u003c00:00, 51.62it/s]\n100%|█████████████████████████████████████████████████████| 100/100 [00:03\u003c00:00, 28.04it/s]\n当阈值为0.990000, 准确率最大，准确率为：0.999693\n```\n\n# 声纹对比\n下面开始实现声纹对比，创建`infer_contrast.py`程序，编写`infer()`函数，在编写模型的时候，模型是有两个输出的，第一个是模型的分类输出，第二个是音频特征输出。所以在这里要输出的是音频的特征值，有了音频的特征值就可以做声纹识别了。我们输入两个语音，通过预测函数获取他们的特征数据，使用这个特征数据可以求他们的对角余弦值，得到的结果可以作为他们相识度。对于这个相识度的阈值`threshold`，读者可以根据自己项目的准确度要求进行修改。\n```shell\npython infer_contrast.py --audio_path1=audio/a_1.wav --audio_path2=audio/b_2.wav\n```\n\n输出类似如下：\n```\n-----------  Configuration Arguments -----------\naudio_path1: audio/a_1.wav\naudio_path2: audio/b_1.wav\ninput_shape: (257, 257, 1)\nmodel_path: models/infer_model.h5\nthreshold: 0.7\n------------------------------------------------\nModel: \"functional_1\"\n_________________________________________________________________\nLayer (type)                 Output Shape              Param #   \n=================================================================\nresnet50v2_input (InputLayer [(None, 257, 257, 1)]     0         \n_________________________________________________________________\nresnet50v2 (Functional)      (None, 2048)              23558528  \n_________________________________________________________________\nbatch_normalization (BatchNo (None, 2048)              8192      \n=================================================================\nTotal params: 23,566,720\nTrainable params: 23,517,184\nNon-trainable params: 49,536\n_________________________________________________________________\n\naudio/a_1.wav 和 audio/b_1.wav 不是同一个人，相似度为：0.503458\n```\n\n\n# 声纹识别\n在上面的声纹对比的基础上，我们创建`infer_recognition.py`实现声纹识别。同样是使用上面声纹对比的`infer()`预测函数，通过这两个同样获取语音的特征数据。 不同的是笔者增加了`load_audio_db()`和`register()`，以及`recognition()`，第一个函数是加载声纹库中的语音数据，这些音频就是相当于已经注册的用户，他们注册的语音数据会存放在这里，如果有用户需要通过声纹登录，就需要拿到用户的语音和语音库中的语音进行声纹对比，如果对比成功，那就相当于登录成功并且获取用户注册时的信息数据。第二个函数`register()`其实就是把录音保存在声纹库中，同时获取该音频的特征添加到待对比的数据特征中。最后`recognition()`函数中，这个函数就是将输入的语音和语音库中的语音一一对比。\n有了上面的声纹识别的函数，读者可以根据自己项目的需求完成声纹识别的方式，例如笔者下面提供的是通过录音来完成声纹识别。首先必须要加载语音库中的语音，语音库文件夹为`audio_db`，然后用户回车后录音3秒钟，然后程序会自动录音，并使用录音到的音频进行声纹识别，去匹配语音库中的语音，获取用户的信息。通过这样方式，读者也可以修改成通过服务请求的方式完成声纹识别，例如提供一个API供APP调用，用户在APP上通过声纹登录时，把录音到的语音发送到后端完成声纹识别，再把结果返回给APP，前提是用户已经使用语音注册，并成功把语音数据存放在`audio_db`文件夹中。\n```shell\npython infer_recognition.py\n```\n\n输出类似如下：\n```\n-----------  Configuration Arguments -----------\naudio_db: audio_db\ninput_shape: (257, 257, 1)\nmodel_path: models/infer_model.h5\nthreshold: 0.7\n------------------------------------------------\nModel: \"functional_1\"\n_________________________________________________________________\nLayer (type)                 Output Shape              Param #   \n=================================================================\nresnet50v2_input (InputLayer [(None, 257, 257, 1)]     0         \n_________________________________________________________________\nresnet50v2 (Functional)      (None, 2048)              23558528  \n_________________________________________________________________\nbatch_normalization (BatchNo (None, 2048)              8192      \n=================================================================\nTotal params: 23,566,720\nTrainable params: 23,517,184\nNon-trainable params: 49,536\n_________________________________________________________________\n\nLoaded 李达康 audio.\nLoaded 沙瑞金 audio.\n请选择功能，0为注册音频到声纹库，1为执行声纹识别：0\n按下回车键开机录音，录音3秒中：\n开始录音......\n录音已结束!\n请输入该音频用户的名称：夜雨飘零\n请选择功能，0为注册音频到声纹库，1为执行声纹识别：1\n按下回车键开机录音，录音3秒中：\n开始录音......\n录音已结束!\n识别说话的为：夜雨飘零，相似度为：0.920434\n```\n\n# 其他版本\n - PaddlePaddle：[VoiceprintRecognition-PaddlePaddle](https://github.com/yeyupiaoling/VoiceprintRecognition-PaddlePaddle)\n - Pytorch：[VoiceprintRecognition-Pytorch](https://github.com/yeyupiaoling/VoiceprintRecognition-Pytorch)\n - Keras：[VoiceprintRecognition-Keras](https://github.com/yeyupiaoling/VoiceprintRecognition-Keras)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyeyupiaoling%2Fvoiceprintrecognition-tensorflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyeyupiaoling%2Fvoiceprintrecognition-tensorflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyeyupiaoling%2Fvoiceprintrecognition-tensorflow/lists"}