☰
PaddleSpeech TESS 音频情绪分类实战:基于 PANNs CNN14 微调与 paddle.audio 特征/后端模块验证
2026/9/25 13:24:35 网站建设 项目流程
  • 人工智能
  • 语音
  • 音频

【免费下载链接】PaddleSpeech

Easy-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/gh_mirrors/pa/PaddleSpeech
点击查看免费下载

TESS(Toronto Emotional Speech Set)音频情绪分类是 PaddleSpeech 仓库中的经典入门示例,其核心目的有两个:一是演示如何基于 PANNs(PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition,基于 AudioSet 预训练)的 CNN14 模型进行 7 分类情绪识别微调;二是借这一任务系统性地校验 paddle.audio 的 feature、backend 等底层音频模块。读完本文,你将掌握 PaddleSpeech 中从数据加载、特征提取、模型微调到 5-fold 评估的完整训练流程,并理解四个特征配置(mfcc / logmelspectrogram / melspectrogram / spectrogram)的差异与调参要点。

背景与实验定位

本实验对应仓库路径 examples/tess,采用 PaddleSpeech 提供的 PANNs CNN14 预训练模型在 TESS 数据集上进行 finetune,完成音频情绪分类(Audio Classification)任务。从目录结构看,这是一个独立的 cls 示例工程:

examples/tess/ ├── README.md # 实验说明(本文主体) └── cls0/ ├── conf/ # 4 套特征配置 yaml ├── local/ # train.py / train.sh 等训练脚本 ├── path.sh # 环境变量与路径配置 └── run.sh # 多 stage 入口脚本

需要特别说明的是:本实验同时承担着校验与测试paddle.audio的 feature、backend 等模块的任务。训练脚本中显式执行了paddle.audio.backends.set_backend('soundfile')(见 train.py),并依赖paddle.audio.datasets:TESS数据集类完成数据下载、5-fold 划分与在线特征提取,是理解 PaddleSpeech 音频工具链的典型入口。

数据集:TESS 情绪语音集

TESS(Toronto emotional speech set)是一个面向情绪识别研究的英文语音数据集,包含200 个目标词,每个词的语音时长为2~3 秒,由两位女演员(24 岁与 64 岁)录制,覆盖7 种情绪:愤怒(angry)、恶心(disgust)、害怕(fear)、高兴(happy)、惊喜(pleasant surprise)、伤心(sad)、平淡(neutral),总计 2800 条语音刺激。

在 PaddleSpeech 中,该数据集被封装为paddle.audio.datasets:TESS,实现在 audio/paddleaudio/datasets/tess.py。从源码可以确认以下关键实现事实:

  • 自动下载与解压:首次使用时若本地不存在数据,会自动从对象存储下载TESS_Toronto_emotional_speech_set.zip(md5 校验值1465311b24d1de704c4c63e4ccc470c7)并解压到DATA_HOME目录;
  • 7 类标签顺序:label_list = ['angry', 'disgust', 'fear', 'happy', 'neutral', 'ps', 'sad'],其中ps表示 pleasant surprise;
  • 文件名即元信息:音频文件名格式为speaker_word_emotion,通过_get_meta_info解析出说话人、目标词与情绪三类元信息;
  • 5-fold 划分机制:构造函数接收mode(train/dev)、n_folds(默认 5)、split(指定 dev 所在的 fold,默认 1)与seed(默认 0,用于先打乱样本再切分),mode='train'取除 split 之外的所有 fold,mode='dev'仅取 split 指定的 fold。训练与 dev 使用相同 seed 保证划分一致。

模型:PANNs CNN14 与 SoundClassifier 分类头

PANNs 是基于 AudioSet 大规模数据集训练的声音分类/识别模型,预训练后可以用于提取音频的 embedding。本示例使用其 CNN14 结构进行迁移学习:

  • CNN14 主要由12 个卷积层 + 2 个全连接层构成,具体为 6 个卷积块(ConvBlock),每块含 2 个 3×3 卷积,通道数依次为 64 → 128 → 256 → 512 → 1024 → 2048;
  • 模型参数量约79.6M;
  • embedding 维度为 2048。

对应实现位于 paddlespeech/cls/models/panns/panns.py。源码层面可以补充的细节:

  • 每个卷积块后使用平均池化(pool_type='avg',前五块pool_size=(2, 2),最后一块(1, 1)),并在各块间施加p=0.2的 dropout;
  • 全局特征聚合采用mean(axis=3)后叠加max + mean的时序池化策略,再经fc1投影到 2048 维 embedding;
  • extract_embedding=True时输出 embedding(供下游分类头使用),否则走fc_audioset输出 AudioSet 的 527 类 sigmoid 预测;
  • 模型类属性emb_size = 2048,供分类头直接读取输入维度。

