ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PaddleSpeech 说话人验证实战:VoxCeleb 上 ECAPA-TDNN 的 EER 结果与 S-Norm 评分详解

PaddleSpeech 说话人验证实战:VoxCeleb 上 ECAPA-TDNN 的 EER 结果与 S-Norm 评分详解 人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载本篇文章以 examples/voxceleb/sv0/RESULT.md 为核心主体结合 PaddleSpeech 的 VoxCeleb 说话人验证示例工程数据准备、训练、测试全流程与paddlespeech/vector源码系统讲解 ECAPA-TDNN 说话人验证模型的实验结果、评价指标EER、等错误率阈值以及 S-Norm 评分归一化方法的实现原理。读完本文你将能够复现该实验结果、读懂其评估指标并理解评分归一化为何能显著降低 EER。一、实验背景VoxCeleb 数据集上的说话人验证任务说话人验证Speaker Verification的任务是判断一段语音是否由指定说话人说出是声纹识别Voiceprint Recognition的核心任务之一。VoxCeleb 是由牛津大学视觉几何组VGG发布的真实世界说话人识别数据集包含 VoxCeleb1 与 VoxCeleb2 两个子集语音均采集自自然环境访谈、演讲等噪声与信道差异大是评测说话人验证系统的主流基准。PaddleSpeech 的说话人验证示例位于examples/voxceleb/sv0目录其完整流程由run.sh中的多个 stage 组成Stage功能0数据准备下载 VoxCeleb1/VoxCeleb2 数据集、将 VoxCeleb2 的 m4a 格式转为 wav、生成 train/dev/test 的 manifest 文件、下载 RIR Noise 数据集并生成用于数据增强的噪声 manifest1训练说话人识别模型2使用 VoxCeleb trial 文件测试说话人验证当前仅支持用余弦相似度打分可以在 examples/voxceleb/sv0/run.sh 中看到这三个 stage 的实际调用stage 0 调用./local/data.shstage 1 调用./local/train.shstage 2 调用./local/test.sh。二、实验结果总览ECAPA-TDNN 在 VoxCeleb 测试集上的 EERRESULT.md记录的是 PaddleSpeech 0.2.1 版本发布的 ECAPA-TDNN 模型在 VoxCeleb test 集上的说话人验证结果结果如下表ModelNumber of ParamsReleaseConfigdimTest setCosineCosine S-NormECAPA-TDNN85M0.2.1conf/ecapa_tdnn.yaml192test0.81880.7815表中各列含义Number of Params模型参数量为 85M约 8500 万参数属于大规模说话人编码器。Release该模型随 PaddleSpeech 0.2.1 版本发布对应压缩包名为sv0_ecapa_tdnn_voxceleb12_ckpt_0_2_1.tar.gz。Config模型与训练配置为conf/ecapa_tdnn.yaml。dim说话人嵌入Speaker Embedding维度为 192即每条语音被映射为 192 维的声纹向量。Test set测试集为 VoxCeleb 官方 test 划分data/vox1/veri_test2.txttrial 文件。Cosine / Cosine S-NormEER 分别为 0.8188% 与 0.7815%单位为百分比即等错误率。该表同时对比了 SpeechBrain 的 ECAPA-TDNN 参考结果voxceleb1 voxceleb2 训练不使用 S-Norm 时 EER 为 0.90%使用 S-Norm 后降至 0.80%。可以直观看到PaddleSpeech 复现的 ECAPA-TDNN 在纯余弦相似度打分下0.8188%已优于 SpeechBrain 的 0.90% 参考值引入 S-Norm 评分归一化后EER 进一步从 0.8188% 降至 0.7815%相对下降约 4.6%再次验证了评分归一化对说话人验证性能的稳定增益。三、ECAPA-TDNN 模型结构与源码实现3.1 模型架构概述ECAPA-TDNNEmphasized Channel Attention, Propagation and Aggregation in TDNN Based Speaker Verification是在传统 TDNN时延神经网络说话人嵌入网络基础上改进的骨干模型论文发表于 2020 年arXiv:2005.07143。其核心创新点包括SE-Res2Net 模块在 Res2Net 多尺度卷积基础上引入 Squeeze-and-Excitation 通道注意力强调说话人相关的特征通道多层特征聚合Multi-layer Feature Aggregation, MFA将多个 SE-Res2Net 层的输出拼接后送入聚合模块实现不同感受野信息的传播与聚合注意力统计池化Attentive Statistics Pooling, ASP利用自注意力加权计算语音帧的均值与标准差替代简单的均值池化提取更稳健的句子级统计量。3.2 源码级模块拆解PaddleSpeech 的 ECAPA-TDNN 实现在 paddlespeech/vector/models/ecapa_tdnn.py 中通过组合以下类构建完整网络TDNNBlock单层 TDNN 块由一维卷积 ReLU 激活 BatchNorm 组成默认使用 reflect 模式的 same 填充Conv1d._manage_padding动态计算填充量Res2NetBlock将输入按通道切分为scale默认 8个子块逐块做 3×1 卷积并逐级累加最后拼接回原始通道数形成多尺度特征SEBlock全局平均池化支持按lengths掩码→ 1×1 卷积降维 → ReLU → 1×1 卷积升维 → Sigmoid得到通道权重并乘回原特征SERes2NetBlock即 TDNN1 → Res2Net → TDNN2 → SE 的残差组合输入输出通道不一致时自动引入 1×1 卷积捷径shortcutAttentiveStatisticsPooling将 x 与其全局均值、标准差拼接以引入全局上下文经 TDNN、Tanh、1×1 卷积生成注意力权重softmax 后对 x 加权求均值与标准差输出 2 倍通道数的统计特征EcapaTdnn主干网络依次为初始 TDNN 块、若干 SERes2Net 块、多层特征聚合 TDNN、ASP 池化后接 BatchNorm与最终的 1×1 卷积线性层输出形状为(N, emb_size, 1)的说话人嵌入。EcapaTdnn.forward的实现中各层输出被收集到xl列表随后执行paddle.concat(xl[1:], axis1)完成多层特征聚合这正是 ECAPA-TDNN Propagation and Aggregation 思想的直接体现。3.3 配置项逐字段解读RESULT.md中的 85M 参数、192 维嵌入模型其完整配置定义在 examples/voxceleb/sv0/conf/ecapa_tdnn.yaml 中主要配置段如下数据与增强augment: True # 是否启用 RIR/噪声数据增强 batch_size: 32 num_workers: 2 num_speakers: 7205 # 训练说话人数1211 vox1 5994 vox2测试说话人 41 shuffle: True split_ratio: 0.9 # 说话人语音按 9:1 划分enroll/test chunk_duration: 3.0 # 训练语音随机截取 3 秒片段 random_chunk: True verification_file: data/vox1/veri_test2.txt # 官方测试 trial 文件特征提取sr: 16000 # 采样率 16kHz n_mels: 80 # 80 维 FBank 特征 window_size: 400 # 25ms 窗长25 * 16000 / 1000 400 hop_size: 160 # 10ms 帧移10 * 16000 / 1000 160模型结构对应EcapaTdnn构造参数model: input_size: 80 channels: [1024, 1024, 1024, 1024, 3072] # 各块通道数含聚合层 kernel_sizes: [5, 3, 3, 3, 1] dilations: [1, 2, 3, 4, 1] # 空洞卷积膨胀率扩大感受野 attention_channels: 128 # ASP 注意力通道数 lin_neurons: 192 # 最终嵌入维度对应表中 dim192训练超参数seed: 1986 # 与 SpeechBrain 配置保持一致 epochs: 10 save_interval: 10 log_interval: 10 learning_rate: 1e-8 # 循环学习率Cyclic LR的最小值 max_lr: 1e-3 # 循环学习率峰值 step_size: 140000 # 学习率循环步数训练阶段采用说话人识别Speaker Identification目标以 AAM-SoftmaxAdditive Angular Margin Softmax为损失配置中的margin: 0.2、scale: 30即为角度间隔与缩放因子其实现位于 paddlespeech/vector/modules/loss.py 的AngularMargin/AdditiveAngularMargin/LogSoftmaxWrapper类。训练出的模型随后在验证阶段仅使用 backboneECAPA-TDNN提取嵌入不再使用分类头。四、评估指标解读EER 与等错误率阈值说话人验证系统的常用评价指标是等错误率Equal Error Rate, EER。其计算过程为对 trial 中的每个测试对计算相似度得分将得分从高到低排序并遍历阈值在某个阈值下**误接受率FAR把非目标说话人判为目标与误拒绝率FRR把目标说话人判为非目标**相等此时的错误率即为 EER对应的得分即为等错误率阈值。PaddleSpeech 的 EER 计算实现在 paddlespeech/vector/exps/ecapa_tdnn/test.py 的compute_eer函数中def compute_eer(labels: np.ndarray, scores: np.ndarray) - List[float]: fpr, tpr, threshold roc_curve(y_truelabels, y_scorescores) fnr 1 - tpr eer_threshold threshold[np.nanargmin(np.absolute((fnr - fpr)))] eer fpr[np.nanargmin(np.absolute((fnr - fpr)))] return eer, eer_threshold实现思路是借助sklearn.metrics.roc_curve得到不同阈值下的假阳性率FPR与真阳性率TPR令 FNR 1 - TPR找到 |FNR - FPR| 最小时对应的阈值作为 EER 阈值该点的 FPR 即为 EER。测试脚本最终输出格式为EER of verification test: {EER*100:.4f}%, score threshold: {threshold:.5f}。RESULT.md表中的 0.8188 / 0.7815 即为该测试流程local/test.sh→test.py在上述 trial 文件上计算得到的 EER百分比形式。verification_file指向data/vox1/veri_test2.txt其中每一行形如label enroll_id test_id1 表示同一说话人目标0 表示不同说话人非目标。五、S-Norm 评分归一化原理、实现与效果5.1 为什么要做评分归一化说话人验证中注册语音与测试语音的余弦相似度得分受信道、噪声等条件影响存在系统性偏差直接使用原始得分设定阈值会放大误判。评分归一化Score Normalization通过引入冒充者imposter集合统计得分的均值与标准差将原始得分标准化后再比较从而降低 EER、提升鲁棒性。常见的归一化方式包括 Z-Norm、T-Norm 和 S-NormZ-Norm仅用注册enroll侧与冒充者集合的得分统计量归一化T-Norm仅用测试test侧与冒充者集合的得分统计量归一化S-NormSymmetric Norm对注册侧与测试侧两侧分别归一化后取平均即 Z-Norm 与 T-Norm 的对称组合效果更稳健。5.2 源码实现S-Norm 的实现在 paddlespeech/vector/exps/ecapa_tdnn/test.py 的compute_verification_scores函数中。核心逻辑为将注册嵌入与测试嵌入分别与整个冒充者集合train_cohort逐行计算余弦相似度得到得分向量若配置了cohort_sizeconf/ecapa_tdnn.yaml中为 20000则用paddle.topk仅保留相似度最高的前 k 个冒充者得分再计算均值mean_e_c/mean_t_c与标准差std_e_c/std_t_c取 top-k 是为了让统计量聚焦于最像的冒充者避免无关低分样本稀释统计量按配置的score_norm类型归一化if config.score_norm s-norm: score_e (score - mean_e_c) / std_e_c score_t (score - mean_t_c) / std_t_c score 0.5 * (score_e score_t) elif config.score_norm z-norm: score (score - mean_e_c) / std_e_c elif config.score_norm t-norm: score (score - mean_t_c) / std_t_c可见 S-Norm 就是 Z-Norm 与 T-Norm 得分的平均。conf/ecapa_tdnn.yaml中对应配置为score_norm: s-norm cohort_size: 20000 # 归一化用冒充者集合的大小取相似度最高的 2 万条 n_train_snts: 400000 # 从训练集抽取出用于归一化统计的语音条数测试流程中test.py的main函数冒充者集合取自data/vox/csv/train.csv训练集并按n_train_snts限制条数之后compute_dataset_embedding(train_loader, model, None, config, train_embeddings)计算训练集嵌入不做均值/方差归一化即传入mean_var_norm_embNone堆叠为train_cohort后送入打分函数。5.3 效果分析从RESULT.md可见S-Norm 将 EER 从 0.8188% 降至 0.7815%相对下降约 4.6%。这与 SpeechBrain 参考实现中 S-Norm 带来的增益方向一致0.90% → 0.80%。需要注意的是S-Norm 需要额外的冒充者语料与计算开销属于测试阶段的锦上添花手段不影响训练过程。六、实验复现从数据准备到结果输出6.1 一键式运行推荐进入示例目录后依次执行三个 stage 即可端到端复现实验# 数据准备 训练 测试使用默认 4 卡 GPU0,1,2,3 bash run.sh --stage 0 --stop_stage 2 # 只跑某一阶段例如仅数据准备 bash run.sh --stage 0 --stop_stage 0 # 仅训练 bash run.sh --stage 1 --stop_stage 1run.sh中的本地变量均可通过--variable value方式覆盖例如bash run.sh --gpus 0,1 # 指定 GPU 卡号 bash run.sh --conf_path conf/ecapa_tdnn_small.yaml # 换用小型模型配置其中gpus置空表示仅使用 CPU 训练。6.2 手动分步执行首先设置环境变量run.sh与各 local 脚本均依赖source path.sh source ${MAIN_ROOT}/utils/parse_options.sh # 支持 --variable value 风格的参数解析然后依次执行# 数据准备生成 data/vox 下的 csv 与 manifest bash ./local/data.sh ./data/ conf/ecapa_tdnn.yaml # 训练 CUDA_VISIBLE_DEVICES0,1,2,3 bash ./local/train.sh ./data/ exp/ecapa-tdnn-vox12-big/ conf/ecapa_tdnn.yaml # 测试输出 EER 与阈值 CUDA_VISIBLE_DEVICES0 bash ./local/test.sh ./data/ exp/ecapa-tdnn-vox12-big/ conf/ecapa_tdnn.yaml数据准备完成后data目录结构如下详见 examples/voxceleb/sv0/README.mddata/ ├── rir_noise # RIR 与噪声数据集及增强 manifest ├── vox │ ├── csv # train.csv / dev.csv / enroll.csv / test.csv │ └── meta/label2id.txt └── vox1 # veri_test2.txt trial 文件与 manifest.dev/test 等需要特别注意的是VoxCeleb2 数据集原始音频为 m4a 格式必须先使用local/convert.sh转为 wav 并放置到${MAIN_ROOT}/datasets/vox2run.sh会从${MAIN_ROOT}/datasets/vox1/{dev,test}/wav与${MAIN_ROOT}/datasets/vox2/wav中查找音频。6.3 使用官方预训练模型快速验证如果不打算从零训练可以直接下载 PaddleSpeech 发布的 0.2.1 版本 ECAPA-TDNN 预训练模型即RESULT.md中记录结果对应的模型解压后直接测试wget https://paddlespeech.cdn.bcebos.com/vector/voxceleb/sv0_ecapa_tdnn_voxceleb12_ckpt_0_2_1.tar.gz tar -xvf sv0_ecapa_tdnn_voxceleb12_ckpt_0_2_1.tar.gz source path.sh # 若已处理数据并生成 manifest可跳过 data 准备步骤 CUDA_VISIBLE_DEVICES bash ./local/test.sh ./data sv0_ecapa_tdnn_voxceleb12_ckpt_0_2_1/model/ conf/ecapa_tdnn.yaml该模型同样收录于 docs/source/released_model.md 的说话人验证Speaker Verification模型列表中。local/test.sh最终调用 paddlespeech/vector/exps/ecapa_tdnn/test.py加载model.pdparams检查点并输出 EER。七、总结PaddleSpeech 在 VoxCeleb 数据集上以 85M 参数、192 维嵌入的 ECAPA-TDNN 模型取得了 0.8188% 的 EER配合 S-Norm 评分归一化进一步降至 0.7815%达到并优于 SpeechBrain 参考实现的水平。这一结果背后是一套完整的工程链路run.sh分阶段编排数据准备含 m4a→wav 转换、RIR 噪声增强、trial 文件生成、AAM-Softmax 说话人识别训练、嵌入提取与余弦打分、以及基于冒充者集合的 S-Norm 归一化与 EER 计算。读者既可以一键复现该实验也可以通过 paddlespeech/vector/models/ecapa_tdnn.py 与 test.py 深入理解 ECAPA-TDNN 的模块化实现与评测细节为构建自己的说话人验证系统提供可参照的基线。赞分享人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载相关推荐PowerShell 7.0 发布周期全解从 preview.1 到 7.0.13 的 LTS 长期服务版演进实录PowerShell 7.0 发布周期全解从 preview.1 到 7.0.13 的 LTS 长期服务版演进实录 本文基于仓库中的 CHANGELOG/7.人工智能语音音频NLP媒体生成SpeechBrain 说话人识别与验证实战基于 VoxCeleb 训练 X-Vector、ECAPA-TDNN 与 ResNet 嵌入SpeechBrain 说话人识别与验证实战基于 VoxCeleb 训练 X Vector、ECAPA TDNN 与 ResNet 嵌入 本篇技术指南以 Sp人工智能深度学习语音音频NLP预训练PaddleSpeech 声纹识别说话人验证实战用 ECAPA-TDNN 提取说话人嵌入并计算相似度PaddleSpeech 声纹识别说话人验证实战用 ECAPA TDNN 提取说话人嵌入并计算相似度 声纹识别Speaker Verification人工智能语音音频NLP媒体生成上一篇告别卡顿lazy.nvim异步任务引擎让Neovim插件管理飞起来下一篇Lexical SessionStorage会话存储的使用场景与限制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表