前言¶
本文章主要介紹如何快速使用聲音分類框架訓練和推理,本文將致力於最簡單的方式去介紹使用,如果使用更進階功能,還需要從源碼去看文檔。僅需三行代碼即可實現訓練和推理。
源碼地址: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,以支持不同的應用場景。