目录
一、论文基础信息
二、研究背景与现存模型痛点
三、CAM++ 整体架构设计
四、实验设置
五、实验结果与分析
六、论文四大核心创新点
七、CAM++ 为什么现在这么流行?
八、全文结论
九、代码测试
一、论文基础信息
论文标题:CAM++: A Fast and Efficient Network for Speaker Verification Using Context-Aware Masking
发表来源:https://arxiv.org/pdf/2303.00332(2023.6,阿里达摩院 Speech Lab)
任务:文本无关说话人确认(Speaker Verification, SV)
核心目标:解决主流高精度声纹模型精度与推理效率无法兼顾的痛点,设计一款同时具备高识别精度、低参数量、低计算量、超快推理速度的声纹嵌入提取网络;代码开源至阿里 3D-Speaker 仓库(GitHub - modelscope/3D-Speaker: A Repository for Single- and Multi-modal Speaker Verification, Speaker Recognition and Speaker Diarization · GitHub)。
CAM++说话人确认-中文-通用-200k-Spkrs
二、研究背景与现存模型痛点
1. 说话人确认基础流程
系统分为两大模块:①嵌入提取器:将不定长语音转为固定维度说话人特征向量;②后端打分模块:计算两段语音嵌入的相似度判断是否为同一人。
2. 现有主流模型优缺点
- TDNN/xvector:一维时序空洞卷积,推理高效,但识别精度偏低;
- ECAPA-TDNN:融合 Res2Block、SE 通道注意力,曾是 SOTA 精度,但参数量高达 14.66M、浮点运算量大,推理速度慢,不适合嵌入式、高并发低算力场景;
- ResNet34:时频二维卷积残差网络,精度优秀,但 FLOPs 极高,内存访问开销大,推理延迟高;
- 原始 D-TDNN:借鉴 DenseNet 稠密连接机制,相比原生 TDNN 参数更轻量化,但精度和 ECAPA/ResNet 存在明显差距;
- 初代 CAM 模块:给 D-TDNN 增加上下文掩码,可抑制噪声、聚焦目标说话人,但仅在每个 Dense Block 末尾部署,掩码层数不足;且仅使用全局池化生成上下文向量,丢失语音分段局部特征,掩码预测精度有限。
3. 待解决核心问题
现有高精度模型计算成本高、推理慢;轻量化模型精度不足,行业缺少精度、参数量、计算开销、实时性四者兼顾的声纹网络。
三、CAM++ 整体架构设计
整体分为两大核心组件:2D 卷积前端模块 FCM+深度窄通道 D-TDNN 骨干网络;每一层 D-TDNN 内部嵌入轻量化、多粒度池化改进的 CAM 注意力掩码模块。
3.1 前端卷积模块 FCM(2D 残差卷积)
- 结构:4 个残差卷积块,所有块通道统一为 32;后 3 个残差块在频域维度设置步长 2,实现频域 8 倍下采样;
- 设计动机:原生 TDNN 仅做时序一维卷积,难以捕捉局部频域细微说话人特征;本文 D-TDNN 采用窄通道设计,频域建模能力进一步削弱;
- 作用:提取高分辨率时频联合特征,增强模型对频域偏移、说话人发音差异的鲁棒性,弥补窄通道骨干的建模短板;
- 输出处理:将特征图沿通道、频域维度展平,送入 D-TDNN 骨干。
3.2 深度窄通道 D-TDNN 骨干(核心改进)
基于原始 D-TDNN 深度不足、通道过宽的缺陷做针对性重构,依据结论:说话人验证任务中,加深网络带来的精度提升远大于加宽通道。
- 原版 D-TDNN:2 个 Dense Block(6 层 + 12 层),特征增长系数 k=64;
- 本文改进方案:
- 增加至 3 个 Dense Block,每层数量扩充为 12、24、16,大幅提升网络深度;
- 收窄通道,增长系数 k 从 64 降至 32,控制整体参数量;
- 在 D-TDNN 最前端增加 1/2 下采样 TDNN 层,降低时序维度、加速计算;
- 稠密连接机制:每层输出拼接所有前置层特征,提升参数利用率;
- 关键升级:将轻量化 CAM 掩码嵌入每一层 D-TDNN 内部(初代 CAM 仅 Block 末尾使用),全网络逐层过滤噪声、强化目标说话人特征。
3.3 改进型上下文感知掩码 CAM(核心创新:多粒度池化)
初代 CAM 仅采用全局平均池化,丢失语音分段局部时序特征,掩码预测不够精准;本文设计全局池化 (GP)+ 分段池化 (SP) 融合的多粒度方案,同时完成轻量化优化。
- 前向流程:D-TDNN 内置 FNN 输出特征 X → TDNN 提取局部时序特征 F;
- 双粒度上下文向量生成:
- 全局池化 GP:对整段语音求均值,得到全局说话人表征eg;
- 分段池化 SP:将语音切分为固定 100 帧片段,每段单独均值池化,得到分段局部表征es;
- 掩码生成:融合eg与es,经两层全连接 + Sigmoid 输出逐帧掩码 M;
- 特征校准:掩码 M 与原始时序特征逐元素相乘,抑制无关噪声、放大目标说话人声纹信息;
- 轻量化优势:相比初代 CAM 参数量大幅降低,每层部署几乎无额外计算开销,且融合分段池化不会新增参数。
四、实验设置
4.1 数据集
- VoxCeleb(英文公开集):VoxCeleb2 开发集训练(5994 位说话人);测试集为 Vox1-O / Vox1-E / Vox1-H;
- CN-Celeb(中文公开集):CN-Celeb1+2 开发集联合训练(2785 位中文说话人);训练时将短语音拼接至 6 秒以上;注册集多条语音取平均嵌入完成评测。
4.2 训练配置
- 输入特征:80 维 Fbank,25ms 帧长、10ms 帧移;
- 数据增强:语速扰动(0.9/1.0/1.1 倍速)、RIR 混响模拟、MUSAN 噪声叠加;
- 损失函数:AAM-Softmax,margin=0.2,scale=32;
- 优化策略:SGD 优化器,线性预热 + 余弦退火学习率(0.1~1e-4),动量 0.9,权重衰减 1e-4;训练时随机截取 3 秒语音构建批次;
- 评测指标:EER(等错误率,越低性能越好)、MinDCF(最小检测代价);后端采用余弦相似度打分,无分数归一化。
五、实验结果与分析
5.1 整体精度对比(Table 1)
模型 | 参数(M) | VoxCeleb-O EER | CN-Celeb EER |
TDNN | 4.62 | 2.31% | 9.86% |
D-TDNN | 2.85 | 1.55% | 8.41% |
ECAPA | 14.66 | 0.89% | 7.45% |
CAM++ | 7.18 | 0.73% | 6.78% |
基线模型:TDNN、ECAPA-TDNN、ResNet34、原始 D-TDNN、加深无掩码 D-TDNN-L
- CAM++ 全面超越所有主流基线:
- VoxCeleb1-O:EER=0.973%,优于 ECAPA (0.89%)、ResNet34 (0.97%);
- CN-Celeb 中文测试集:EER=6.78%,优于 ECAPA (7.45%)、ResNet34 (6.97%);
- 参数效率优势:CAM++ 仅 7.18M 参数,ECAPA 高达 14.66M,参数减半同时 Vox-O 数据集 EER 相对降低 18%;
- 消融实验验证模块有效性:
- 移除 CAM 掩码:Vox-O EER 升至 0.93%,CN 升至 7.16%;多粒度掩码可使 Vox-O 相对 EER 下降 21%,中文集下降 5%;
- 移除 FCM 2D 卷积前端:全数据集 EER 显著上升,证明时频二维卷积是窄通道 D-TDNN 的必要补充。
5.2 多粒度池化消融实验(Table 2)
以原始 D-TDNN 为基线,对比初代 CAM、单全局池化 CAM、全局 + 分段融合 CAM:
- 初代 CAM:EER 小幅下降,但参数量上涨 44%,参数效率差;
- 仅全局池化 (GP) 改进 CAM:仅增加 8% 参数,精度与初代 CAM 持平;
- GP + 分段 SP 融合:无任何新增参数,CN-Celeb EER 进一步下降,证明分段局部时序信息可显著提升掩码精准度。
5.3 模型复杂度与推理速度分析(Table 3,CPU 单线程测试)
模型 | 参数量 (M) | 总浮点运算 FLOPs (G) | 实时因子 RTF(越小推理越快) |
ECAPA-TDNN | 14.66 | 3.96 | 0.033 |
ResNet34 | 6.70 | 6.84 | 0.032 |
CAM++ | 7.18 | 1.72 | 0.013 |
核心结论:
- CAM++ 浮点运算量仅为 ECAPA 的 1/2、ResNet34 的 1/4;
- 推理速度是 ECAPA、ResNet 的 2 倍以上;
- ResNet 参数量略低,但 FLOPs 极高、内存读写开销大,实际推理延迟更高。
六、论文四大核心创新点
- 深度窄通道 D-TDNN 骨干:遵循 “深度收益大于通道宽度” 结论,大幅加深网络同时收窄通道控制参数量;将 CAM 掩码嵌入每一层 D-TDNN,区别于初代仅在 Block 末尾使用。
- 多粒度池化轻量化 CAM 掩码(Context-Aware Masking):融合全局整段语音表征与分段局部时序表征,解决单一全局池化丢失局部特征的缺陷,掩码预测更精准,且几乎无额外计算开销。
- 2D 残差卷积前端(Front-end Convolution Module) FCM:弥补一维 TDNN 频域建模短板,增强模型对频域偏移、发音差异的鲁棒性,适配窄通道骨干网络。
- 精度与效率双向最优:在中英文两大权威说话人数据集上达到 SOTA 识别精度,同时参数量、计算量、推理速度全面优于 ECAPA-TDNN、ResNet34,适配嵌入式、高并发、低算力工业场景。
七、CAM++ 为什么现在这么流行?
CAM++ 成为很多工业级说话人验证系统默认选择,主要原因包括:
- 精度高:在 VoxCeleb、CN-Celeb 等公开数据集上优于 ECAPA-TDNN。
- 计算效率高:参数和 FLOPs 明显低于 ECAPA,更适合 CPU 和边缘设备部署。
- 实时性强:推理速度快,适用于门禁、会议系统、客服、IoT 等实时应用。
- 结构易扩展:保留 TDNN 主干,只增加轻量模块,便于与现有系统集成。
八、全文结论
本文提出 CAM++ 轻量化高效声纹嵌入网络,通过改进 D-TDNN 骨干、多粒度池化上下文掩码、2D 时频卷积前端三大创新模块,在 VoxCeleb、CN-Celeb 标准说话人确认测试集上取得最优识别性能;相比 ECAPA-TDNN、ResNet34 等主流高精度模型,参数量、浮点运算量大幅降低,推理速度提升 2 倍以上,可广泛部署于资源受限、高实时性要求的语音业务场景,相关代码已开源。
九、代码测试
from modelscope.pipelines import pipeline sv_pipeline = pipeline( task='speaker-verification', model='iic/speech_campplus_sv_zh-cn_16k-common', model_revision='v1.0.0' ) speaker1_a_wav = 'https://modelscope.cn/api/v1/models/damo/speech_campplus_sv_zh-cn_16k-common/repo?Revision=master&FilePath=examples/speaker1_a_cn_16k.wav' speaker1_b_wav = 'https://modelscope.cn/api/v1/models/damo/speech_campplus_sv_zh-cn_16k-common/repo?Revision=master&FilePath=examples/speaker1_b_cn_16k.wav' speaker2_a_wav = 'https://modelscope.cn/api/v1/models/damo/speech_campplus_sv_zh-cn_16k-common/repo?Revision=master&FilePath=examples/speaker2_a_cn_16k.wav' # 相同说话人语音 result = sv_pipeline([speaker1_a_wav, speaker1_b_wav]) print(result) # 不同说话人语音 result = sv_pipeline([speaker1_a_wav, speaker2_a_wav]) print(result) # 可以自定义得分阈值来进行识别,阈值越高,判定为同一人的条件越严格 result = sv_pipeline([speaker1_a_wav, speaker2_a_wav], thr=0.31) print(result) # 可以传入output_emb参数,输出结果中就会包含提取到的说话人embedding result = sv_pipeline([speaker1_a_wav, speaker2_a_wav], output_emb=True) print(result['embs'], result['outputs']) # 可以传入save_dir参数,提取到的说话人embedding会存储在save_dir目录中 result = sv_pipeline([speaker1_a_wav, speaker2_a_wav], save_dir='savePath/')