[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-yeyupiaoling--VoiceprintRecognition-Pytorch":3,"tool-yeyupiaoling--VoiceprintRecognition-Pytorch":64},[4,17,27,35,43,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,3,"2026-04-05T11:01:52",[13,14,15],"开发框架","图像","Agent","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":23,"last_commit_at":24,"category_tags":25,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",138956,2,"2026-04-05T11:33:21",[13,15,26],"语言模型",{"id":28,"name":29,"github_repo":30,"description_zh":31,"stars":32,"difficulty_score":23,"last_commit_at":33,"category_tags":34,"status":16},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[13,14,15],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":23,"last_commit_at":41,"category_tags":42,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,26],{"id":44,"name":45,"github_repo":46,"description_zh":47,"stars":48,"difficulty_score":23,"last_commit_at":49,"category_tags":50,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[14,51,52,53,15,54,26,13,55],"数据工具","视频","插件","其他","音频",{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":10,"last_commit_at":62,"category_tags":63,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[15,14,13,26,54],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":75,"owner_name":76,"owner_avatar_url":77,"owner_bio":78,"owner_company":79,"owner_location":79,"owner_email":79,"owner_twitter":79,"owner_website":79,"owner_url":80,"languages":81,"stars":86,"forks":87,"last_commit_at":88,"license":89,"difficulty_score":10,"env_os":90,"env_gpu":91,"env_ram":92,"env_deps":93,"category_tags":101,"github_topics":102,"view_count":23,"oss_zip_url":79,"oss_zip_packed_at":79,"status":16,"created_at":108,"updated_at":109,"faqs":110,"releases":149},3001,"yeyupiaoling\u002FVoiceprintRecognition-Pytorch","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","VoiceprintRecognition-Pytorch 是一个基于 PyTorch 框架打造的高效声纹识别系统，旨在帮助开发者轻松实现“听音辨人”的功能。它主要解决了从音频数据中提取说话人特征、进行身份验证以及区分不同说话人的技术难题，广泛应用于安全认证、语音日志分析等场景。\n\n该项目非常适合人工智能开发者、声学研究人员以及希望快速搭建声纹应用的技术团队使用。其核心优势在于集成了多种业界先进的模型架构，如 EcapaTdnn、ResNetSE、ERes2Net 和 CAM++ 等，并支持灵活的池化层与数据增强策略。在算法层面，VoiceprintRecognition-Pytorch 采用了 ArcFace Loss 等高性能损失函数，通过加性角度间隔优化特征分布，显著提升了识别准确率。此外，它还提供了丰富的数据预处理选项（如 MelSpectrogram、MFCC）及完整的训练、评估与推理流程，甚至包含在线试用与微信小程序演示，极大地降低了从理论研究到工程落地的门槛，是探索声纹识别领域的得力助手。","简体中文 | [English](.\u002FREADME_en.md)\n\n# 基于Pytorch实现的声纹识别系统\n\n![python version](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.8+-orange.svg)\n![GitHub forks](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fforks\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch)\n![GitHub Repo stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch)\n![GitHub](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch)\n![支持系统](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F支持系统-Win\u002FLinux\u002FMAC-9cf)\n\n本分支为1.1版本，如果要使用之前的1.0版本请在[1.0分支](https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch\u002Ftree\u002Frelease\u002F1.0.5)使用。本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM++等多种先进的声纹识别模型，不排除以后会支持更多模型，同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法，使用了ArcFace Loss，ArcFace loss：Additive Angular Margin Loss（加性角度间隔损失函数），对应项目中的AAMLoss，对特征向量和权重归一化，对θ加上角度间隔m，角度间隔比余弦间隔在对角度的影响更加直接，除此之外，还支持AMLoss、ARMLoss、CELoss等多种损失函数。\n\n**本项目是如果对你有帮助，欢迎Star，避免之后需要找不到了。**\n\n**欢迎大家扫码入知识星球或者QQ群讨论，知识星球里面提供项目的模型文件和博主其他相关项目的模型文件，也包括其他一些资源。**\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_d4ba433d3d87.jpg\" alt=\"知识星球\" width=\"400\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_645bdcaba681.jpg\" alt=\"QQ群\" width=\"400\">\n\u003C\u002Fdiv>\n\n使用环境：\n\n - Anaconda 3\n - Python 3.11\n - Pytorch 2.4.0\n - Windows 11 or Ubuntu 22.04\n\n# 在线试用\n\n - **网页版：[声纹对比](https:\u002F\u002Ftools.yeyupiaoling.cn\u002Fspeech\u002Fvoiceprint_compare)**\n - **网页版：[声纹识别](https:\u002F\u002Ftools.yeyupiaoling.cn\u002Fspeech\u002Fvoiceprint_recognition)**\n - **网页版：[说话人日志](https:\u002F\u002Ftools.yeyupiaoling.cn\u002Fspeech\u002Fspeaker_diarization)**\n\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_9e492f9a8928.jpg\" alt=\"微信小程序\" width=\"200\">&nbsp&nbsp\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_45e8a0897daa.jpg\" alt=\"微信小程序\" width=\"200\">&nbsp&nbsp\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_3af775332325.jpg\" alt=\"微信小程序\" width=\"200\">\u003Cbr\u002F>\n  声纹对比微信小程序   &nbsp &nbsp &nbsp &nbsp  声纹识别微信小程序     &nbsp &nbsp &nbsp &nbsp   说话人日志微信小程序\n\u003C\u002Fdiv>\n\n\n\n# 目录\n\n- [项目介绍](#基于Pytorch实现的声纹识别系统)\n- [项目记录](#项目记录)\n- [项目特性](#项目特性)\n- [安装环境](#安装环境)\n- [创建数据](#创建数据)\n- [修改预处理方法（可选）](#修改预处理方法可选)\n- [提取特征（可选）](#提取特征可选)\n- [训练模型](#训练模型)\n- [评估模型](#评估模型)\n- [推理接口](#推理接口)\n- [声纹对比](#声纹对比)\n- [声纹识别](#声纹识别)\n- [说话人日志（分离说话人）](#说话人日志分离说话人)\n\n\n# 项目记录\n\n1. 2024.10.12：发布1.1版本。\n\n# 项目特性\n\n1. 支持模型：EcapaTdnn、TDNN、Res2Net、ResNetSE、ERes2Net、CAM++\n2. 支持池化层：AttentiveStatsPool(ASP)、SelfAttentivePooling(SAP)、TemporalStatisticsPooling(TSP)、TemporalAveragePooling(TAP)、TemporalStatsPool(TSTP)\n3. 支持损失函数：AAMLoss、SphereFace2、AMLoss、ARMLoss、CELoss、SubCenterLoss、TripletAngularMarginLoss\n4. 支持预处理方法：MelSpectrogram、Spectrogram、MFCC、Fbank、Wav2vec2.0、WavLM\n5. 支持数据增强方法：语速增强、音量增强、噪声增强、混响增强、SpecAugment\n\n\n**模型论文：**\n\n- EcapaTdnn：[ECAPA-TDNN: Emphasized Channel Attention, Propagation and Aggregation in TDNN Based Speaker Verification](https:\u002F\u002Farxiv.org\u002Fabs\u002F2005.07143v3)\n- PANNS：[PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition](https:\u002F\u002Farxiv.org\u002Fabs\u002F1912.10211v5)\n- TDNN：[Prediction of speech intelligibility with DNN-based performance measures](https:\u002F\u002Farxiv.org\u002Fabs\u002F2203.09148)\n- Res2Net：[Res2Net: A New Multi-scale Backbone Architecture](https:\u002F\u002Farxiv.org\u002Fabs\u002F1904.01169)\n- ResNetSE：[Squeeze-and-Excitation Networks](https:\u002F\u002Farxiv.org\u002Fabs\u002F1709.01507)\n- CAMPPlus：[CAM++: A Fast and Efficient Network for Speaker Verification Using Context-Aware Masking](https:\u002F\u002Farxiv.org\u002Fabs\u002F2303.00332v3)\n- ERes2Net：[An Enhanced Res2Net with Local and Global Feature Fusion for Speaker Verification](https:\u002F\u002Farxiv.org\u002Fabs\u002F2305.12838v1)\n\n\n# 模型下载\n\n### 训练CN-Celeb数据，共有2796个说话人。\n\n|     模型     | Params(M) |                数据集                 | train speakers | threshold |   EER   | MinDCF  |   模型下载   |\n|:----------:|:---------:|:----------------------------------:|:--------------:|:---------:|:-------:|:-------:|:--------:|\n| ERes2NetV2 |    6.6    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.20089  | 0.08071 | 0.45705 | 加入知识星球获取 |\n|  ERes2Net  |    6.6    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.20014  | 0.08132 | 0.45544 | 加入知识星球获取 |\n|   CAM++    |    6.8    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.23323  | 0.08332 | 0.48536 | 加入知识星球获取 |\n|  ResNetSE  |    7.8    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.19066  | 0.08544 | 0.49142 | 加入知识星球获取 |\n| EcapaTdnn  |    6.1    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.23646  | 0.09259 | 0.51378 | 加入知识星球获取 |\n|    TDNN    |    2.6    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.23858  | 0.10825 | 0.59545 | 加入知识星球获取 |\n|  Res2Net   |    5.0    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.19526  | 0.12436 | 0.65347 | 加入知识星球获取 |\n|   CAM++    |    6.8    |               更大数据集                |      2W+       |   0.33    | 0.07874 | 0.52524 | 加入知识星球获取 |\n|  ERes2Net  |   55.1    |               其他数据集                |      20W+      |   0.36    | 0.02936 | 0.18355 | 加入知识星球获取 |\n| ERes2NetV2 |   56.2    |               其他数据集                |      20W+      |   0.36    | 0.03847 | 0.24301 | 加入知识星球获取 |\n|   CAM++    |    6.8    |               其他数据集                |      20W+      |   0.29    | 0.04765 | 0.31436 | 加入知识星球获取 |\n\n说明：\n1. 评估的测试集为[CN-Celeb的测试集](https:\u002F\u002Faistudio.baidu.com\u002Faistudio\u002Fdatasetdetail\u002F233361)，包含196个说话人。\n2. 使用语速增强分类大小翻三倍`speed_perturb_3_class: True`。\n3. 使用的预处理方法为`Fbank`，损失函数为`AAMLoss`。\n4. 参数数量不包含了分类器的参数数量。\n5. 使用了噪声增强和混响增强。\n\n\n### 训练VoxCeleb1&2数据，共有7205个说话人。\n\n|     模型     | Params(M) |     数据集     | train speakers | threshold |   EER   | MinDCF  |   模型下载   |\n|:----------:|:---------:|:-----------:|:--------------:|:---------:|:-------:|:-------:|:--------:|\n|   CAM++    |    6.8    | VoxCeleb1&2 |      7205      |  0.22504  | 0.02436 | 0.15543 | 加入知识星球获取 |\n| EcapaTdnn  |    6.1    | VoxCeleb1&2 |      7205      |  0.24877  | 0.02480 | 0.16188 | 加入知识星球获取 |\n| ERes2NetV2 |    6.6    | VoxCeleb1&2 |      7205      |  0.20710  | 0.02742 | 0.17709 | 加入知识星球获取 |\n|  ERes2Net  |    6.6    | VoxCeleb1&2 |      7205      |  0.20233  | 0.02954 | 0.17377 | 加入知识星球获取 |\n|  ResNetSE  |    7.8    | VoxCeleb1&2 |      7205      |  0.22567  | 0.03189 | 0.23040 | 加入知识星球获取 |\n|    TDNN    |    2.6    | VoxCeleb1&2 |      7205      |  0.23834  | 0.03486 | 0.26792 | 加入知识星球获取 |\n|  Res2Net   |    5.0    | VoxCeleb1&2 |      7205      |  0.19472  | 0.04370 | 0.40072 | 加入知识星球获取 |\n|   CAM++    |    6.8    |    更大数据集    |      2W+       |   0.28    | 0.03182 | 0.23731 | 加入知识星球获取 |\n|  ERes2Net  |   55.1    |    其他数据集    |      20W+      |   0.53    | 0.08904 | 0.62130 | 加入知识星球获取 |\n| ERes2NetV2 |   56.2    |    其他数据集    |      20W+      |   0.52    | 0.08649 | 0.64193 | 加入知识星球获取 |\n|   CAM++    |    6.8    |    其他数据集    |      20W+      |   0.49    | 0.10334 | 0.71200 | 加入知识星球获取 |\n\n说明：\n\n1. 评估的测试集为[VoxCeleb1&2的测试集](https:\u002F\u002Faistudio.baidu.com\u002Faistudio\u002Fdatasetdetail\u002F255977)，包含158个说话人。\n2. 使用语速增强分类大小翻三倍`speed_perturb_3_class: True`。\n3. 使用的预处理方法为`Fbank`，损失函数为`AAMLoss`。\n4. 参数数量不包含了分类器的参数数量。\n\n\n### 预处理方法效果对比实验\n\n|                                      预处理方法                                       |   数据集    | train speakers | threshold |   EER   | MinDCF  |   模型下载   |\n|:--------------------------------------------------------------------------------:|:--------:|:--------------:|:---------:|:-------:|:-------:|:--------:|\n|                                      Fbank                                       | CN-Celeb |      2796      |  0.14574  | 0.10988 | 0.58955 | 加入知识星球获取 |\n|                                       MFCC                                       | CN-Celeb |      2796      |  0.14868  | 0.11483 | 0.61275 | 加入知识星球获取 |\n|                                   Spectrogram                                    | CN-Celeb |      2796      |  0.14962  | 0.11613 | 0.60057 | 加入知识星球获取 |\n|                                  MelSpectrogram                                  | CN-Celeb |      2796      |  0.13458  | 0.12498 | 0.60741 | 加入知识星球获取 |\n|       [wavlm-base-plus](https:\u002F\u002Fhuggingface.co\u002Fmicrosoft\u002Fwavlm-base-plus)        | CN-Celeb |      2796      |  0.14166  | 0.13247 | 0.62451 | 加入知识星球获取 |\n|           [w2v-bert-2.0](https:\u002F\u002Fhuggingface.co\u002Ffacebook\u002Fw2v-bert-2.0)           | CN-Celeb |      2796      |           |         |         | 加入知识星球获取 |\n| [wav2vec2-large-xlsr-53](https:\u002F\u002Fhuggingface.co\u002Ffacebook\u002Fwav2vec2-large-xlsr-53) | CN-Celeb |      2796      |           |         |         | 加入知识星球获取 |\n|           [wavlm-large](https:\u002F\u002Fhuggingface.co\u002Fmicrosoft\u002Fwavlm-large)            | CN-Celeb |      2796      |           |         |         | 加入知识星球获取 |\n\n说明：\n\n1. 评估的测试集为[CN-Celeb的测试集](https:\u002F\u002Faistudio.baidu.com\u002Faistudio\u002Fdatasetdetail\u002F233361)，包含196个说话人。\n2. 实验数据为[CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F)，实验模型为`CAM++`，损失函数为`AAMLoss`。\n3. 数据使用`extract_features.py`提前提取特征，也就是说训练中没有使用对音频的数据增强。\n4. `w2v-bert-2.0`、`wav2vec2-large-xlsr-53`是多语言数据预训练得到的，`wavlm-base-plus`、`wavlm-large`的预训练数据仅用英文。\n\n\n### 损失函数效果对比实验\n\n|           损失函数           |   数据集    | train speakers | threshold |   EER   | MinDCF  |   模型下载   |\n|:------------------------:|:--------:|:--------------:|:---------:|:-------:|:-------:|:--------:|\n|         AAMLoss          | CN-Celeb |      2796      |  0.14574  | 0.10988 | 0.58955 | 加入知识星球获取 |\n|       SphereFace2        | CN-Celeb |      2796      |  0.20377  | 0.11309 | 0.61536 | 加入知识星球获取 |\n| TripletAngularMarginLoss | CN-Celeb |      2796      |  0.28940  | 0.11749 | 0.63735 | 加入知识星球获取 |\n|      SubCenterLoss       | CN-Celeb |      2796      |  0.13126  | 0.11775 | 0.56995 | 加入知识星球获取 |\n|         ARMLoss          | CN-Celeb |      2796      |  0.14563  | 0.11805 | 0.57171 | 加入知识星球获取 |\n|          AMLoss          | CN-Celeb |      2796      |  0.12870  | 0.12301 | 0.63263 | 加入知识星球获取 |\n|          CELoss          | CN-Celeb |      2796      |  0.13607  | 0.12684 | 0.65176 | 加入知识星球获取 |\n\n说明：\n\n1. 评估的测试集为[CN-Celeb的测试集](https:\u002F\u002Faistudio.baidu.com\u002Faistudio\u002Fdatasetdetail\u002F233361)，包含196个说话人。\n2. 实验数据为[CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F)，实验模型为`CAM++`，预处理方法为`Fbank`。\n3. 数据使用`extract_features.py`提前提取特征，也就是说训练中没有使用对音频的数据增强。\n\n\n## 安装环境\n\n - 首先安装的是Pytorch的GPU版本，如果已经安装过了，请跳过。\n```shell\nconda install pytorch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 pytorch-cuda=11.8 -c pytorch -c nvidia\n```\n\n - 安装ppvector库。\n \n使用pip安装，命令如下：\n```shell\npython -m pip install mvector -U -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n```\n\n**建议源码安装**，源码安装能保证使用最新代码。\n```shell\ngit clone https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch.git\ncd VoiceprintRecognition-Pytorch\u002F\npip install .\n```\n\n# 创建数据\n本教程笔者使用的是[CN-Celeb](https:\u002F\u002Fopenslr.elda.org\u002Fresources\u002F82)，这个数据集一共有约3000个人的语音数据，有65W+条语音数据，下载之后要解压数据集到`dataset`目录，另外如果要评估，还需要下载[CN-Celeb的测试集](https:\u002F\u002Faistudio.baidu.com\u002Faistudio\u002Fdatasetdetail\u002F233361)。如果读者有其他更好的数据集，可以混合在一起使用，但最好是要用python的工具模块aukit处理音频，降噪和去除静音。\n\n首先是创建一个数据列表，数据列表的格式为`\u003C语音文件路径\\t语音分类标签>`，创建这个列表主要是方便之后的读取，也是方便读取使用其他的语音数据集，语音分类标签是指说话人的唯一ID，不同的语音数据集，可以通过编写对应的生成数据列表的函数，把这些数据集都写在同一个数据列表中。\n\n执行`create_data.py`程序完成数据准备。\n```shell\npython create_data.py\n```\n\n执行上面的程序之后，会生成以下的数据格式，如果要自定义数据，参考如下数据列表，前面是音频的相对路径，后面的是该音频对应的说话人的标签，就跟分类一样。**自定义数据集的注意**，测试数据列表的ID可以不用跟训练的ID一样，也就是说测试的数据的说话人可以不用出现在训练集，只要保证测试数据列表中同一个人相同的ID即可。\n```\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-03-019.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-10-023.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-06-025.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-04-014.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-06-030.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-10-032.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-06-028.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-10-031.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-05-003.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-04-017.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-10-016.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-09-001.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-05-010.flac      2795\n```\n\n# 修改预处理方法（可选）\n\n配置文件中默认使用的是Fbank预处理方法，如果要使用其他预处理方法，可以修改配置文件中的安装下面方式修改，具体的值可以根据自己情况修改。如果不清楚如何设置参数，可以直接删除该部分，直接使用默认值。\n\n```yaml\n# 数据预处理参数\npreprocess_conf:\n  # 是否使用HF上的Wav2Vec2类似模型提取音频特征\n  use_hf_model: False\n  # 音频预处理方法，也可以叫特征提取方法\n  # 当use_hf_model为False时，支持：MelSpectrogram、Spectrogram、MFCC、Fbank\n  # 当use_hf_model为True时，指定的是HuggingFace的模型或者本地路径，比如facebook\u002Fw2v-bert-2.0或者.\u002Ffeature_models\u002Fw2v-bert-2.0\n  feature_method: 'Fbank'\n  # 当use_hf_model为False时，设置API参数，更参数查看对应API，不清楚的可以直接删除该部分，直接使用默认值。\n  # 当use_hf_model为True时，可以设置参数use_gpu，指定是否使用GPU提取特征\n  method_args:\n    sample_frequency: 16000\n    num_mel_bins: 80\n```\n\n# 提取特征（可选）\n\n在训练过程中，首先是要读取音频数据，然后提取特征，最后再进行训练。其中读取音频数据、提取特征也是比较消耗时间的，所以我们可以选择提前提取好取特征，训练模型的是就可以直接加载提取好的特征，这样训练速度会更快。这个提取特征是可选择，如果没有提取好的特征，训练模型的时候就会从读取音频数据，然后提取特征开始。提取特征步骤如下：\n\n1. 执行`extract_features.py`，提取特征，特征会保存在`dataset\u002Ffeatures`目录下，并生成新的数据列表`train_list_features.txt`、`enroll_list_features.txt`和`trials_list_features.txt`。\n\n```shell\npython extract_features.py --configs=configs\u002Fcam++.yml --save_dir=dataset\u002Ffeatures\n```\n\n2. 修改配置文件，将`dataset_conf.train_list`、`dataset_conf.enroll_list`和`dataset_conf.trials_list`修改为`train_list_features.txt`、`enroll_list_features.txt`和`trials_list_features.txt`。\n\n\n# 训练模型\n使用`train.py`训练模型，本项目支持多个音频预处理方式，通过`configs\u002Fecapa_tdnn.yml`配置文件的参数`preprocess_conf.feature_method`可以指定，`MelSpectrogram`为梅尔频谱，`Spectrogram`为语谱图，`MFCC`梅尔频谱倒谱系数等等。通过参数`augment_conf_path`可以指定数据增强方式。训练过程中，会使用VisualDL保存训练日志，通过启动VisualDL可以随时查看训练结果，启动命令`visualdl --logdir=log --host 0.0.0.0`\n```shell\n# 单卡训练\nCUDA_VISIBLE_DEVICES=0 python train.py\n# 多卡训练\nCUDA_VISIBLE_DEVICES=0,1 torchrun --standalone --nnodes=1 --nproc_per_node=2 train.py\n```\n\n训练输出日志：\n```\n[2023-08-05 09:52:06.497988 INFO   ] utils:print_arguments:13 - ----------- 额外配置参数 -----------\n[2023-08-05 09:52:06.498094 INFO   ] utils:print_arguments:15 - configs: configs\u002Fecapa_tdnn.yml\n[2023-08-05 09:52:06.498149 INFO   ] utils:print_arguments:15 - do_eval: True\n[2023-08-05 09:52:06.498191 INFO   ] utils:print_arguments:15 - local_rank: 0\n[2023-08-05 09:52:06.498230 INFO   ] utils:print_arguments:15 - pretrained_model: None\n[2023-08-05 09:52:06.498269 INFO   ] utils:print_arguments:15 - resume_model: None\n[2023-08-05 09:52:06.498306 INFO   ] utils:print_arguments:15 - save_model_path: models\u002F\n[2023-08-05 09:52:06.498342 INFO   ] utils:print_arguments:15 - use_gpu: True\n[2023-08-05 09:52:06.498378 INFO   ] utils:print_arguments:16 - ------------------------------------------------\n[2023-08-05 09:52:06.513761 INFO   ] utils:print_arguments:18 - ----------- 配置文件参数 -----------\n[2023-08-05 09:52:06.513906 INFO   ] utils:print_arguments:21 - dataset_conf:\n[2023-08-05 09:52:06.513957 INFO   ] utils:print_arguments:24 -         dataLoader:\n[2023-08-05 09:52:06.513995 INFO   ] utils:print_arguments:26 -                 batch_size: 64\n[2023-08-05 09:52:06.514031 INFO   ] utils:print_arguments:26 -                 num_workers: 4\n[2023-08-05 09:52:06.514066 INFO   ] utils:print_arguments:28 -         do_vad: False\n[2023-08-05 09:52:06.514101 INFO   ] utils:print_arguments:28 -         enroll_list: dataset\u002Fenroll_list.txt\n[2023-08-05 09:52:06.514135 INFO   ] utils:print_arguments:24 -         eval_conf:\n[2023-08-05 09:52:06.514169 INFO   ] utils:print_arguments:26 -                 batch_size: 1\n[2023-08-05 09:52:06.514203 INFO   ] utils:print_arguments:26 -                 max_duration: 20\n[2023-08-05 09:52:06.514237 INFO   ] utils:print_arguments:28 -         max_duration: 3\n[2023-08-05 09:52:06.514274 INFO   ] utils:print_arguments:28 -         min_duration: 0.5\n[2023-08-05 09:52:06.514308 INFO   ] utils:print_arguments:28 -         noise_aug_prob: 0.2\n[2023-08-05 09:52:06.514342 INFO   ] utils:print_arguments:28 -         noise_dir: dataset\u002Fnoise\n[2023-08-05 09:52:06.514374 INFO   ] utils:print_arguments:28 -         num_speakers: 3242\n[2023-08-05 09:52:06.514408 INFO   ] utils:print_arguments:28 -         sample_rate: 16000\n[2023-08-05 09:52:06.514441 INFO   ] utils:print_arguments:28 -         speed_perturb: True\n[2023-08-05 09:52:06.514475 INFO   ] utils:print_arguments:28 -         target_dB: -20\n[2023-08-05 09:52:06.514508 INFO   ] utils:print_arguments:28 -         train_list: dataset\u002Ftrain_list.txt\n[2023-08-05 09:52:06.514542 INFO   ] utils:print_arguments:28 -         trials_list: dataset\u002Ftrials_list.txt\n[2023-08-05 09:52:06.514575 INFO   ] utils:print_arguments:28 -         use_dB_normalization: True\n[2023-08-05 09:52:06.514609 INFO   ] utils:print_arguments:21 - loss_conf:\n[2023-08-05 09:52:06.514643 INFO   ] utils:print_arguments:24 -         args:\n[2023-08-05 09:52:06.514678 INFO   ] utils:print_arguments:26 -                 easy_margin: False\n[2023-08-05 09:52:06.514713 INFO   ] utils:print_arguments:26 -                 margin: 0.2\n[2023-08-05 09:52:06.514746 INFO   ] utils:print_arguments:26 -                 scale: 32\n[2023-08-05 09:52:06.514779 INFO   ] utils:print_arguments:24 -         margin_scheduler_args:\n[2023-08-05 09:52:06.514814 INFO   ] utils:print_arguments:26 -                 final_margin: 0.3\n[2023-08-05 09:52:06.514848 INFO   ] utils:print_arguments:28 -         use_loss: AAMLoss\n[2023-08-05 09:52:06.514882 INFO   ] utils:print_arguments:28 -         use_margin_scheduler: True\n[2023-08-05 09:52:06.514915 INFO   ] utils:print_arguments:21 - model_conf:\n[2023-08-05 09:52:06.514950 INFO   ] utils:print_arguments:24 -         backbone:\n[2023-08-05 09:52:06.514984 INFO   ] utils:print_arguments:26 -                 embd_dim: 192\n[2023-08-05 09:52:06.515017 INFO   ] utils:print_arguments:26 -                 pooling_type: ASP\n[2023-08-05 09:52:06.515050 INFO   ] utils:print_arguments:24 -         classifier:\n[2023-08-05 09:52:06.515084 INFO   ] utils:print_arguments:26 -                 num_blocks: 0\n[2023-08-05 09:52:06.515118 INFO   ] utils:print_arguments:21 - optimizer_conf:\n[2023-08-05 09:52:06.515154 INFO   ] utils:print_arguments:28 -         learning_rate: 0.001\n[2023-08-05 09:52:06.515188 INFO   ] utils:print_arguments:28 -         optimizer: Adam\n[2023-08-05 09:52:06.515221 INFO   ] utils:print_arguments:28 -         scheduler: CosineAnnealingLR\n[2023-08-05 09:52:06.515254 INFO   ] utils:print_arguments:28 -         scheduler_args: None\n[2023-08-05 09:52:06.515289 INFO   ] utils:print_arguments:28 -         weight_decay: 1e-06\n[2023-08-05 09:52:06.515323 INFO   ] utils:print_arguments:21 - preprocess_conf:\n[2023-08-05 09:52:06.515357 INFO   ] utils:print_arguments:28 -         feature_method: MelSpectrogram\n[2023-08-05 09:52:06.515390 INFO   ] utils:print_arguments:24 -         method_args:\n[2023-08-05 09:52:06.515426 INFO   ] utils:print_arguments:26 -                 f_max: 14000.0\n[2023-08-05 09:52:06.515460 INFO   ] utils:print_arguments:26 -                 f_min: 50.0\n[2023-08-05 09:52:06.515493 INFO   ] utils:print_arguments:26 -                 hop_length: 320\n[2023-08-05 09:52:06.515527 INFO   ] utils:print_arguments:26 -                 n_fft: 1024\n[2023-08-05 09:52:06.515560 INFO   ] utils:print_arguments:26 -                 n_mels: 64\n[2023-08-05 09:52:06.515593 INFO   ] utils:print_arguments:26 -                 sample_rate: 16000\n[2023-08-05 09:52:06.515626 INFO   ] utils:print_arguments:26 -                 win_length: 1024\n[2023-08-05 09:52:06.515660 INFO   ] utils:print_arguments:21 - train_conf:\n[2023-08-05 09:52:06.515694 INFO   ] utils:print_arguments:28 -         log_interval: 100\n[2023-08-05 09:52:06.515728 INFO   ] utils:print_arguments:28 -         max_epoch: 30\n[2023-08-05 09:52:06.515761 INFO   ] utils:print_arguments:30 - use_model: EcapaTdnn\n[2023-08-05 09:52:06.515794 INFO   ] utils:print_arguments:31 - ------------------------------------------------\n······\n===============================================================================================\nLayer (type:depth-idx)                        Output Shape              Param #\n===============================================================================================\nSequential                                    [1, 9726]                 --\n├─EcapaTdnn: 1-1                              [1, 192]                  --\n│    └─Conv1dReluBn: 2-1                      [1, 512, 98]              --\n│    │    └─Conv1d: 3-1                       [1, 512, 98]              163,840\n│    │    └─BatchNorm1d: 3-2                  [1, 512, 98]              1,024\n│    └─Sequential: 2-2                        [1, 512, 98]              --\n│    │    └─Conv1dReluBn: 3-3                 [1, 512, 98]              263,168\n│    │    └─Res2Conv1dReluBn: 3-4             [1, 512, 98]              86,912\n│    │    └─Conv1dReluBn: 3-5                 [1, 512, 98]              263,168\n│    │    └─SE_Connect: 3-6                   [1, 512, 98]              262,912\n│    └─Sequential: 2-3                        [1, 512, 98]              --\n│    │    └─Conv1dReluBn: 3-7                 [1, 512, 98]              263,168\n│    │    └─Res2Conv1dReluBn: 3-8             [1, 512, 98]              86,912\n│    │    └─Conv1dReluBn: 3-9                 [1, 512, 98]              263,168\n│    │    └─SE_Connect: 3-10                  [1, 512, 98]              262,912\n│    └─Sequential: 2-4                        [1, 512, 98]              --\n│    │    └─Conv1dReluBn: 3-11                [1, 512, 98]              263,168\n│    │    └─Res2Conv1dReluBn: 3-12            [1, 512, 98]              86,912\n│    │    └─Conv1dReluBn: 3-13                [1, 512, 98]              263,168\n│    │    └─SE_Connect: 3-14                  [1, 512, 98]              262,912\n│    └─Conv1d: 2-5                            [1, 1536, 98]             2,360,832\n│    └─AttentiveStatsPool: 2-6                [1, 3072]                 --\n│    │    └─Conv1d: 3-15                      [1, 128, 98]              196,736\n│    │    └─Conv1d: 3-16                      [1, 1536, 98]             198,144\n│    └─BatchNorm1d: 2-7                       [1, 3072]                 6,144\n│    └─Linear: 2-8                            [1, 192]                  590,016\n│    └─BatchNorm1d: 2-9                       [1, 192]                  384\n├─SpeakerIdentification: 1-2                  [1, 9726]                 1,867,392\n===============================================================================================\nTotal params: 8,012,992\nTrainable params: 8,012,992\nNon-trainable params: 0\nTotal mult-adds (M): 468.81\n===============================================================================================\nInput size (MB): 0.03\nForward\u002Fbackward pass size (MB): 10.36\nParams size (MB): 32.05\nEstimated Total Size (MB): 42.44\n===============================================================================================\n[2023-08-05 09:52:08.084231 INFO   ] trainer:train:388 - 训练数据：874175\n[2023-08-05 09:52:09.186542 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [0\u002F13659], loss: 11.95824, accuracy: 0.00000, learning rate: 0.00100000, speed: 58.09 data\u002Fsec, eta: 5 days, 5:24:08\n[2023-08-05 09:52:22.477905 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [100\u002F13659], loss: 10.35675, accuracy: 0.00278, learning rate: 0.00100000, speed: 481.65 data\u002Fsec, eta: 15:07:15\n[2023-08-05 09:52:35.948581 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [200\u002F13659], loss: 10.22089, accuracy: 0.00505, learning rate: 0.00100000, speed: 475.27 data\u002Fsec, eta: 15:19:12\n[2023-08-05 09:52:49.249098 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [300\u002F13659], loss: 10.00268, accuracy: 0.00706, learning rate: 0.00100000, speed: 481.45 data\u002Fsec, eta: 15:07:11\n[2023-08-05 09:53:03.716015 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [400\u002F13659], loss: 9.76052, accuracy: 0.00830, learning rate: 0.00100000, speed: 442.74 data\u002Fsec, eta: 16:26:16\n[2023-08-05 09:53:18.258807 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [500\u002F13659], loss: 9.50189, accuracy: 0.01060, learning rate: 0.00100000, speed: 440.46 data\u002Fsec, eta: 16:31:08\n[2023-08-05 09:53:31.618354 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [600\u002F13659], loss: 9.26083, accuracy: 0.01256, learning rate: 0.00100000, speed: 479.50 data\u002Fsec, eta: 15:10:12\n[2023-08-05 09:53:45.439642 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [700\u002F13659], loss: 9.03548, accuracy: 0.01449, learning rate: 0.00099999, speed: 463.63 data\u002Fsec, eta: 15:41:08\n```\n\n启动VisualDL：`visualdl --logdir=log --host 0.0.0.0`，VisualDL页面如下：\n\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_3e095459b4f3.jpg\" alt=\"VisualDL页面\" width=\"600\">\n\u003C\u002Fdiv>\n\n\n# 评估模型\n训练结束之后会保存预测模型，我们用预测模型来预测测试集中的音频特征，然后使用音频特征进行两两对比，计算EER和MinDCF。\n```shell\npython eval.py\n```\n\n输出类似如下：\n```\n······\n------------------------------------------------\nW0425 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\nW0425 08:27:32.065165 17654 device_context.cc:465] device: 0, cuDNN Version: 7.6.\n[2023-03-16 20:20:47.195908 INFO   ] trainer:evaluate:341 - 成功加载模型：models\u002FEcapaTdnn_Fbank\u002Fbest_model\u002Fmodel.pth\n100%|███████████████████████████| 84\u002F84 [00:28\u003C00:00,  2.95it\u002Fs]\n开始两两对比音频特征...\n100%|███████████████████████████| 5332\u002F5332 [00:05\u003C00:00, 1027.83it\u002Fs]\n评估消耗时间：65s，threshold：0.26，EER: 0.14739, MinDCF: 0.41999\n```\n\n# 推理接口\n\n下面给出了几个常用的接口，更多接口请参考`mvector\u002Fpredict.py`，也可以往下看`声纹对比`和`声纹识别`的例子。\n\n```python\nfrom mvector.predict import MVectorPredictor\n\npredictor = MVectorPredictor(configs='configs\u002Fcam++.yml',\n                             model_path='models\u002FCAMPPlus_Fbank\u002Fbest_model\u002F')\n# 获取音频特征\nembedding = predictor.predict(audio_data='dataset\u002Fa_1.wav')\n# 获取两个音频的相似度\nsimilarity = predictor.contrast(audio_data1='dataset\u002Fa_1.wav', audio_data2='dataset\u002Fa_2.wav')\n\n# 注册用户音频\npredictor.register(user_name='夜雨飘零', audio_data='dataset\u002Ftest.wav')\n# 识别用户音频\nname, score = predictor.recognition(audio_data='dataset\u002Ftest1.wav')\n# 获取所有用户\nusers_name = predictor.get_users()\n# 删除用户音频\npredictor.remove_user(user_name='夜雨飘零')\n```\n\n# 声纹对比\n下面开始实现声纹对比，创建`infer_contrast.py`程序，首先介绍几个重要的函数，`predict()`函数是可以获取声纹特征，`predict_batch()`函数是可以获取一批的声纹特征，`contrast()`函数可以对比两条音频的相似度，`register()`函数注册一条音频到声纹库里面，`recognition()`函输入一条音频并且从声纹库里面对比识别，`remove_user()`函数移除你好。声纹库里面的注册人。我们输入两个语音，通过预测函数获取他们的特征数据，使用这个特征数据可以求他们的对角余弦值，得到的结果可以作为他们相识度。对于这个相识度的阈值`threshold`，读者可以根据自己项目的准确度要求进行修改。\n```shell\npython infer_contrast.py --audio_path1=audio\u002Fa_1.wav --audio_path2=audio\u002Fb_2.wav\n```\n\n输出类似如下：\n```\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:13 - ----------- 额外配置参数 -----------\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:15 - audio_path1: dataset\u002Fa_1.wav\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:15 - audio_path2: dataset\u002Fb_2.wav\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:15 - configs: configs\u002Fecapa_tdnn.yml\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:15 - model_path: models\u002FEcapaTdnn_Fbank\u002Fbest_model\u002F\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:15 - threshold: 0.6\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:15 - use_gpu: True\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:16 - ------------------------------------------------\n······································································\nW0425 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\nW0425 08:29:10.008555 21121 device_context.cc:465] device: 0, cuDNN Version: 7.6.\n成功加载模型参数和优化方法参数：models\u002FEcapaTdnn_Fbank\u002Fbest_model\u002Fmodel.pth\naudio\u002Fa_1.wav 和 audio\u002Fb_2.wav 不是同一个人，相似度为：-0.09565544128417969\n```\n\n同时还提供了有GUI界面的声纹对比程序，执行`infer_contrast_gui.py`启动程序，界面如下，分别选择两个音频，点击开始判断，就可以判断它们是否是同一个人。\n\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_11908b242f5f.jpg\" alt=\"声纹对比界面\">\n\u003C\u002Fdiv>\n\n# 声纹识别\n\n在新闻识别里面主要使用到`register()`函数和`recognition()`函数，首先使用`register()`函数函数来注册音频到声纹库里面，也可以直接把文件添加到`audio_db`文件夹里面，使用的时候通过`recognition()`函数来发起识别，输入一条音频，就可以从声纹库里面识别到所需要的说话人。\n\n有了上面的声纹识别的函数，读者可以根据自己项目的需求完成声纹识别的方式，例如笔者下面提供的是通过录音来完成声纹识别。首先必须要加载语音库中的语音，语音库文件夹为`audio_db`，然后用户回车后录音3秒钟，然后程序会自动录音，并使用录音到的音频进行声纹识别，去匹配语音库中的语音，获取用户的信息。通过这样方式，读者也可以修改成通过服务请求的方式完成声纹识别，例如提供一个API供APP调用，用户在APP上通过声纹登录时，把录音到的语音发送到后端完成声纹识别，再把结果返回给APP，前提是用户已经使用语音注册，并成功把语音数据存放在`audio_db`文件夹中。\n```shell\npython infer_recognition.py\n```\n\n输出类似如下：\n```\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:13 - ----------- 额外配置参数 -----------\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:15 - audio_db_path: audio_db\u002F\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:15 - configs: configs\u002Fecapa_tdnn.yml\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:15 - model_path: models\u002FEcapaTdnn_Fbank\u002Fbest_model\u002F\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:15 - record_seconds: 3\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:15 - threshold: 0.6\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:15 - use_gpu: True\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:16 - ------------------------------------------------\n······································································\nW0425 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\nW0425 08:30:13.260191 23889 device_context.cc:465] device: 0, cuDNN Version: 7.6.\n成功加载模型参数和优化方法参数：models\u002Fecapa_tdnn\u002Fmodel.pth\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同时还提供了有GUI界面的声纹识别程序，执行`infer_recognition_gui.py`启动，点击`注册音频到声纹库`按钮，理解开始说话，录制3秒钟，然后输入注册人的名称，之后可以`执行声纹识别`按钮，然后立即说话，录制3秒钟后，等待识别结果。`删除用户`按钮可以删除用户。`实时识别`按钮可以实时识别，可以一直录音，一直识别。\n\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_b848f321c771.jpg\" alt=\"声纹识别界面\">\n\u003C\u002Fdiv>\n\n# 说话人日志（分离说话人）\n\n执行`infer_speaker_diarization.py`程序，输入音频路径，就可以分离出说话人，并显示结果，建议音频长度不要低于10秒。更多功能可以查看该程序参数。\n```shell\npython infer_speaker_diarization.py --audio_path=dataset\u002Ftest_long.wav\n```\n\n输出类似如下：\n```\n2024-10-10 19:30:40.768 | INFO     | mvector.predict:__init__:61 - 成功加载模型参数：models\u002FCAMPPlus_Fbank\u002Fbest_model\u002Fmodel.pth\n2024-10-10 19:30:40.795 | INFO     | mvector.predict:__create_index:127 - 声纹特征索引创建完成，一共有3个用户，分别是：['沙瑞金', '夜雨飘零', '李达康']\n2024-10-10 19:30:40.796 | INFO     | mvector.predict:__load_audio_db:142 - 正在加载声纹库数据...\n100%|██████████| 3\u002F3 [00:00\u003C?, ?it\u002Fs]\n2024-10-10 19:30:40.798 | INFO     | mvector.predict:__create_index:127 - 声纹特征索引创建完成，一共有3个用户，分别是：['沙瑞金', '夜雨飘零', '李达康']\n2024-10-10 19:30:40.798 | INFO     | mvector.predict:__load_audio_db:172 - 声纹库数据加载完成！\n识别结果：\n{'speaker': '沙瑞金', 'start': 0.0, 'end': 2.0}\n{'speaker': '陌生人1', 'start': 4.0, 'end': 7.0}\n{'speaker': '李达康', 'start': 7.0, 'end': 8.0}\n{'speaker': '沙瑞金', 'start': 9.0, 'end': 12.0}\n{'speaker': '沙瑞金', 'start': 13.0, 'end': 14.0}\n{'speaker': '陌生人1', 'start': 15.0, 'end': 19.0}\n```\n\n显示结果图像如下，可以通过`空格`键控制播放音频，点击位置可以跳转音频到指定位置：\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_1b48e3e55a44.jpg\" alt=\"说话人日志\" width=\"800\">\n\u003C\u002Fdiv>\n\n项目同样提供了GUI界面的程序，执行`infer_speaker_diarization_gui.py`程序。更多功能可以查看该程序参数。\n```shell\npython infer_speaker_diarization_gui.py\n```\n\n可以打开这样一个页面，进行说话人识别：\n\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_924e1fdac01a.png\" alt=\"说话人日志\" width=\"800\">\n\u003C\u002Fdiv>\n\n\n注意：如果说话人名字是中文的，需要设置安装字体才能正常显示，一般情况下Windows无需安装，Ubuntu需要安装。如果Windows确实是缺少字体，只需要[字体文件](https:\u002F\u002Fgithub.com\u002Ftracyone\u002Fprogram_font)这里下载`.ttf`格式的文件，复制到`C:\\Windows\\Fonts`即可。Ubuntu系统操作如下。\n\n1. 安装字体\n```shell\ngit clone https:\u002F\u002Fgithub.com\u002Ftracyone\u002Fprogram_font && cd program_font && .\u002Finstall.sh\n```\n\n2. 执行下面Python代码\n```python\nimport matplotlib\nimport shutil\nimport os\n\npath = matplotlib.matplotlib_fname()\npath = path.replace('matplotlibrc', 'fonts\u002Fttf\u002F')\nprint(path)\nshutil.copy('\u002Fusr\u002Fshare\u002Ffonts\u002FMyFonts\u002Fsimhei.ttf', path)\nuser_dir = os.path.expanduser('~')\nshutil.rmtree(f'{user_dir}\u002F.cache\u002Fmatplotlib', ignore_errors=True)\n```\n\n\n# 其他版本\n - Tensorflow：[VoiceprintRecognition-Tensorflow](https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Tensorflow)\n - PaddlePaddle：[VoiceprintRecognition-PaddlePaddle](https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-PaddlePaddle)\n - Keras：[VoiceprintRecognition-Keras](https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Keras)\n\n\n## 打赏作者\n\n\u003Cbr\u002F>\n\u003Cdiv align=\"center\">\n\u003Cp>打赏一块钱支持一下作者\u003C\u002Fp>\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_8fee2eae2436.jpg\" alt=\"打赏作者\" width=\"400\">\n\u003C\u002Fdiv>\n\n\n# 参考资料\n1. https:\u002F\u002Fgithub.com\u002FPaddlePaddle\u002FPaddleSpeech\n2. https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FPaddlePaddle-MobileFaceNets\n3. https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FPPASR\n4. https:\u002F\u002Fgithub.com\u002Falibaba-damo-academy\u002F3D-Speaker\n5. https:\u002F\u002Fgithub.com\u002Fwenet-e2e\u002Fwespeaker\n","简体中文 | [English](.\u002FREADME_en.md)\n\n# 基于Pytorch实现的声纹识别系统\n\n![python version](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.8+-orange.svg)\n![GitHub forks](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fforks\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch)\n![GitHub Repo stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch)\n![GitHub](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch)\n![支持系统](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F支持系统-Win\u002FLinux\u002FMAC-9cf)\n\n本分支为1.1版本，如果要使用之前的1.0版本请在[1.0分支](https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch\u002Ftree\u002Frelease\u002F1.0.5)使用。本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM++等多种先进的声纹识别模型，不排除以后会支持更多模型，同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法，使用了ArcFace Loss，ArcFace loss：Additive Angular Margin Loss（加性角度间隔损失函数），对应项目中的AAMLoss，对特征向量和权重归一化，对θ加上角度间隔m，角度间隔比余弦间隔在对角度的影响更加直接，除此之外，还支持AMLoss、ARMLoss、CELoss等多种损失函数。\n\n**本项目是如果对你有帮助，欢迎Star，避免之后需要找不到了。**\n\n**欢迎大家扫码入知识星球或者QQ群讨论，知识星球里面提供项目的模型文件和博主其他相关项目的模型文件，也包括其他一些资源。**\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_d4ba433d3d87.jpg\" alt=\"知识星球\" width=\"400\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_645bdcaba681.jpg\" alt=\"QQ群\" width=\"400\">\n\u003C\u002Fdiv>\n\n使用环境：\n\n - Anaconda 3\n - Python 3.11\n - Pytorch 2.4.0\n - Windows 11 or Ubuntu 22.04\n\n# 在线试用\n\n - **网页版：[声纹对比](https:\u002F\u002Ftools.yeyupiaoling.cn\u002Fspeech\u002Fvoiceprint_compare)**\n - **网页版：[声纹识别](https:\u002F\u002Ftools.yeyupiaoling.cn\u002Fspeech\u002Fvoiceprint_recognition)**\n - **网页版：[说话人日志](https:\u002F\u002Ftools.yeyupiaoling.cn\u002Fspeech\u002Fspeaker_diarization)**\n\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_9e492f9a8928.jpg\" alt=\"微信小程序\" width=\"200\">&nbsp&nbsp\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_45e8a0897daa.jpg\" alt=\"微信小程序\" width=\"200\">&nbsp&nbsp\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_3af775332325.jpg\" alt=\"微信小程序\" width=\"200\">\u003Cbr\u002F>\n  声纹对比微信小程序   &nbsp &nbsp &nbsp &nbsp  声纹识别微信小程序     &nbsp &nbsp &nbsp &nbsp   说话人日志微信小程序\n\u003C\u002Fdiv>\n\n\n\n# 目录\n\n- [项目介绍](#基于Pytorch实现的声纹识别系统)\n- [项目记录](#项目记录)\n- [项目特性](#项目特性)\n- [安装环境](#安装环境)\n- [创建数据](#创建数据)\n- [修改预处理方法（可选）](#修改预处理方法可选)\n- [提取特征（可选）](#提取特征可选)\n- [训练模型](#训练模型)\n- [评估模型](#评估模型)\n- [推理接口](#推理接口)\n- [声纹对比](#声纹对比)\n- [声纹识别](#声纹识别)\n- [说话人日志（分离说话人）](#说话人日志分离说话人)\n\n\n# 项目记录\n\n1. 2024.10.12：发布1.1版本。\n\n# 项目特性\n\n1. 支持模型：EcapaTdnn、TDNN、Res2Net、ResNetSE、ERes2Net、CAM++\n2. 支持池化层：AttentiveStatsPool(ASP)、SelfAttentivePooling(SAP)、TemporalStatisticsPooling(TSP)、TemporalAveragePooling(TAP)、TemporalStatsPool(TSTP)\n3. 支持损失函数：AAMLoss、SphereFace2、AMLoss、ARMLoss、CELoss、SubCenterLoss、TripletAngularMarginLoss\n4. 支持预处理方法：MelSpectrogram、Spectrogram、MFCC、Fbank、Wav2vec2.0、WavLM\n5. 支持数据增强方法：语速增强、音量增强、噪声增强、混响增强、SpecAugment\n\n\n**模型论文：**\n\n- EcapaTdnn：[ECAPA-TDNN: Emphasized Channel Attention, Propagation and Aggregation in TDNN Based Speaker Verification](https:\u002F\u002Farxiv.org\u002Fabs\u002F2005.07143v3)\n- PANNS：[PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition](https:\u002F\u002Farxiv.org\u002Fabs\u002F1912.10211v5)\n- TDNN：[Prediction of speech intelligibility with DNN-based performance measures](https:\u002F\u002Farxiv.org\u002Fabs\u002F2203.09148)\n- Res2Net：[Res2Net: A New Multi-scale Backbone Architecture](https:\u002F\u002Farxiv.org\u002Fabs\u002F1904.01169)\n- ResNetSE：[Squeeze-and-Excitation Networks](https:\u002F\u002Farxiv.org\u002Fabs\u002F1709.01507)\n- CAMPPlus：[CAM++: A Fast and Efficient Network for Speaker Verification Using Context-Aware Masking](https:\u002F\u002Farxiv.org\u002Fabs\u002F2303.00332v3)\n- ERes2Net：[An Enhanced Res2Net with Local and Global Feature Fusion for Speaker Verification](https:\u002F\u002Farxiv.org\u002Fabs\u002F2305.12838v1)\n\n\n# 模型下载\n\n### 训练CN-Celeb数据，共有2796个说话人。\n\n|     模型     | Params(M) |                数据集                 | train speakers | threshold |   EER   | MinDCF  |   模型下载   |\n|:----------:|:---------:|:----------------------------------:|:--------------:|:---------:|:-------:|:-------:|:--------:|\n| ERes2NetV2 |    6.6    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.20089  | 0.08071 | 0.45705 | 加入知识星球获取 |\n|  ERes2Net  |    6.6    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.20014  | 0.08132 | 0.45544 | 加入知识星球获取 |\n|   CAM++    |    6.8    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.23323  | 0.08332 | 0.48536 | 加入知识星球获取 |\n|  ResNetSE  |    7.8    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.19066  | 0.08544 | 0.49142 | 加入知识星球获取 |\n| EcapaTdnn  |    6.1    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.23646  | 0.09259 | 0.51378 | 加入知识星球获取 |\n|    TDNN    |    2.6    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.23858  | 0.10825 | 0.59545 | 加入知识星球获取 |\n|  Res2Net   |    5.0    | [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) |      2796      |  0.19526  | 0.12436 | 0.65347 | 加入知识星球获取 |\n|   CAM++    |    6.8    |               更大数据集                |      2W+       |   0.33    | 0.07874 | 0.52524 | 加入知识星球获取 |\n|  ERes2Net  |   55.1    |               其他数据集                |      20W+      |   0.36    | 0.02936 | 0.18355 | 加入知识星球获取 |\n| ERes2NetV2 |   56.2    |               其他数据集                |      20W+      |   0.36    | 0.03847 | 0.24301 | 加入知识星球获取 |\n|   CAM++    |    6.8    |               其他数据集                |      20W+      |   0.29    | 0.04765 | 0.31436 | 加入知识星球获取 |\n\n说明：\n1. 评估的测试集为[CN-Celeb的测试集](https:\u002F\u002Faistudio.baidu.com\u002Faistudio\u002Fdatasetdetail\u002F233361)，包含196个说话人。\n2. 使用语速增强分类大小翻三倍`speed_perturb_3_class: True`。\n3. 使用的预处理方法为`Fbank`，损失函数为`AAMLoss`。\n4. 参数数量不包含了分类器的参数数量。\n5. 使用了噪声增强和混响增强。\n\n\n### 训练VoxCeleb1&2数据，共有7205个说话人。\n\n|     模型     | Params(M) |     数据集     | train speakers | threshold |   EER   | MinDCF  |   模型下载   |\n|:----------:|:---------:|:-----------:|:--------------:|:---------:|:-------:|:-------:|:--------:|\n|   CAM++    |    6.8    | VoxCeleb1&2 |      7205      |  0.22504  | 0.02436 | 0.15543 | 加入知识星球获取 |\n| EcapaTdnn  |    6.1    | VoxCeleb1&2 |      7205      |  0.24877  | 0.02480 | 0.16188 | 加入知识星球获取 |\n| ERes2NetV2 |    6.6    | VoxCeleb1&2 |      7205      |  0.20710  | 0.02742 | 0.17709 | 加入知识星球获取 |\n|  ERes2Net  |    6.6    | VoxCeleb1&2 |      7205      |  0.20233  | 0.02954 | 0.17377 | 加入知识星球获取 |\n|  ResNetSE  |    7.8    | VoxCeleb1&2 |      7205      |  0.22567  | 0.03189 | 0.23040 | 加入知识星球获取 |\n|    TDNN    |    2.6    | VoxCeleb1&2 |      7205      |  0.23834  | 0.03486 | 0.26792 | 加入知识星球获取 |\n|  Res2Net   |    5.0    | VoxCeleb1&2 |      7205      |  0.19472  | 0.4370 | 0.40072 | 加入知识星球获取 |\n|   CAM++    |    6.8    |    更大数据集    |      2W+       |   0.28    | 0.03182 | 0.23731 | 加入知识星球获取 |\n|  ERes2Net  |   55.1    |    其他数据集    |      20W+      |   0.53    | 0.08904 | 0.62130 | 加入知识星球获取 |\n| ERes2NetV2 |   56.2    |    其他数据集    |      20W+      |   0.52    | 0.8649 | 0.64193 | 加入知识星球获取 |\n|   CAM++    |    6.8    |    其他数据集    |      20W+      |   0.49    | 0.10334 | 0.71200 | 加入知识星球获取 |\n\n说明：\n\n1. 评估的测试集为[VoxCeleb1&2的测试集](https:\u002F\u002Faistudio.baidu.com\u002Faistudio\u002Fdatasetdetail\u002F255977)，包含158个说话人。\n2. 使用语速增强分类大小翻三倍`speed_perturb_3_class: True`。\n3. 使用的预处理方法为`Fbank`，损失函数为`AAMLoss`。\n4. 参数数量不包含了分类器的参数数量。\n\n### 预处理方法效果对比实验\n\n|                                      预处理方法                                       |   数据集    | train speakers | threshold |   EER   | MinDCF  |   模型下载   |\n|:--------------------------------------------------------------------------------:|:--------:|:--------------:|:---------:|:-------:|:-------:|:--------:|\n|                                      Fbank                                       | CN-Celeb |      2796      |  0.14574  | 0.10988 | 0.58955 | 加入知识星球获取 |\n|                                       MFCC                                       | CN-Celeb |      2796      |  0.14868  | 0.11483 | 0.61275 | 加入知识星球获取 |\n|                                   Spectrogram                                    | CN-Celeb |      2796      |  0.14962  | 0.11613 | 0.60057 | 加入知识星球获取 |\n|                                  MelSpectrogram                                  | CN-Celeb |      2796      |  0.13458  | 0.12498 | 0.60741 | 加入知识星球获取 |\n|       [wavlm-base-plus](https:\u002F\u002Fhuggingface.co\u002Fmicrosoft\u002Fwavlm-base-plus)        | CN-Celeb |      2796      |  0.14166  | 0.13247 | 0.62451 | 加入知识星球获取 |\n|           [w2v-bert-2.0](https:\u002F\u002Fhuggingface.co\u002Ffacebook\u002Fw2v-bert-2.0)           | CN-Celeb |      2796      |           |         |         | 加入知识星球获取 |\n| [wav2vec2-large-xlsr-53](https:\u002F\u002Fhuggingface.co\u002Ffacebook\u002Fwav2vec2-large-xlsr-53) | CN-Celeb |      2796      |           |         |         | 加入知识星球获取 |\n|           [wavlm-large](https:\u002F\u002Fhuggingface.co\u002Fmicrosoft\u002Fwavlm-large)            | CN-Celeb |      2796      |           |         |         | 加入知识星球获取 |\n\n说明：\n\n1. 评估的测试集为[CN-Celeb的测试集](https:\u002F\u002Faistudio.baidu.com\u002Faistudio\u002Fdatasetdetail\u002F233361)，包含196个说话人。\n2. 实验数据为[CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F)，实验模型为`CAM++`，损失函数为`AAMLoss`。\n3. 数据使用`extract_features.py`提前提取特征，也就是说训练中没有使用对音频的数据增强。\n4. `w2v-bert-2.0`、`wav2vec2-large-xlsr-53`是多语言数据预训练得到的，`wavlm-base-plus`、`wavlm-large`的预训练数据仅用英文。\n\n\n### 损失函数效果对比实验\n\n|           损失函数           |   数据集    | train speakers | threshold |   EER   | MinDCF  |   模型下载   |\n|:------------------------:|:--------:|:--------------:|:---------:|:-------:|:-------:|:--------:|\n|         AAMLoss          | CN-Celeb |      2796      |  0.14574  | 0.10988 | 0.58955 | 加入知识星球获取 |\n|       SphereFace2        | CN-Celeb |      2796      |  0.20377  | 0.11309 | 0.61536 | 加入知识星球获取 |\n| TripletAngularMarginLoss | CN-Celeb |      2796      |  0.28940  | 0.11749 | 0.63735 | 加入知识星球获取 |\n|      SubCenterLoss       | CN-Celeb |      2796      |  0.13126  | 0.11775 | 0.56995 | 加入知识星球获取 |\n|         ARMLoss          | CN-Celeb |      2796      |  0.14563  | 0.11805 | 0.57171 | 加入知识星球获取 |\n|          AMLoss          | CN-Celeb |      2796      |  0.12870  | 0.12301 | 0.63263 | 加入知识星球获取 |\n|          CELoss          | CN-Celeb |      2796      |  0.13607  | 0.12684 | 0.65176 | 加入知识星球获取 |\n\n说明：\n\n1. 评估的测试集为[CN-Celeb的测试集](https:\u002F\u002Faistudio.baidu.com\u002Faistudio\u002Fdatasetdetail\u002F233361)，包含196个说话人。\n2. 实验数据为[CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F)，实验模型为`CAM++`，预处理方法为`Fbank`。\n3. 数据使用`extract_features.py`提前提取特征，也就是说训练中没有使用对音频的数据增强。\n\n\n## 安装环境\n\n - 首先安装的是Pytorch的GPU版本，如果已经安装过了，请跳过。\n```shell\nconda install pytorch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 pytorch-cuda=11.8 -c pytorch -c nvidia\n```\n\n - 安装ppvector库。\n \n使用pip安装，命令如下：\n```shell\npython -m pip install mvector -U -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n```\n\n**建议源码安装**，源码安装能保证使用最新代码。\n```shell\ngit clone https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch.git\ncd VoiceprintRecognition-Pytorch\u002F\npip install .\n```\n\n# 创建数据\n本教程笔者使用的是[CN-Celeb](https:\u002F\u002Fopenslr.elda.org\u002Fresources\u002F82)，这个数据集一共有约3000个人的语音数据，有65W+条语音数据，下载之后要解压数据集到`dataset`目录，另外如果要评估，还需要下载[CN-Celeb的测试集](https:\u002F\u002Faistudio.baidu.com\u002Faistudio\u002Fdatasetdetail\u002F233361)。如果读者有其他更好的数据集，可以混合在一起使用，但最好是要用python的工具模块aukit处理音频，降噪和去除静音。\n\n首先是创建一个数据列表，数据列表的格式为`\u003C语音文件路径\\t语音分类标签>`，创建这个列表主要是方便之后的读取，也是方便读取使用其他的语音数据集，语音分类标签是指说话人的唯一ID，不同的语音数据集，可以通过编写对应的生成数据列表的函数，把这些数据集都写在同一个数据列表中。\n\n执行`create_data.py`程序完成数据准备。\n```shell\npython create_data.py\n```\n\n执行上面的程序之后，会生成以下的数据格式，如果要自定义数据，参考如下数据列表，前面是音频的相对路径，后面的是该音频对应的说话人的标签，就跟分类一样。**自定义数据集的注意**，测试数据列表的ID可以不用跟训练的ID一样，也就是说测试的数据的说话人可以不用出现在训练集，只要保证测试数据列表中同一个人相同的ID即可。\n```\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-03-019.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-10-023.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-06-025.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-04-014.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-06-030.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-10-032.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-06-028.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-10-031.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-05-003.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-04-017.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-10-016.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-09-001.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-05-010.flac      2795\n```\n\n# 修改预处理方法（可选）\n\n配置文件中默认使用的是Fbank预处理方法，如果要使用其他预处理方法，可以修改配置文件中的安装下面方式修改，具体的值可以根据自己情况修改。如果不清楚如何设置参数，可以直接删除该部分，直接使用默认值。\n\n```yaml\n# 数据预处理参数\npreprocess_conf:\n  # 是否使用HF上的Wav2Vec2类似模型提取音频特征\n  use_hf_model: False\n  # 音频预处理方法，也可以叫特征提取方法\n  # 当use_hf_model为False时，支持：MelSpectrogram、Spectrogram、MFCC、Fbank\n  # 当use_hf_model为True时，指定的是HuggingFace的模型或者本地路径，比如facebook\u002Fw2v-bert-2.0或者.\u002Ffeature_models\u002Fw2v-bert-2.0\n  feature_method: 'Fbank'\n  # 当use_hf_model为False时，设置API参数，更参数查看对应API，不清楚的可以直接删除该部分，直接使用默认值。\n  # 当use_hf_model为True时，可以设置参数use_gpu，指定是否使用GPU提取特征\n  method_args:\n    sample_frequency: 16000\n    num_mel_bins: 80\n```\n\n# 提取特征（可选）\n\n在训练过程中，首先是要读取音频数据，然后提取特征，最后再进行训练。其中读取音频数据、提取特征也是比较消耗时间的，所以我们可以选择提前提取好取特征，训练模型的是就可以直接加载提取好的特征，这样训练速度会更快。这个提取特征是可选择，如果没有提取好的特征，训练模型的时候就会从读取音频数据，然后提取特征开始。提取特征步骤如下：\n\n1. 执行`extract_features.py`，提取特征，特征会保存在`dataset\u002Ffeatures`目录下，并生成新的数据列表`train_list_features.txt`、`enroll_list_features.txt`和`trials_list_features.txt`。\n\n```shell\npython extract_features.py --configs=configs\u002Fcam++.yml --save_dir=dataset\u002Ffeatures\n```\n\n2. 修改配置文件，将`dataset_conf.train_list`、`dataset_conf.enroll_list`和`dataset_conf.trials_list`修改为`train_list_features.txt`、`enroll_list_features.txt`和`trials_list_features.txt`。\n\n\n# 训练模型\n使用`train.py`训练模型，本项目支持多个音频预处理方式，通过`configs\u002Fecapa_tdnn.yml`配置文件的参数`preprocess_conf.feature_method`可以指定，`MelSpectrogram`为梅尔频谱，`Spectrogram`为语谱图，`MFCC`梅尔频谱倒谱系数等等。通过参数`augment_conf_path`可以指定数据增强方式。训练过程中，会使用VisualDL保存训练日志，通过启动VisualDL可以随时查看训练结果，启动命令`visualdl --logdir=log --host 0.0.0.0`\n```shell\n# 单卡训练\nCUDA_VISIBLE_DEVICES=0 python train.py\n# 多卡训练\nCUDA_VISIBLE_DEVICES=0,1 torchrun --standalone --nnodes=1 --nproc_per_node=2 train.py\n```\n\n训练输出日志：\n```\n[2023-08-05 09:52:06.497988 INFO   ] utils:print_arguments:13 - ----------- 额外配置参数 -----------\n[2023-08-05 09:52:06.498094 INFO   ] utils:print_arguments:15 - configs: configs\u002Fecapa_tdnn.yml\n[2023-08-05 09:52:06.498149 INFO   ] utils:print_arguments:15 - do_eval: True\n[2023-08-05 09:52:06.498191 INFO   ] utils:print_arguments:15 - local_rank: 0\n[2023-08-05 09:52:06.498230 INFO   ] utils:print_arguments:15 - pretrained_model: None\n[2023-08-05 09:52:06.498269 INFO   ] utils:print_arguments:15 - resume_model: None\n[2023-08-05 09:52:06.498306 INFO   ] utils:print_arguments:15 - save_model_path: models\u002F\n[2023-08-05 09:52:06.498342 INFO   ] utils:print_arguments:15 - use_gpu: True\n[2023-08-05 09:52:06.498378 INFO   ] utils:print_arguments:16 - ------------------------------------------------\n[2023-08-05 09:52:06.513761 INFO   ] utils:print_arguments:18 - ----------- 配置文件参数 -----------\n[2023-08-05 09:52:06.513906 INFO   ] utils:print_arguments:21 - dataset_conf:\n[2023-08-05 09:52:06.513957 INFO   ] utils:print_arguments:24 -         dataLoader:\n[2023-08-05 09:52:06.513995 INFO   ] utils:print_arguments:26 -                 batch_size: 64\n[2023-08-05 09:52:06.514031 INFO   ] utils:print_arguments:26 -                 num_workers: 4\n[2023-08-05 09:52:06.514066 INFO   ] utils:print_arguments:28 -         do_vad: False\n[2023-08-05 09:52:06.514101 INFO   ] utils:print_arguments:28 -         enroll_list: dataset\u002Fenroll_list.txt\n[2023-08-05 09:52:06.514135 INFO   ] utils:print_arguments:24 -         eval_conf:\n[2023-08-05 09:52:06.514169 INFO   ] utils:print_arguments:26 -                 batch_size: 1\n[2023-08-05 09:52:06.514203 INFO   ] utils:print_arguments:26 -                 max_duration: 20\n[2023-08-05 09:52:06.514237 INFO   ] utils:print_arguments:28 -         max_duration: 3\n[2023-08-05 09:52:06.514274 INFO   ] utils:print_arguments:28 -         min_duration: 0.5\n[2023-08-05 09:52:06.514308 INFO   ] utils:print_arguments:28 -         noise_aug_prob: 0.2\n[2023-08-05 09:52:06.514342 INFO   ] utils:print_arguments:28 -         noise_dir: dataset\u002Fnoise\n[2023-08-05 09:52:06.514374 INFO   ] utils:print_arguments:28 -         num_speakers: 3242\n[2023-08-05 09:52:06.514408 INFO   ] utils:print_arguments:28 -         sample_rate: 16000\n[2023-08-05 09:52:06.514441 INFO   ] utils:print_arguments:28 -         speed_perturb: True\n[2023-08-05 09:52:06.514475 INFO   ] utils:print_arguments:28 -         target_dB: -20\n[2023-08-05 09:52:06.514508 INFO   ] utils:print_arguments:28 -         train_list: dataset\u002Ftrain_list.txt\n[2023-08-05 09:52:06.514542 INFO   ] utils:print_arguments:28 -         trials_list: dataset\u002Ftrials_list.txt\n[2023-08-05 09:52:06.514575 INFO   ] utils:print_arguments:28 -         use_dB_normalization: True\n[2023-08-05 09:52:06.514609 INFO   ] utils:print_arguments:21 - loss_conf:\n[2023-08-05 09:52:06.514643 INFO   ] utils:print_arguments:24 -         args:\n[2023-08-05 09:52:06.514678 INFO   ] utils:print_arguments:26 -                 easy_margin: False\n[2023-08-05 09:52:06.514713 INFO   ] utils:print_arguments:26 -                 margin: 0.2\n[2023-08-05 09:52:06.514746 INFO   ] utils:print_arguments:26 -                 scale: 32\n[2023-08-05 09:52:06.514779 INFO   ] utils:print_arguments:24 -         margin_scheduler_args:\n[2023-08-05 09:52:06.514814 INFO   ] utils:print_arguments:26 -                 final_margin: 0.3\n[2023-08-05 09:52:06.514848 INFO   ] utils:print_arguments:28 -         use_loss: AAMLoss\n[2023-08-05 09:52:06.514882 INFO   ] utils:print_arguments:28 -         use_margin_scheduler: True\n[2023-08-05 09:52:06.514915 INFO   ] utils:print_arguments:21 - model_conf:\n[2023-08-05 09:52:06.514950 INFO   ] utils:print_arguments:24 -         backbone:\n[2023-08-05 09:52:06.514984 INFO   ] utils:print_arguments:26 -                 embd_dim: 192\n[2023-08-05 09:52:06.515017 INFO   ] utils:print_arguments:26 -                 pooling_type: ASP\n[2023-08-05 09:52:06.515050 INFO   ] utils:print_arguments:24 -         classifier:\n[2023-08-05 09:52:06.515084 INFO   ] utils:print_arguments:26 -                 num_blocks: 0\n[2023-08-05 09:52:06.515118 INFO   ] utils:print_arguments:21 - optimizer_conf:\n[2023-08-05 09:52:06.515154 INFO   ] utils:print_arguments:28 -         learning_rate: 0.001\n[2023-08-05 09:52:06.515188 INFO   ] utils:print_arguments:28 -         optimizer: Adam\n[2023-08-05 09:52:06.515221 INFO   ] utils:print_arguments:28 -         scheduler: CosineAnnealingLR\n[2023-08-05 09:52:06.515254 INFO   ] utils:print_arguments:28 -         scheduler_args: None\n[2023-08-05 09:52:06.515289 INFO   ] utils:print_arguments:28 -         weight_decay: 1e-06\n[2023-08-05 09:52:06.515323 INFO   ] utils:print_arguments:21 - preprocess_conf:\n[2023-08-05 09:52:06.515357 INFO   ] utils:print_arguments:28 -         feature_method: MelSpectrogram\n[2023-08-05 09:52:06.515390 INFO   ] utils:print_arguments:24 -         method_args:\n[2023-08-05 09:52:06.515426 INFO   ] utils:print_arguments:26 -                 f_max: 14000.0\n[2023-08-05 09:52:06.515460 INFO   ] utils:print_arguments:26 -                 f_min: 50.0\n[2023-08-05 09:52:06.515493 INFO   ] utils:print_arguments:26 -                 hop_length: 320\n[2023-08-05 09:52:06.515527 INFO   ] utils:print_arguments:26 -                 n_fft: 1024\n[2023-08-05 09:52:06.515560 INFO   ] utils:print_arguments:26 -                 n_mels: 64\n[2023-08-05 09:52:06.515593 INFO   ] utils:print_arguments:26 -                 sample_rate: 16000\n[2023-08-05 09:52:06.515626 INFO   ] utils:print_arguments:26 -                 win_length: 1024\n[2023-08-05 09:52:06.515660 INFO   ] utils:print_arguments:21 - train_conf:\n[2023-08-05 09:52:06.515694 INFO   ] utils:print_arguments:28 -         log_interval: 100\n[2023-08-05 09:52:06.515728 INFO   ] utils:print_arguments:28 -         max_epoch: 30\n[2023-08-05 09:52:06.515761 INFO   ] utils:print_arguments:30 - use_model: EcapaTdnn\n[2023-08-05 09:52:06.515794 INFO   ] utils:print_arguments:31 - ------------------------------------------------\n······\n===============================================================================================\nLayer (type:depth-idx)                        Output Shape              Param #\n===============================================================================================\nSequential                                    [1, 9726]                 --\n├─EcapaTdnn: 1-1                              [1, 192]                  --\n│    └─Conv1dReluBn: 2-1                      [1, 512, 98]              --\n│    │    └─Conv1d: 3-1                       [1, 512, 98]              163,840\n│    │    └─BatchNorm1d: 3-2                  [1, 512, 98]              1,024\n│    └─Sequential: 2-2                        [1, 512, 98]              --\n│    │    └─Conv1dReluBn: 3-3                 [1, 512, 98]              263,168\n│    │    └─Res2Conv1dReluBn: 3-4             [1, 512, 98]              86,912\n│    │    └─Conv1dReluBn: 3-5                 [1, 512, 98]              263,168\n│    │    └─SE_Connect: 3-6                   [1, 512, 98]              262,912\n│    └─Sequential: 2-3                        [1, 512, 98]              --\n│    │    └─Conv1dReluBn: 3-7                 [1, 512, 98]              263,168\n│    │    └─Res2Conv1dReluBn: 3-8             [1, 512, 98]              86,912\n│    │    └─Conv1dReluBn: 3-9                 [1, 512, 98]              263,168\n│    │    └─SE_Connect: 3-10                  [1, 512, 98]              262,912\n│    └─Sequential: 2-4                        [1, 512, 98]              --\n│    │    └─Conv1dReluBn: 3-11                [1, 512, 98]              263,168\n│    │    └─Res2Conv1dReluBn: 3-12            [1, 512, 98]              86,912\n│    │    └─Conv1dReluBn: 3-13                [1, 512, 98]              263,168\n│    │    └─SE_Connect: 3-14                  [1, 512, 98]              262,912\n│    └─Conv1d: 2-5                            [1, 1536, 98]             2,360,832\n│    └─AttentiveStatsPool: 2-6                [1, 3072]                 --\n│    │    └─Conv1d: 3-15                      [1, 128, 98]              196,736\n│    │    └─Conv1d: 3-16                      [1, 1536, 98]             198,144\n│    └─BatchNorm1d: 2-7                       [1, 3072]                 6,144\n│    └─Linear: 2-8                            [1, 192]                  590,016\n│    └─BatchNorm1d: 2-9                       [1, 192]                  384\n├─SpeakerIdentification: 1-2                  [1, 9726]                 1,867,392\n===============================================================================================\nTotal params: 8,012,992\nTrainable params: 8,012,992\nNon-trainable params: 0\nTotal mult-adds (M): 468.81\n===============================================================================================\nInput size (MB): 0.03\nForward\u002Fbackward pass size (MB): 10.36\nParams size (MB): 32.05\nEstimated Total Size (MB): 42.44\n===============================================================================================\n[2023-08-05 09:52:08.084231 INFO   ] trainer:train:388 - 训练数据：874175\n[2023-08-05 09:52:09.186542 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [0\u002F13659], loss: 11.95824, accuracy: 0.00000, learning rate: 0.00100000, speed: 58.09 data\u002Fsec, eta: 5天，5小时24分08秒\n[2023-08-05 09:52:22.477905 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [100\u002F13659], loss: 10.35675, accuracy: 0.00278, learning rate: 0.00100000, speed: 481.65 data\u002Fsec, eta: 15小时07分15秒\n[2023-08-05 09:52:35.948581 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [200\u002F13659], loss: 10.22089, accuracy: 0.00505, learning rate: 0.00100000, speed: 475.27 data\u002Fsec, eta: 15小时19分12秒\n[2023-08-05 09:52:49.249098 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [300\u002F13659], loss: 10.00268, accuracy: 0.00706, learning rate: 0.00100000, speed: 481.45 data\u002Fsec, eta: 15小时07分11秒\n[2023-08-05 09:53:03.716015 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [400\u002F13659], loss: 9.76052, accuracy: 0.00830, learning rate: 0.00100000, speed: 442.74 data\u002Fsec, eta: 16小时26分16秒\n[2023-08-05 09:53:18.258807 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [500\u002F13659], loss: 9.50189, accuracy: 0.01060, learning rate: 0.00100000, speed: 440.46 data\u002Fsec, eta: 16小时31分08秒\n[2023-08-05 09:53:31.618354 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [600\u002F13659], loss: 9.26083, accuracy: 0.01256, learning rate: 0.00100000, speed: 479.50 data\u002Fsec, eta: 15小时10分12秒\n[2023-08-05 09:53:45.439642 INFO   ] trainer:__train_epoch:334 - Train epoch: [1\u002F30], batch: [700\u002F13659], loss: 9.03548, accuracy: 0.01449, learning rate: 0.00099999, speed: 463.63 data\u002Fsec, eta: 15小时41分08秒\n```\n\n启动VisualDL：`visualdl --logdir=log --host 0.0.0.0`，VisualDL页面如下：\n\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_3e095459b4f3.jpg\" alt=\"VisualDL页面\" width=\"600\">\n\u003C\u002Fdiv>\n\n\n\n\n# 评估模型\n训练结束之后会保存预测模型，我们用预测模型来预测测试集中的音频特征，然后使用音频特征进行两两对比，计算EER和MinDCF。\n```shell\npython eval.py\n```\n\n输出类似如下：\n```\n······\n------------------------------------------------\nW0425 08:27:32.057426 17654 device_context.cc:447] 请注意：设备：0，GPU 计算能力：7.5，驱动程序 API 版本：11.6，运行时 API 版本：10.2\nW0425 08:27:32.065165 17654 device_context.cc:465] 设备：0，cuDNN 版本：7.6。\n[2023-03-16 20:20:47.195908 INFO   ] trainer:evaluate:341 - 成功加载模型：models\u002FEcapaTdnn_Fbank\u002Fbest_model\u002Fmodel.pth\n100%|███████████████████████████| 84\u002F84 [00:28\u003C00:00,  2.95it\u002Fs]\n开始两两对比音频特征...\n100%|███████████████████████████| 5332\u002F5332 [00:05\u003C00:00, 1027.83it\u002Fs]\n评估消耗时间：65s，threshold：0.26，EER: 0.14739, MinDCF: 0.41999\n```\n\n# 推理接口\n\n下面给出了几个常用的接口，更多接口请参考`mvector\u002Fpredict.py`，也可以往下看`声纹对比`和`声纹识别`的例子。\n\n```python\nfrom mvector.predict import MVectorPredictor\n\npredictor = MVectorPredictor(configs='configs\u002Fcam++.yml',\n                             model_path='models\u002FCAMPPlus_Fbank\u002Fbest_model\u002F')\n# 获取音频特征\nembedding = predictor.predict(audio_data='dataset\u002Fa_1.wav')\n# 获取两个音频的相似度\nsimilarity = predictor.contrast(audio_data1='dataset\u002Fa_1.wav', audio_data2='dataset\u002Fa_2.wav')\n\n# 注册用户音频\npredictor.register(user_name='夜雨飘零', audio_data='dataset\u002Ftest.wav')\n# 识别用户音频\nname, score = predictor.recognition(audio_data='dataset\u002Ftest1.wav')\n# 获取所有用户\nusers_name = predictor.get_users()\n# 删除用户音频\npredictor.remove_user(user_name='夜雨飘零')\n```\n\n# 声纹对比\n下面开始实现声纹对比，创建`infer_contrast.py`程序，首先介绍几个重要的函数，`predict()`函数是可以获取声纹特征，`predict_batch()`函数是可以获取一批的声纹特征，`contrast()`函数可以对比两条音频的相似度，`register()`函数注册一条音频到声纹库里面，`recognition()`函输入一条音频并且从声纹库里面对比识别，`remove_user()`函数移除你好。声纹库里面的注册人。我们输入两个语音，通过预测函数获取他们的特征数据，使用这个特征数据可以求他们的对角余弦值，得到的结果可以作为他们相识度。对于这个相识度的阈值`threshold`，读者可以根据自己项目的准确度要求进行修改。\n```shell\npython infer_contrast.py --audio_path1=audio\u002Fa_1.wav --audio_path2=audio\u002Fb_2.wav\n```\n\n输出类似如下：\n```\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:13 - ----------- 额外配置参数 -----------\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:15 - audio_path1: dataset\u002Fa_1.wav\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:15 - audio_path2: dataset\u002Fb_2.wav\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:15 - configs: configs\u002Fecapa_tdnn.yml\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:15 - model_path: models\u002FEcapaTdnn_Fbank\u002Fbest_model\u002F\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:15 - threshold: 0.6\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:15 - use_gpu: True\n[2023-04-02 18:30:48.009149 INFO   ] utils:print_arguments:16 - ------------------------------------------------\n······································································\nW0425 08:29:10.006249 21121 device_context.cc:447] 请注意：设备：0，GPU 计算能力：7.5，驱动程序 API 版本：11.6，运行时 API 版本：10.2\nW0425 08:29:10.008555 21121 device_context.cc:465] 设备：0，cuDNN 版本：7.6。\n成功加载模型参数和优化方法参数：models\u002FEcapaTdnn_Fbank\u002Fbest_model\u002Fmodel.pth\naudio\u002Fa_1.wav 和 audio\u002Fb_2.wav 不是同一个人，相似度为：-0.09565544128417969\n```\n\n同时还提供了有GUI界面的声纹对比程序，执行`infer_contrast_gui.py`启动程序，界面如下，分别选择两个音频，点击开始判断，就可以判断它们是否是同一个人。\n\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_11908b242f5f.jpg\" alt=\"声纹对比界面\">\n\u003C\u002Fdiv>\n\n# 声纹识别\n\n在新闻识别里面主要使用到`register()`函数和`recognition()`函数，首先使用`register()`函数函数来注册音频到声纹库里面，也可以直接把文件添加到`audio_db`文件夹里面，使用的时候通过`recognition()`函数来发起识别，输入一条音频，就可以从声纹库里面识别到所需要的说话人。\n\n有了上面的声纹识别的函数，读者可以根据自己项目的需求完成声纹识别的方式，例如笔者下面提供的是通过录音来完成声纹识别。首先必须要加载语音库中的语音，语音库文件夹为`audio_db`，然后用户回车后录音3秒钟，然后程序会自动录音，并使用录音到的音频进行声纹识别，去匹配语音库中的语音，获取用户的信息。通过这样方式，读者也可以修改成通过服务请求的方式完成声纹识别，例如提供一个API供APP调用，用户在APP上通过声纹登录时，把录音到的语音发送到后端完成声纹识别，再把结果返回给APP，前提是用户已经使用语音注册，并成功把语音数据存放在`audio_db`文件夹中。\n```shell\npython infer_recognition.py\n```\n\n输出类似如下：\n```\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:13 - ----------- 额外配置参数 -----------\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:15 - audio_db_path: audio_db\u002F\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:15 - configs: configs\u002Fecapa_tdnn.yml\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:15 - model_path: models\u002FEcapaTdnn_Fbank\u002Fbest_model\u002F\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:15 - record_seconds: 3\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:15 - threshold: 0.6\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:15 - use_gpu: True\n[2023-04-02 18:31:20.521040 INFO   ] utils:print_arguments:16 - ------------------------------------------------\n······································································\nW0425 08:30:13.257884 23889 device_context.cc:447] 请注意：设备：0，GPU 计算能力：7.5，驱动程序 API 版本：11.6，运行时 API 版本：10.2\nW0425 08:30:13.260191 23889 device_context.cc:465] 设备：0，cuDNN 版本：7.6。\n成功加载模型参数和优化方法参数：models\u002Fecapa_tdnn\u002Fmodel.pth\n已加载 沙瑞金 的音频。\n已加载 李达康 的音频。\n请选择功能，0为注册音频到声纹库，1为执行声纹识别：0\n按下回车键开机录音，录音3秒中：\n开始录音......\n录音已结束!\n请输入该音频用户的名称：夜雨飘零\n请选择功能，0为注册音频到声纹库，1为执行声纹识别：1\n按下回车键开机录音，录音3秒中：\n开始录音......\n录音已结束!\n识别说话的为：夜雨飘零，相似度为：0.920434\n```\n\n\n同时还提供了有GUI界面的声纹识别程序，执行`infer_recognition_gui.py`启动，点击`注册音频到声纹库`按钮，理解开始说话，录制3秒钟，然后输入注册人的名称，之后可以`执行声纹识别`按钮，然后立即说话，录制3秒钟后，等待识别结果。`删除用户`按钮可以删除用户。`实时识别`按钮可以实时识别，可以一直录音，一直识别。\n\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_b848f321c771.jpg\" alt=\"声纹识别界面\">\n\u003C\u002Fdiv>\n\n# 说话人日志（分离说话人）\n\n执行`infer_speaker_diarization.py`程序，输入音频路径，就可以分离出说话人，并显示结果，建议音频长度不要低于10秒。更多功能可以查看该程序参数。\n```shell\npython infer_speaker_diarization.py --audio_path=dataset\u002Ftest_long.wav\n```\n\n输出类似如下：\n```\n2024-10-10 19:30:40.768 | INFO     | mvector.predict:__init__:61 - 成功加载模型参数：models\u002FCAMPPlus_Fbank\u002Fbest_model\u002Fmodel.pth\n2024-10-10 19:30:40.795 | INFO     | mvector.predict:__create_index:127 - 声纹特征索引创建完成，一共有3个用户，分别是：['沙瑞金', '夜雨飘零', '李达康']\n2024-10-10 19:30:40.796 | INFO     | mvector.predict:__load_audio_db:142 - 正在加载声纹库数据...\n100%|██████████| 3\u002F3 [00:00\u003C?, ?it\u002Fs]\n2024-10-10 19:30:40.798 | INFO     | mvector.predict:__create_index:127 - 声纹特征索引创建完成，一共有3个用户，分别是：['沙瑞金', '夜雨飘零', '李达康']\n2024-10-10 19:30:40.798 | INFO     | mvector.predict:__load_audio_db:172 - 声纹库数据加载完成！\n识别结果：\n{'speaker': '沙瑞金', 'start': 0.0, 'end': 2.0}\n{'speaker': '陌生人1', 'start': 4.0, 'end': 7.0}\n{'speaker': '李达康', 'start': 7.0, 'end': 8.0}\n{'speaker': '沙瑞金', 'start': 9.0, 'end': 12.0}\n{'speaker': '沙瑞金', 'start': 13.0, 'end': 14.0}\n{'speaker': '陌生人1', 'start': 15.0, 'end': 19.0}\n```\n\n显示结果图像如下，可以通过`空格`键控制播放音频，点击位置可以跳转音频到指定位置：\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_1b48e3e55a44.jpg\" alt=\"说话人日志\" width=\"800\">\n\u003C\u002Fdiv>\n\n项目同样提供了GUI界面的程序，执行`infer_speaker_diarization_gui.py`程序。更多功能可以查看该程序参数。\n```shell\npython infer_speaker_diarization_gui.py\n```\n\n可以打开这样一个页面，进行说话人识别：\n\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_924e1fdac01a.png\" alt=\"说话人日志\" width=\"800\">\n\u003C\u002Fdiv>\n\n\n注意：如果说话人名字是中文的，需要设置安装字体才能正常显示，一般情况下Windows无需安装，Ubuntu需要安装。如果Windows确实是缺少字体，只需要[字体文件](https:\u002F\u002Fgithub.com\u002Ftracyone\u002Fprogram_font)这里下载`.ttf`格式的文件，复制到`C:\\Windows\\Fonts`即可。Ubuntu系统操作如下。\n\n1. 安装字体\n```shell\ngit clone https:\u002F\u002Fgithub.com\u002Ftracyone\u002Fprogram_font && cd program_font && .\u002Finstall.sh\n```\n\n2. 执行下面Python代码\n```python\nimport matplotlib\nimport shutil\nimport os\n\npath = matplotlib.matplotlib_fname()\npath = path.replace('matplotlibrc', 'fonts\u002Fttf\u002F')\nprint(path)\nshutil.copy('\u002Fusr\u002Fshare\u002Ffonts\u002FMyFonts\u002Fsimhei.ttf', path)\nuser_dir = os.path.expanduser('~')\nshutil.rmtree(f'{user_dir}\u002F.cache\u002Fmatplotlib', ignore_errors=True)\n```\n\n\n# 其他版本\n - Tensorflow：[VoiceprintRecognition-Tensorflow](https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Tensorflow)\n - PaddlePaddle：[VoiceprintRecognition-PaddlePaddle](https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-PaddlePaddle)\n - Keras：[VoiceprintRecognition-Keras](https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Keras)\n\n\n## 打赏作者\n\n\u003Cbr\u002F>\n\u003Cdiv align=\"center\">\n\u003Cp>打赏一块钱支持一下作者\u003C\u002Fp>\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_readme_8fee2eae2436.jpg\" alt=\"打赏作者\" width=\"400\">\n\u003C\u002Fdiv>\n\n\n# 参考资料\n1. https:\u002F\u002Fgithub.com\u002FPaddlePaddle\u002FPaddleSpeech\n2. https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FPaddlePaddle-MobileFaceNets\n3. https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FPPASR\n4. https:\u002F\u002Fgithub.com\u002Falibaba-damo-academy\u002F3D-Speaker\n5. https:\u002F\u002Fgithub.com\u002Fwenet-e2e\u002Fwespeaker","# VoiceprintRecognition-Pytorch 快速上手指南\n\n本指南基于 PyTorch 实现，支持 EcapaTdnn、CAM++、ERes2Net 等多种先进声纹识别模型，适用于说话人验证、识别及日志任务。\n\n## 1. 环境准备\n\n**系统要求：**\n- 操作系统：Windows 11 \u002F Ubuntu 22.04 \u002F macOS\n- Python 版本：3.8+ (推荐 3.11)\n- GPU 支持：可选（推荐 CUDA 11.8）\n\n**前置依赖：**\n- Anaconda 3\n- PyTorch 2.4.0+\n- 数据集：推荐 [CN-Celeb](http:\u002F\u002Fopenslr.org\u002F82\u002F) 或 VoxCeleb1&2\n\n## 2. 安装步骤\n\n### 2.1 安装 PyTorch (GPU 版本)\n如果尚未安装 PyTorch，请使用以下命令安装（使用清华镜像源加速）：\n\n```shell\nconda install pytorch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 pytorch-cuda=11.8 -c pytorch -c nvidia\n```\n\n### 2.2 安装项目依赖\n推荐使用源码安装以获取最新功能：\n\n```shell\ngit clone https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch.git\ncd VoiceprintRecognition-Pytorch\u002F\npip install . -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n```\n\n或者直接使用 pip 安装发布版：\n\n```shell\npython -m pip install mvector -U -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n```\n\n## 3. 基本使用\n\n### 3.1 准备数据\n本项目默认使用 `dataset` 目录存放数据。以 CN-Celeb 为例，需将解压后的数据放入该目录，并生成训练列表。\n\n数据列表格式为：`\u003C音频文件相对路径>\\t\u003C说话人 ID>`。\n\n执行以下脚本自动生成数据列表：\n\n```shell\npython create_data.py\n```\n\n生成的 `train_list.txt` 示例如下：\n```text\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-03-019.flac      2795\ndataset\u002FCN-Celeb2_flac\u002Fdata\u002Fid11999\u002Frecitation-10-023.flac      2795\n```\n\n> **注意**：测试集数据的说话人 ID 无需与训练集一致，但同一人的不同音频必须标记为相同 ID。\n\n### 3.2 训练模型\n配置好数据后，即可开始训练。默认使用 Fbank 特征提取和 AAMLoss 损失函数。\n\n```shell\npython train.py\n```\n\n训练过程中会自动保存模型权重到 `models` 目录。\n\n### 3.3 模型推理（声纹对比）\n训练完成后，可使用预训练模型或自定义模型进行声纹对比。\n\n```shell\npython infer_compare.py --model_path=models\u002FCAM++_best_model.pth --audio_1=test.wav --audio_2=test2.wav\n```\n\n程序将输出两段音频是否属于同一说话人的概率得分。\n\n---\n*更多高级用法（如修改预处理方法、提取特征、说话人日志等）请参考项目完整文档。*","某金融科技公司正在开发一款远程银行身份验证系统，需要确保客户在通过电话办理敏感业务时，操作者确实是账户持有人本人。\n\n### 没有 VoiceprintRecognition-Pytorch 时\n- **模型选型困难且单一**：团队难以快速复现论文中的先进算法（如 EcapaTdnn 或 CAM++），只能依赖过时的基础模型，导致识别准确率在嘈杂电话线路中大幅下降。\n- **预处理流程繁琐**：缺乏统一的梅尔频谱（MelSpectrogram）或 Fbank 特征提取接口，开发人员需手动编写大量信号处理代码，极易引入噪声干扰且调试耗时。\n- **损失函数优化受限**：无法便捷使用 ArcFace Loss 等加性角度间隔损失函数，模型难以区分音色极度相似的说话人，误识率（EER）居高不下。\n- **数据增强能力薄弱**：面对真实场景中多变的背景噪音和混响，缺乏内置的语速、音量及混响增强手段，模型泛化能力差，上线风险高。\n\n### 使用 VoiceprintRecognition-Pytorch 后\n- **即刻集成 SOTA 模型**：直接调用预置的 ERes2Net 或 CAM++ 等先进架构，无需从零训练，显著提升了在复杂声学环境下的特征提取能力。\n- **标准化特征工程**：利用内置的多种预处理方法（如 WavLM、MFCC），一键完成高质量音频特征转换，大幅缩短数据清洗与准备周期。\n- **高精度判别边界**：通过配置 AAMLoss（ArcFace Loss），有效拉大不同说话人的特征距离，即使面对双胞胎或高仿录音也能精准拦截。\n- **鲁棒性显著增强**：应用项目自带的噪声、混响及 SpecAugment 增强策略，模型迅速适应真实电话信道，将误识率降低至商用标准以下。\n\nVoiceprintRecognition-Pytorch 通过提供从数据增强到尖端模型的一站式解决方案，帮助团队以最低成本构建了金融级的高安全声纹验证防线。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fyeyupiaoling_VoiceprintRecognition-Pytorch_a4b34668.png","yeyupiaoling","夜雨飘零","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fyeyupiaoling_4a486346.png","博客：https:\u002F\u002Fyeyupiaoling.cn",null,"https:\u002F\u002Fgithub.com\u002Fyeyupiaoling",[82],{"name":83,"color":84,"percentage":85},"Python","#3572A5",100,1257,167,"2026-04-03T10:17:22","Apache-2.0","Windows, Linux, macOS","推荐 NVIDIA GPU，安装命令示例使用 CUDA 11.8 (pytorch-cuda=11.8)，未明确最低显存要求","未说明",{"notes":94,"python":95,"dependencies":96},"1. 官方推荐使用 Anaconda 3 管理环境。2. 支持 Windows 11 或 Ubuntu 22.04，同时也标注支持 macOS。3. 项目依赖自定义库'mvector'，建议通过源码安装以获取最新代码。4. 训练数据建议使用 aukit 工具进行降噪和去除静音处理。5. 部分预训练模型文件需加入知识星球获取，或通过 HuggingFace 下载（如 wavlm, wav2vec2 等）。","3.11",[97,98,99,100],"torch==2.4.0","torchvision==0.19.0","torchaudio==2.4.0","mvector",[55,13,14],[103,104,105,106,107],"pytorch","voice-recognition","arcface","speaker-recognition","ecapa-tdnn","2026-03-27T02:49:30.150509","2026-04-06T05:37:29.597097",[111,116,121,126,131,136,140,145],{"id":112,"question_zh":113,"answer_zh":114,"source_url":115},13827,"训练时 Loss 正常但准确率（accuracy）一直为 0 是什么原因？","这通常是因为数据集的类别数量配置错误。请检查你的 train_list.txt 文件中的最大标签索引，并确保代码中设置的类别数（num_classes）比最大索引大 1（例如：如果最大标签是 245，类别数应设为 246）。此外，需确保数据读取逻辑正确，参考 utils\u002Freader.py 中的实现。","https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch\u002Fissues\u002F3",{"id":117,"question_zh":118,"answer_zh":119,"source_url":120},13828,"声纹识别中陌生人被误判为已注册用户且相似度极高（如 0.99），如何解决？","这是因为识别阈值设置得太低。解决方法是提高判定相似的分数阈值，不要使用过低的分数作为通过标准。如果问题依旧，建议尝试其他预训练模型或重新训练模型以获得更好的区分度。","https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch\u002Fissues\u002F6",{"id":122,"question_zh":123,"answer_zh":124,"source_url":125},13829,"如何准备和生成项目所需的数据集列表文件？","首先下载数据集并解压到项目的 dataset 目录下，然后直接运行 python create_data.py 脚本即可自动生成所需的列表文件。如果遇到路径错误，请注意 Linux 和 Windows 的路径分隔符差异，确保路径格式正确。","https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch\u002Fissues\u002F2",{"id":127,"question_zh":128,"answer_zh":129,"source_url":130},13830,"如何将模型部署到 C++ 环境或使用 NCNN？","目前可以通过将模型导出为 ONNX 格式，再使用 onnxruntime 进行推理来实现 C++ 部署。维护者已测试过转换为 onnxruntime 框架（Python 版本），但 C++ 的前后处理代码需要开发者自行编写。导出时通常只需导出核心模型（如 ECAPA-TDNN），具体视架构而定。","https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch\u002Fissues\u002F37",{"id":132,"question_zh":133,"answer_zh":134,"source_url":135},13831,"不同人的语音在对比测试中被错误识别为同一个人，原因是什么？","这通常是因为特征提取方式不匹配。请检查加载的预训练模型（.pth）所使用的预处理方法（如 spectrogram），并确保测试代码中的特征提取配置与模型训练时完全一致。如果不匹配，需要修改测试代码中的预处理逻辑。","https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch\u002Fissues\u002F50",{"id":137,"question_zh":138,"answer_zh":139,"source_url":115},13832,"输入音频的形状为什么是 [1, 257, 257] 而不是原始的一维音频？","原始音频是一维的，但在输入模型前会被转换为声谱图（Spectrogram）或梅尔频谱图，因此变成了二维图像形式（时间帧 x 频率 bin）。代码会在数据加载和预处理阶段自动完成从 [1, 32000] 等一维波形到 [1, 257, 257] 二维特征的转换。",{"id":141,"question_zh":142,"answer_zh":143,"source_url":144},13833,"训练日志显示需要 40+ 小时，这是指单次 Epoch 还是总训练时间？","日志中显示的预估时间（eta）通常是指完成当前 Epoch 剩余部分或单个 Epoch 的时间，具体取决于日志上下文。如果显示 Train epoch [0\u002F30]，意味着总共需要进行 30 次完整的 Epoch 训练，总时长将是单次时长乘以 30。","https:\u002F\u002Fgithub.com\u002Fyeyupiaoling\u002FVoiceprintRecognition-Pytorch\u002Fissues\u002F31",{"id":146,"question_zh":147,"answer_zh":148,"source_url":144},13834,"录音注册或识别时有什么注意事项以提高准确率？","录音时应尽量避免包含过长的静音片段。过多的静音会干扰特征提取，导致声纹特征不准确，从而影响识别或注册的相似度评分。",[]]