微调时,train.py 以backbone_class(pretrained=True, extract_embedding=True)实例化 CNN14,再包一层SoundClassifier(见 paddlespeech/cls/models/panns/classifier.py):backbone 输出经nn.Dropout(0.1)后接一个nn.Linear(2048, num_class)全连接层,映射到 7 个情绪类别,交叉熵损失 + Adam 优化器端到端微调。

模型指标:5-fold 微调 dev 准确率

根据 TESS 提供的 fold 信息,对数据集进行5-fold的 fine-tune 训练与评估,不同特征类型的 dev 准确率对比如下(来自 examples/tess/README.md):

| Model | feat_type | Acc | note | |--|--|--| -- | | CNN14 | mfcc | 0.9929 | 3 epoch | | CNN14 | logmelspectrogram | 0.9983 | 3 epoch | | CNN14 | spectrogram | 0.95 | 11 epoch | | CNN14 | melspectrogram | 0.9375 | 17 epoch |

从表中可以观察到两个重要结论:其一,CNN14 在本任务上整体准确率都很高(0.94 以上),说明 AudioSet 预训练 embedding 对情绪分类具有很强的可迁移性;其二,不同特征在收敛速度与最终精度上存在差异——logmelspectrogram 以 3 epoch 取得 0.9983 的 dev 准确率,是该任务上效果最好且收敛最快的特征组合。需注意表格中的 epoch 数来自 README 记录的历史实验配置,仓库内当前配置文件的 epochs 值(见下节)与之不完全一致,实际复现时应以配置文件为准。

快速开始:run.sh 四阶段脚本

训练入口为 examples/tess/cls0/run.sh,通过 stage 参数控制流程,支持 4 个阶段:

| stage | 功能 | 参数 | |--|--|--| | 1 | 训练(train) |./run.sh 1 <conf.yaml>| | 2 | 推理(infer) |./run.sh 2 <conf.yaml>| | 3 | 模型导出(export) |./run.sh 3 <ckpt> <output_dir>| | 4 | 静态模型推理(static_model_infer) |./run.sh 4 <infer_device> <graph_dir> <audio_file>|

原文档给出的训练启动命令(需先在examples/tess/cls0目录下执行):

$ CUDA_VISIBLE_DEVICES=0 ./run.sh 1 conf/panns_mfcc.yaml $ CUDA_VISIBLE_DEVICES=0 ./run.sh 1 conf/panns_logmelspectrogram.yaml $ CUDA_VISIBLE_DEVICES=0 ./run.sh 1 conf/panns_melspectrogram.yaml $ CUDA_VISIBLE_DEVICES=0 ./run.sh 1 conf/panns_spectrogram.yaml

脚本会先source path.sh加载环境:path.sh将仓库根目录及其utils目录加入PATH与PYTHONPATH,并把MODEL=panns对应的paddlespeech/cls/exps/panns目录设为BIN_DIR;同时设置LC_ALL=C、PYTHONIOENCODING=UTF-8以避免中文环境下的解码问题。

GPU 数量由CUDA_VISIBLE_DEVICES环境变量自动推断(ngpu=$(echo $CUDA_VISIBLE_DEVICES | awk -F "," '{print NF}')):当ngpu > 0时,train.sh 通过python3 -m paddle.distributed.launch --gpus $CUDA_VISIBLE_DEVICES local/train.py启动分布式多卡训练;否则直接单进程运行python3 local/train.py(见 train.sh)。

配置文件详解:四种特征方案

四个配置文件共享同一套结构,差异仅在feature段的特征类型与关键参数。以 panns_mfcc.yaml 为例,完整配置如下:

data: dataset: 'paddle.audio.datasets:TESS' num_classes: 7 train: mode: 'train' split: 1 feat_type: 'mfcc' dev: mode: 'dev' split: 1 feat_type: 'mfcc' model: backbone: 'paddlespeech.cls.models:cnn14' feature: n_fft: 1024 hop_length: 320 window: 'hann' win_length: 1024 f_min: 50.0 f_max: 14000.0 n_mfcc: 64 n_mels: 64 training: epochs: 5 learning_rate: 0.0005 num_workers: 2 batch_size: 128 checkpoint_dir: './checkpoint_mfcc' save_freq: 1 log_freq: 1

四个配置的要点对比:

