前言
本文章主要介绍如何快速使用声音分类框架训练和推理,本文将致力于最简单的方式去介绍使用,如果使用更进阶功能,还需要从源码去看文档。仅需三行代码即可实现训练和推理。
源码地址:https://github.com/yeyupiaoling/AudioClassification-Pytorch
安装环境
使用Anaconda,并创建了Python3.11的虚拟环境。
- 首先安装的是Pytorch 2.5.1 的GPU版本,如果已经安装过了,请跳过。
conda install pytorch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 pytorch-cuda=11.8 -c pytorch -c nvidia
- 使用pip安装声音分类macls库,命令如下:
python -m pip install macls -U -i https://pypi.tuna.tsinghua.edu.cn/simple
准备数据
博主提供了少量的数据集,下载地址,可以下载直接使用,或者参考格式生成自己的数据列表。
生成数据列表的代码如下,只需要准备数据文件夹格式为dataset/audio/各种声音列表的文件夹
,然后执行下面代码即可生成数据列表。
import os
from sklearn.model_selection import train_test_split
def create_list(audio_dir, list_dir):
f_list = open(os.path.join(list_dir, 'label_list.txt'), 'w', encoding='utf-8')
f_train = open(os.path.join(list_dir, 'train_list.txt'), 'w', encoding='utf-8')
f_test = open(os.path.join(list_dir, 'test_list.txt'), 'w', encoding='utf-8')
audio_list = []
for i, name in enumerate(os.listdir(audio_dir)):
f_list.write(name + '\n')
animal_dir = os.path.join(audio_dir, name)
for file in os.listdir(animal_dir):
if not file.endswith('.wav'):
continue
audio_path = os.path.join(animal_dir, file).replace('\\', '/')
audio_list.append(f"{audio_path}\t{i}\n")
train_list, test_list = train_test_split(audio_list, test_size=0.1, random_state=42)
for line in train_list:
f_train.write(line)
for line in test_list:
f_test.write(line)
if __name__ == '__main__':
create_list(audio_dir='dataset/audio', list_dir="dataset/")
训练
使用该框架训练非常简单,核心代码就3行,如下,configs参数可以指定使用的默认配置文件。
from macls.trainer import MAClsTrainer
# 获取训练器
trainer = MAClsTrainer(configs="cam++", use_gpu=True)
trainer.train(save_model_path="models/")
输出信息如下:
2025-03-08 11:59:19.801 | INFO | macls.optimizer:build_optimizer:16 - 成功创建优化方法:Adam,参数为:{'lr': 0.001, 'weight_decay': 1e-05}
2025-03-08 11:59:19.801 | INFO | macls.optimizer:build_lr_scheduler:31 - 成功创建学习率衰减:WarmupCosineSchedulerLR,参数为:{'min_lr': 1e-05, 'max_lr': 0.001, 'warmup_epoch': 5, 'fix_epoch': 60, 'step_per_epoch': 1}
2025-03-08 11:59:20.414 | INFO | macls.utils.checkpoint:load_model:85 - 成功恢复模型参数和优化方法参数:models/CAMPPlus_Fbank\last_model
2025-03-08 11:59:20.417 | INFO | macls.trainer:train:334 - 训练数据:70
执行评估: 0%| | 0/1 [00:00<?, ?it/s]2025-03-08 11:59:31.553 | INFO | macls.trainer:__train_epoch:277 - Train epoch: [31/60], batch: [1/1], loss: 0.05312, accuracy: 0.96875, learning rate: 0.00057545, speed: 0.72 data/sec, eta: 0:05:22
2025-03-08 11:59:31.556 | INFO | macls.trainer:train:356 - ======================================================================
执行评估: 100%|██████████| 1/1 [00:01<00:00, 1.22s/it]
2025-03-08 11:59:32.786 | INFO | macls.trainer:train:358 - Test epoch: 31, time/epoch: 0:00:12.367833, loss: 0.00298, accuracy: 1.00000
2025-03-08 11:59:32.786 | INFO | macls.trainer:train:360 - ======================================================================
推理
执行推理也非常简单,如下:
from macls.predict import MAClsPredictor
# 获取识别器
predictor = MAClsPredictor(configs="cam++",
model_path='models/CAMPPlus_Fbank/best_model/',
use_gpu=True,
log_level="ERROR")
audio_path = "dataset/cat.wav"
label, score = predictor.predict(audio_data=audio_path)
print(f'预测结果标签为:{label},得分:{score}')
输出信息如下:
预测结果标签为:cat,得分:0.99957
结语
该框架提供了多种声音分类模型,如EcapaTdnn、PANNS、ResNetSE、CAMPPlus和ERes2Net,以支持不同的应用场景。