ARTICLE DETAIL

资讯详情

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

PaddleSpeech 说话人验证实战:基于 VoxCeleb 数据集与 ECAPA-TDNN 的完整训练评测指南

PaddleSpeech 说话人验证实战:基于 VoxCeleb 数据集与 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点击查看免费下载导读本文以 PaddleSpeech 仓库中 examples/voxceleb/README.md 为骨架系统讲解说话人验证Speaker Verification在 VoxCeleb 数据集上的完整落地路径从 VoxCeleb1/2 的数据下载、m4a 到 wav 格式转换到 VoxCeleb 官方评测协议trial 文件的解读再到 PaddleSpeech 中 sv0ECAPA-TDNN 纯 Python 实现的配置、训练、测试与预训练模型推理。读完本文你将掌握在 PaddleSpeech 中从零跑通 VoxCeleb 说话人验证全流程所需的全部命令、配置参数与原理依据。一、VoxCeleb 数据集概览VoxCeleb 是由牛津大学 VGG 团队发布的音视频说话人数据集语音片段全部来自 YouTube 访谈视频的截取。它的特点非常鲜明说话人覆盖不同种族、口音、职业与年龄段所有语音都是野外in the wild采集包含背景人声、笑声、重叠语音、姿态变化和光照差异等复杂干扰每条语音片段时长至少 3 秒同时提供音频与视频两种模态。数据集分为两个版本VoxCeleb1规模较小常作为评测集使用VoxCeleb2规模更大是训练集的主力来源。两个版本之间不存在说话人重叠no overlap between the two versions这意味着可以用 VoxCeleb2 训练、VoxCeleb1 评测而不会出现说话人身份泄漏。PaddleSpeech 仓库在 dataset/voxceleb/README.md 中对数据集特性做了上述描述对应的下载与 manifest 生成脚本分别是 dataset/voxceleb/voxceleb1.py 与 dataset/voxceleb/voxceleb2.py。数据集规模统计datasetvox1 - devvox1 - testvox2 - devvox2 - testspks说话人数1211405994118utts语音条数1486424874109200936273time(h)总时长/小时340.411.22360.279.9以上数据来自 examples/voxceleb/README.md 的统计表。可以看到 VoxCeleb2 的 dev 集包含约 109 万条语音、2360 小时是典型的大数据量 数千说话人训练场景非常适合训练大规模说话人嵌入speaker embedding模型。二、VoxCeleb 官方评测协议trial 文件说话人验证的标准评测方式是构建trial 列表每一行是一个注册语音-测试语音对并标注该对是否来自同一说话人positive/negative。模型对每个 trial 对计算相似度得分再通过阈值比较得到等错误率EER等指标。PaddleSpeech 仓库在 examples/voxceleb/README.md 中整理了 VoxCeleb 官方的 trial 文件统计trialfilenamenumspositivenegativeVoxCeleb1veri_test.txt377201886018860VoxCeleb1(cleaned)veri_test2.txt376111880218809VoxCeleb1-Hlist_test_hard.txt552536276270276266VoxCeleb1-H(cleaned)list_test_hard2.txt550894275488275406VoxCeleb1-Elist_test_all.txt581480290743290737VoxCeleb1-E(cleaned)list_test_all2.txt579818289921289897说明VoxCeleb1基础协议共 37720 对正负样本各半18860/18860是社区最常用的入门评测cleaned版本剔除了官方标注为噪声/异常的样本对数量略有减少VoxCeleb1-Hhard与VoxCeleb1-Eextended分别是更难同国籍/同性别的困难对占比更高与更全覆盖全部说话人对的扩展协议规模都在 50 万对以上。从 examples/voxceleb/sv0/local/data.sh 可以看到stage 1 的数据下载阶段会通过voxceleb1.py自动生成manifest.dev与manifest.test注释中标注了 manifest.dev: 148642、manifest.test: 4847并下载上述 trial 文件。sv0 的默认评测使用 cleaned 版本的veri_test2.txt见配置文件中的verification_file: data/vox1/veri_test2.txt测试脚本据此计算 EER。三、VoxCeleb2 数据准备m4a 转 wavVoxCeleb2 官方发布的音频文件是m4a 格式而 PaddleSpeech 的后续流程要求 wav 输入因此所有 m4a 必须先完成格式转换并且只需执行一次转换耗时可能长达数小时与机器性能相关。原文档给出的转换命令模板为ffmpeg -y -i %s -ac 1 -vn -acodec pcm_s16le -ar 16000 %s各参数含义-i %s输入 m4a 文件-ac 1强制单声道说话人识别通常使用单声道音频-vn丢弃视频流-acodec pcm_s16le编码为 16-bit 线性 PCM-ar 16000重采样到 16kHz与配置文件中的sr: 16000一致。在 PaddleSpeech 中这一步由 examples/voxceleb/sv0/local/convert.sh 自动化完成。该脚本的核心是信号量控制的并行转换默认开 32 个并发槽位N32对应 32 vCPU 环境可按机器核数调整遍历目录下所有*.m4a文件逐个执行ffmpeg -loglevel panic -i $f -ar 16000 ${f%.*}.wav转换完成后把所有 wav 文件统一放入名为wav的目录目录结构形如voxceleb2/wav/id00012/21Uxsk56VDQ/00001.wav即wav/说话人ID/视频ID/片段ID.wav的三级结构。数据脚本 examples/voxceleb/sv0/local/data.sh 的 stage 3 会调用convert.sh完成 m4a→wav 转换不删除原始 m4astage 4 再通过voxceleb2.py --generate从 wav 目录生成vox2/manifest.vox2清单文件由于 VoxCeleb2 全部用于训练所有数据汇总到一个 manifest 文件。补充原文档提到的 VoxCeleb1 数据下载同样由data.sh的 stage 1 完成voxceleb1.py --manifest_prefix ... --target_dir ...无需手动转换格式。四、sv0 与 sv1两条说话人验证路线examples/voxceleb/README.md 将 VoxCeleb 示例划分为两个子目录sv0speaker verification with softmax backend全 Python 实现使用 ECAPA-TDNN AAM-softmax 等损失函数端到端训练无需 Kaldi 依赖sv1dependence on kaldi基于plda/sc 后端的传统路线PLDA 概率线性判别分析 / score 归一化依赖 Kaldi 生态。从当前仓库结构看examples/voxceleb 目录下只保留了 sv0包含完整的run.sh、配置文件与local/脚本集因此本文后续将以 sv0 为主线展开实战讲解。五、sv0 实战ECAPA-TDNN 全流程sv0 的核心说明文档是 examples/voxceleb/sv0/README.md所有脚本统一由 examples/voxceleb/sv0/run.sh 编排。5.1 阶段划分stageStage功能0数据准备下载 VoxCeleb1、下载 VoxCeleb2、m4a 转 wav、生成 train/dev/test 的 manifest 文件、下载 RIR Noise 数据集并生成增强用噪声 manifest1训练模型2使用 VoxCeleb trial 评测说话人验证性能通过stage与stop_stage参数可以灵活控制执行范围例如# 只跑训练和评测stage 1、2 bash run.sh --stage 1 --stop_stage 2 # 只跑数据准备stage 0 bash run.sh --stage 0 --stop_stage 05.2 环境变量与本地变量执行任何脚本前必须先引入环境变量source path.sh source ${MAIN_ROOT}/utils/parse_options.sh其中 examples/voxceleb/sv0/path.sh 负责设置MAIN_ROOT指向 PaddleSpeech 仓库根目录realpath ${PWD}/../../../PATH加入仓库根目录与utils/PYTHONPATH加入仓库根目录保证能 importpaddlespeech包BIN_DIR指向paddlespeech/vector/exps/ecapa_tdnn即训练/测试/嵌入提取脚本所在目录。parse_options.sh提供了 shell 脚本中--variable value的参数解析能力。run.sh 中定义的本地变量包括变量含义默认值gpus使用的 GPU 编号置空则纯 CPU0,1,2,3stage起始阶段0stop_stage结束阶段50dir数据信息目录data/exp_dir实验输出目录exp/ecapa-tdnn-vox12-big/conf_path模型配置文件路径conf/ecapa_tdnn.yaml示例指定 GPU 启动完整流程bash run.sh --gpus 0,15.3 Stage 0数据准备if [ ${stage} -le 0 ] [ ${stop_stage} -ge 0 ]; then # prepare data bash ./local/data.sh ${dir} ${conf_path} || exit -1 fi也可以直接手动执行source path.sh bash ./local/data.sh ./data/ conf/ecapa_tdnn.yamldata.sh内部又细分了 8 个子阶段1~7核心动作包括voxceleb1.py下载 VoxCeleb1 并生成manifest.dev、manifest.testvoxceleb2.py --download下载 VoxCeleb2m4aconvert.sh将 m4a 批量转 wavvoxceleb2.py --generate生成vox2/manifest.vox2make_vox_csv_dataset_from_json.py将 json 格式 manifest 转成训练框架直接消费的 csvtrain.csv 由 vox1.dev vox2.vox2 合并dev/test 来自 vox1.testrir_noise.py下载 RIR Noise 增强数据并生成噪声 manifestmake_rirs_noise_csv_dataset_from_json.py生成noise.csv、rir.csv。处理完成后data/目录结构如下来自 examples/voxceleb/sv0/README.mddata/ ├── rir_noise │ ├── csv │ │ ├── noise.csv │ │ └── rir.csv │ ├── manifest.pointsource_noises │ ├── manifest.real_rirs_isotropic_noises │ └── manifest.simulated_rirs ├── vox │ ├── csv │ │ ├── dev.csv │ │ ├── enroll.csv │ │ ├── test.csv │ │ └── train.csv │ └── meta │ └── label2id.txt └── vox1 ├── list_test_all2.txt ├── list_test_all.txt ├── list_test_hard2.txt ├── list_test_hard.txt ├── manifest.dev ├── manifest.test ├── veri_test2.txt ├── veri_test.txt ├── voxceleb1.dev.meta └── voxceleb1.test.meta其中label2id.txt是说话人 ID 到训练标签的映射veri_test*.txt、list_test_*.txt就是上一节的评测协议文件。5.4 Stage 1模型训练if [ ${stage} -le 1 ] [ ${stop_stage} -ge 1 ]; then # train model, all ckpt under exp dir CUDA_VISIBLE_DEVICES${gpus} bash ./local/train.sh ${dir} ${exp_dir} ${conf_path} fi训练脚本 examples/voxceleb/sv0/local/train.sh 会根据CUDA_VISIBLE_DEVICES自动计算 GPU 数量多卡时使用 Paddle 分布式启动器python3 -m paddle.distributed.launch --gpus$CUDA_VISIBLE_DEVICES ${BIN_DIR}/train.py ...单卡/CPU 时直接运行${BIN_DIR}/train.py --device {gpu|cpu} --checkpoint-dir ${exp_dir} --data-dir ${dir} --config ${conf_path}。训练入口是 paddlespeech/vector/exps/ecapa_tdnn/train.py模型实现位于 paddlespeech/vector/models/ecapa_tdnn.py。训练产物model.pdparams及中间 checkpoint保存在exp_dir下。一条常用的命令组合纯 CPU 全流程source path.sh bash ./local/data.sh ./data/ conf/ecapa_tdnn.yaml CUDA_VISIBLE_DEVICES ./local/train.sh ./data/ exp/ecapa-tdnn-vox12-big/ conf/ecapa_tdnn.yaml5.5 Stage 2模型测试trial 评测if [ ${stage} -le 2 ] [ ${stop_stage} -ge 2 ]; then # test ckpt avg_n CUDA_VISIBLE_DEVICES0 bash ./local/test.sh ${dir} ${exp_dir} ${conf_path} || exit -1 fi测试脚本 examples/voxceleb/sv0/local/test.sh 调用${BIN_DIR}/test.py --data-dir ${dir} --load-checkpoint ${exp_dir} --config ${conf_path} --device ${device}即 paddlespeech/vector/exps/ecapa_tdnn/test.py。它会对verification_file指定的 trial 文件中的每个语音对提取嵌入向量使用余弦相似度计算得分run.sh注释说明当前测试仅支持 cosine 打分计算 EER 等指标输出。六、配置文件详解ecapa_tdnn.yamlsv0 提供两套配置分别是 examples/voxceleb/sv0/conf/ecapa_tdnn.yamlVoxCeleb12 联合训练7205 说话人与 examples/voxceleb/sv0/conf/ecapa_tdnn_small.yaml仅 VoxCeleb11211 说话人通道数减半为 512训练 100 轮。二者结构完全一致下面以主配置逐段解读。6.1 数据配置参数默认值说明augmentTrue是否启用 RIR/Noise 数据增强batch_size32训练 batch 大小num_workers2DataLoader 工作进程数num_speakers7205分类任务类别数 vox1(1211) vox2(5994)测试说话人 41 个不参与shuffleTrue是否打乱样本skip_prepFalse是否跳过数据预处理split_ratio0.9训练/验证集划分比例chunk_duration3.0每条训练语音随机截取 3 秒random_chunkTrue是否随机截取 chunkverification_filedata/vox1/veri_test2.txt评测用 trial 文件cleaned 版从 paddlespeech/vector/io/augment.py 等源码可以确认增强会利用 stage 0 生成的rir.csv、noise.csv对 3 秒 chunk 叠加真实房间冲击响应与背景噪声提升模型在真实场景的鲁棒性。6.2 特征提取配置# currently, we only support fbank sr: 16000 # sample rate n_mels: 80 window_size: 400 #25ms, sample rate 16000, 25 * 16000 / 1000 400 hop_size: 160 #10ms, sample rate 16000, 10 * 16000 / 1000 160当前实现仅支持 fbankfilterbank特征16kHz 采样率、80 维 mel 滤波器组、25ms 窗长400 采样点、10ms 帧移160 采样点。特征预处理与批处理逻辑可参考 paddlespeech/vector/io/dataset.py 与 paddlespeech/vector/io/batch.py。6.3 模型结构配置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 lin_neurons: 192这是ECAPA-TDNN的核心结构4 个 TDNN 卷积块通道数 1024卷积核 5/3/3/3膨胀率 1/2/3/4感受野逐层扩大第 5 层 3072 通道SE-Res2Block 聚合层kernel 1、dilation 1之后接 128 维注意力的 SE 模块最终通过统计池化meanstd得到句级表示再经全连接映射到 192 维说话人嵌入lin_neurons: 192RESULT.md 中标注的 dim 即此值。完整实现见 paddlespeech/vector/models/ecapa_tdnn.pyECAPA-TDNN 在 PaddleSpeech 中的网络主体与模块组装。6.4 训练超参数seed: 1986 # according from speechbrain configuration epochs: 10 save_interval: 10 log_interval: 10 learning_rate: 1e-8 max_lr: 1e-3 step_size: 140000训练 10 个 epochbig 配置每 10 步保存 checkpoint、打印日志使用循环学习率调度learning_rate为初始/最小学习率1e-8max_lr为峰值1e-3step_size: 140000为循环半周期步数。调度器实现可参考 paddlespeech/vector/training/scheduler.py。6.5 损失函数AAM-softmaxmargin: 0.2 scale: 30说话人识别本质是说话人 ID 分类 嵌入度量联合训练softmax 分类头配合margin0.2角度间隔、scale30特征缩放因子即AAM-softmaxAdditive Angular Margin Softmax损失。实现位于 paddlespeech/vector/modules/loss.py。正是通过这种带角度间隔的软间隔约束训练出的 192 维嵌入在余弦相似度度量下具备良好的区分性。6.6 测试与打分配置global_embedding_norm: True embedding_mean_norm: True embedding_std_norm: False推理阶段对嵌入做归一化处理相关工具函数见 paddlespeech/vector/io/embedding_norm.py。6.7 分数归一化s-normscore_norm: s-norm cohort_size: 20000 # amount of imposter utterances in normalization cohort n_train_snts: 400000 # used for normalization stats测试时启用s-normscore normalization用 20000 条冒名顶替imposter语音构成归一化群组利用 400000 条训练语音统计归一化参数对原始余弦得分做标准化以消除说话人/信道偏差从而降低 EER。七、预训练模型与嵌入提取仓库在 docs/source/released_model.md 中发布了 VoxCeleb 预训练模型examples/voxceleb/sv0/README.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.sh 两步 CUDA_VISIBLE_DEVICES bash ./local/test.sh ./data sv0_ecapa_tdnn_voxceleb12_ckpt_0_2_1/model/ conf/ecapa_tdnn.yaml注意上述下载地址为仓库 README 中原始给出的 CDN 链接实际使用请以 docs/source/released_model.md 当前发布信息为准。此外examples/voxceleb/sv0/local/emb.sh 提供了单条音频嵌入提取的入口调用 paddlespeech/vector/exps/ecapa_tdnn/extract_emb.pypython3 ${BIN_DIR}/extract_emb.py --device cpu \ --config conf/ecapa_tdnn.yaml \ --audio-path demo/voxceleb/00001.wav --load-checkpoint exp/ecapa-tdnn-vox12-big/该能力可直接用于构造注册/验证enroll/test打分流程或作为下游声纹应用如说话人聚类、说话人日志的特征前端。八、实验结果参考仓库 examples/voxceleb/sv0/RESULT.md 记录了发布模型的评测结果ModelNumber of ParamsReleaseConfigdimTest setCosineCosine S-NormECAPA-TDNN85M0.2.1conf/ecapa_tdnn.yaml192test0.81880.7815该表给出的 EER 为0.8188%纯余弦打分启用 s-norm 后降至0.7815%数值越小越好EER 为等错误率百分比。同时RESULT.md 中对照引用了 SpeechBrain 官方 recipe 在同一任务上的参考结果0.90% 无 s-norm / 0.80% 有 s-norm说明 PaddleSpeech 该实现达到同类开源工具的主流水平且 s-norm 带来的收益方向一致。注意这些对比数据来自仓库文档的转述如需复现请按上文流程使用同一配置与 trial 文件自行评测。九、小结与延伸阅读围绕 examples/voxceleb/README.md本文完整覆盖了VoxCeleb1/2 的数据特性与规模、VoxCeleb2 的 m4a→wav 转换、官方 trial 评测协议、sv0ECAPA-TDNN从数据准备到训练评测的全流程、核心配置参数逐项解读以及预训练模型与嵌入提取方法。相关源码均可从以下位置继续深入全流程编排examples/voxceleb/sv0/run.sh、examples/voxceleb/sv0/local/data.sh模型实现paddlespeech/vector/models/ecapa_tdnn.py训练/测试/嵌入脚本paddlespeech/vector/exps/ecapa_tdnn/train.py、paddlespeech/vector/exps/ecapa_tdnn/test.py、paddlespeech/vector/exps/ecapa_tdnn/extract_emb.py损失与调度paddlespeech/vector/modules/loss.py、paddlespeech/vector/training/scheduler.py数据脚本dataset/voxceleb/voxceleb1.py、dataset/voxceleb/voxceleb2.py结果与发布examples/voxceleb/sv0/RESULT.md、docs/source/released_model.md如果你需要的是传统 Kaldi 路线的 PLDA/SC 后端方案可关注仓库中 sv1 相关设计与 Kaldi 依赖的演进若要在实际系统中落地声纹注册、验证与说话人日志建议从extract_emb.py出发构建 enroll/test 打分服务。赞分享人工智能语音音频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媒体生成PaddleSpeech 说话人验证实战VoxCeleb 上 ECAPA-TDNN 的 EER 结果与 S-Norm 评分详解PaddleSpeech 说话人验证实战VoxCeleb 上 ECAPA TDNN 的 EER 结果与 S Norm 评分详解 本篇文章以 examples/人工智能语音音频NLP媒体生成SpeechBrain 说话人识别与验证实战基于 VoxCeleb 训练 X-Vector、ECAPA-TDNN 与 ResNet 嵌入SpeechBrain 说话人识别与验证实战基于 VoxCeleb 训练 X Vector、ECAPA TDNN 与 ResNet 嵌入 本篇技术指南以 Sp人工智能深度学习语音音频NLP预训练上一篇BootstrapBlazor中NavigateTo扩展方法失效问题解析下一篇PX4-Autopilot异常处理机制故障恢复与系统重启策略全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表