使用scikit-learn进行音乐分类
之前简要说了下Yaafe和Essentia的安装使用,自己也专门对这两个框架做了封装,实现了各个特征提取的接口,并将特征值存到本地文件中方便训练时使用。下面这张图是对应提取的特征数据,一共35种特征,每种特征维度不一样。例如MFCC最大值维度为13维。
这里的音乐分类主要是按情感进行分类,一共分成7种情感:happy,sad,passion,excited,quiet,nostalgic,relax。
一、得到训练数据
def getTrainData(train_path, train_mode, mode_name, featureList):
num = []
train_data = []
train_target = []
introFeature = []
for i in range(len(train_mode)):
allFeature = []
# print len(train_mode),len(train_path),i,train_path[0],train_path[1]
# print tool.getFileNum(train_path[i])
num.append(tool.getFileNum(train_path[i]))
for j in tool.getAllFile(train_path[i]):
yl.startEngine(j)
el.startLoader(j)
oneFeature, introFeature = getFeature(yl, el, featureList)
allFeature.append(oneFeature)
# print allFeature
# 判断是否有歌曲的特征被提取出
if len(allFeature) == 0:
print '无音频文件'
else:
wf.setMode(train_mode[i]) # 设置类别和目录.输出
wf.setFeaturePrintPath(train_path[i]) # 音乐目录/feature_num/train_mode[i].txt readme.txt
wf.writeFeature(allFeature, introFeature)
tool.mkdir('dataSystem/' + mode_name)
wf.writeDetial('dataSystem/' + mode_name + '/feature.txt', featureList)
for singleFeature in allFeature:
train_data.append(singleFeature) # 设置训练数据
train_target.append(i) # 设置训练目标
return train_data, train_target
train_path和train_mode分别表示传入的一类音乐文件夹路径,该类别标签,例如train_path=‘/home/chenming/M