| 配置项 | panns_mfcc | panns_logmelspectrogram | panns_melspectrogram | panns_spectrogram | |--|--|--|--|--| | feat_type | mfcc | logmelspectrogram | melspectrogram | spectrogram | | n_fft | 1024 | 1024 | 1024 |126| | hop_length | 320 | 320 | 320 | 320 | | window | hann | hann | hann | hann | | win_length | 1024 | 1024 | 1024 | — | | f_min / f_max | 50.0 / 14000.0 | 50.0 / 14000.0 | 50.0 / 14000.0 | — | | n_mfcc / n_mels | 64 / 64 | — / 64 | — / 64 | — | | epochs | 5 | 5 | 10 | 10 |

对参数的源码级解读:

  • dataset: 'paddle.audio.datasets:TESS'与backbone: 'paddlespeech.cls.models:cnn14'采用dynamic_import字符串寻址机制(见 paddlespeech/utils/dynamic_import.py),训练脚本据此动态加载数据集类与模型类,无需修改代码即可切换组件;
  • split: 1对应 5-fold 中的第 1 折作为 dev,其余 4 折用于训练;可通过更换 split 值或 n_folds 参数做交叉验证;
  • n_fft / hop_length / win_length / window是 STFT 参数:1024 点 FFT、320 点 hop、hann 窗。spectrogram 配置的n_fft: 126明显小于其他方案,对应更短的频谱帧,这也解释了其需要更多 epoch(README 记录为 11 epoch)才能达到 0.95 的准确率;
  • f_min / f_max为 mel 滤波器组的频率范围(50 Hz~14 kHz),仅对 mfcc / mel 类特征生效;
  • n_mels: 64同时是 mel 滤波器组数量和 CNN14 输入通道数——从源码可见 CNN14 第一层bn0 = BatchNorm2D(64)、conv_block1输入通道为 1(即 mel 频谱的 64 个频带经 unsqueeze 后作为单通道输入);
  • n_mfcc: 64指定 mfcc 的倒谱系数个数;四个配置均把特征维数对齐到 64,保证与预训练模型输入分布一致;
  • training段:统一使用learning_rate: 0.0005、batch_size: 128、num_workers: 2,checkpoint_dir按特征类型区分(如./checkpoint_mfcc),save_freq: 1表示每个 epoch 保存一次 checkpoint,log_freq: 1表示每个 batch 打印一次训练日志。

训练实现解析:从数据加载到评估

train.py 是完整的主训练脚本,其核心流程与 paddle.audio / paddle 生态的对接点包括:

  1. 后端设置:paddle.audio.backends.set_backend('soundfile')指定音频解码后端(需保证 paddleaudio 版本 >= 1.0.2),这是本实验校验 backend 模块的关键一步;
  2. 数据集与特征:数据集类在构造时即按feat_type在线提取特征(mfcc / logmelspectrogram / melspectrogram / spectrogram),feat_conf中的 STFT 与 mel 参数直接透传给数据类;
  3. 变长 batch 处理:_collate_features将(n_mels, length)的特征转置为(length, n_mels),按最长样本 pad 到相同长度,返回(feats, labels, lengths)三元组,供模型按(N, length, n_mels)输入;
  4. 分布式采样:使用paddle.io.DistributedBatchSampler(shuffle=True, drop_last=False)构造 train_loader,多卡场景下paddle.distributed.init_parallel_env()初始化并行环境,模型经paddle.DataParallel包装;
  5. 训练循环:Adam(lr=0.0005)+ CrossEntropyLoss,每个 batch 计算logits -> loss -> backward -> step,并累计acc = num_corrects / num_samples,按log_freq输出 loss、acc、lr 与 step/sec、ETA;
  6. 周期评估与保存:每个save_freq的 epoch 结束时在 dev 集上评估并打印dev_acc,随后将模型参数与优化器状态分别保存为model.pdparams/model.pdopt到checkpoint_dir/epoch_{n}/目录。

小结

TESS 示例以极小的数据集(2800 条、2~3 秒语音)完整走通了 PaddleSpeech 音频分类的"数据下载 → 特征提取 → 预训练模型微调 → 5-fold 评估"全链路,既是 PANNs CNN14 迁移学习的低成本验证平台,也是 paddle.audio 特征与后端模块的回归测试载体。若要在实际项目中使用,可直接复用 examples/tess/cls0 的脚本与配置结构,将dataset替换为 paddle.audio 支持的其他分类数据集(如 ESC-50、GTZAN 等),并参考 paddlespeech/cls 目录下 exp 与 models 的组织方式扩展自己的分类任务。

  • 人工智能
  • 语音
  • 音频

【免费下载链接】PaddleSpeech

Easy-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/gh_mirrors/pa/PaddleSpeech
点击查看免费下载

相关推荐

上一篇:完整指南:mermaid-ascii Diagram 接口设计深析——Parse/Render/Type 三方法如何搞定终端绘图
下一篇:如何轻松下载快手无水印视频:面向新手的完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询