基于深度学习的 Python 音频特征提取与分类实战
引言
在早期的音频处理任务中,我们通常依赖人工设计的特征(如 MFCC、频谱质心等)结合传统机器学习算法进行分类。然而,随着深度学习技术的普及,端到端的特征学习方法逐渐展现出更强的泛化能力和更高的准确率。本文介绍了一种使用预训练音频编码器结合全连接神经网络进行音频特征提取与流派分类的完整流程。
数据集说明
本教程使用的数据集来源于 Kaggle 音乐流派分类竞赛数据,包含多种音乐风格,如蓝调(Blues)、古典(Classical)、乡村(Country)、迪斯科(Disco)、嘻哈(HipHop)、爵士(Jazz)、金属(Metal)、流行(Pop)、雷鬼(Reggae)和摇滚(Rock)。
数据目录结构如下:
./genres/
├── blues/
│ ├── blues.00043.au
│ └── ...
├── classical/
└── ...
每个子文件夹代表一个类别,内部存放对应的音频文件。相比传统方法需要手动筛选特征,深度学习模型能够自动从原始波形或频谱中学习高维抽象特征。
音频特征提取
我们采用了一个预训练的音频编码器模型 teticio/audio-encoder。该模型能够将音频文件编码为 100 维的特征向量。这种嵌入表示(Embedding)捕捉了音频的语义信息,比手工特征更具鲁棒性。
加载编码器
首先导入必要的库并初始化编码器。
from audiodiffusion.audio_encoder import AudioEncoder
import numpy as np
# 加载预训练模型
audio_encoder = AudioEncoder.from_pretrained("teticio/audio-encoder")
# 测试单个文件编码
sample_audio = "./genres/blues/blues.00043.au"
encoded_vector = audio_encoder.encode([sample_audio]).numpy()[0].tolist()
print(f"特征维度:{len(encoded_vector)}")
输出显示音频被成功转换为 100 维浮点数向量。这一过程将不同长度的音频统一映射到固定长度的空间,便于后续模型处理。
批量数据处理
为了构建完整的训练集,我们需要遍历所有类别文件夹,提取特征并生成标签。
import os
from sklearn.preprocessing import StandardScaler
from keras.utils import to_categorical
# 定义类别列表
genres = 'blues classical country disco hiphop jazz metal pop reggae rock'.split()
# 建立标签映射
label2id = {genre: i for i, genre in (genres)}
id2label = {i: genre i, genre (genres)}
()
data_set = []
label_set = []
g genres:
folder_path =
os.path.exists(folder_path):
()
filename os.listdir(folder_path):
filename.endswith((, , )):
songname = os.path.join(folder_path, filename)
:
vec = audio_encoder.encode([songname]).numpy()[].tolist()
data_set.append(vec)
label_set.append(label2id[g])
Exception e:
()
()


