1 #利用knn算法分类音乐,将音乐进行情绪分类 2 #将音乐分为兴奋的(excited), 愤怒的(angry),悲伤的(sorrowful),轻松的(relaxed) 3 4 #可分离因素 5 # mfcc 6 7 import numpy as np 8 from matplotlib import pyplot as plt 9 from scipy import io as spio 10 from sklearn.decomposition import pca 11 from sklearn.preprocessing import StandardScaler 12 import librosa 13 import librosa.display 14 from mutagen.mp3 import MP3 15 import numpy as np 16 import os 17 18 def getFeature(path): 19 y, sr = librosa.load(path) 20 21 mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=40) 22 mfccNew = np.ravel(mfccs[:, :1000]) 23 return mfccNew 24 25 def loadDataSet(): 26 #歌曲的数量 27 dataSet = np.zeros((40, 40000)) 28 labels = [] 29 30 excited = r‘./musicF/excited‘ 31 angry = r‘./musicF/angry‘ 32 sorrowful = r‘./musicF/sorrowful‘ 33 relaxed = r‘./musicF/relaxed‘ 34 35 filenames = os.listdir(excited) 36 i = 0 37 for filename in filenames: 38 print(filename) 39 dataSet[i] = getFeature(excited + ‘/‘ + filename) 40 labels.append(‘excited‘) 41 i += 1 42 43 filenames = os.listdir(angry) 44 for filename in filenames: 45 print(filename) 46 dataSet[i] = getFeature(angry + ‘/‘ + filename) 47 labels.append(‘angry‘) 48 i += 1 49 50 filenames = os.listdir(sorrowful) 51 for filename in filenames: 52 print(filename) 53 dataSet[i] = getFeature(sorrowful + ‘/‘ + filename) 54 labels.append(‘sorrowful‘) 55 i += 1 56 57 filenames = os.listdir(relaxed) 58 for filename in filenames: 59 print(filename) 60 dataSet[i] = getFeature(relaxed + ‘/‘ + filename) 61 labels.append(‘relaxed‘) 62 i += 1 63 64 65 return dataSet, labels 66 67 #欧几里得距离计算相关度 68 def kNNClassify(features, dataSet, k, labels): 69 numSamples = dataSet.shape[0] 70 t = np.tile(features, (numSamples , 1)) 71 72 73 74 diffVal = t - dataSet #向量操作 75 76 squareDiffVal = diffVal ** 2 77 squareDist = np.sum(squareDiffVal,1) 78 distance = squareDist ** 0.5 79 80 #对相关度进行排序,相关度由大到小(数值由小到大) 81 sortedDistIndices = np.argsort(distance) 82 83 classCount = {} 84 for i in range(k): 85 86 voteLabel = labels[sortedDistIndices[i]] 87 classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 88 89 maxCount = 0 90 ansKey = None 91 for key, value in classCount.items(): 92 if value > maxCount: 93 ansKey = key 94 maxCount = value 95 return ansKey 96 97 #保存文件 98 def saveData(dataSet): 99 np.savetxt(r‘./musicF/dataSet.txt‘, dataSet) 100 101 #从文件中加载数据集并返回 102 def loadDataFromFile(): 103 return np.loadtxt(r‘./musicF/dataSet.txt‘) 104 105 #保存标签到文件 106 def saveLabels(labels): 107 f = open(‘./musicF/labels.txt‘,‘w‘, encoding="gbk") 108 f.write(‘ ‘.join(labels)) 109 f.close() 110 111 112 #读取标签数据 113 def loadLabels(): 114 f = open(‘./musicF/labels.txt‘,‘r‘, encoding="gbk") 115 labelsString = f.read() 116 f.close() 117 labels = labelsString.split(‘ ‘) 118 return labels 119 120 121 def classify(path): 122 features = getFeature(path) 123 #读取数据 124 dataSet = loadDataFromFile() 125 labels = loadLabels() 126 ans = kNNClassify(features, dataSet, 7, labels) 127 return ans 128 129 def main(): 130 path = r‘./musicF/test/CMJ - 告白之夜(纯音乐)(Cover:Ayasa绚沙).mp3‘ 131 audio = MP3(path) 132 print(‘音乐时长为:‘,audio.info.length) 133 features = getFeature(path) 134 print(features.shape) 135 136 dataSet, labels = loadDataSet() 137 #保存数据 138 saveData(dataSet) 139 saveLabels(labels) 140 141 # #读取数据 142 # dataSet = loadDataFromFile() 143 # labels = loadLabels() 144 145 ans = kNNClassify(features, dataSet, 7, labels) 146 print(‘labels = ‘, ans) 147 148 def addData(): 149 dataSet, labels = loadDataSet() 150 #保存数据 151 saveData(dataSet) 152 saveLabels(labels) 153 154 if __name__ == ‘__main__‘: 155 #addData() 156 main()
原文:https://www.cnblogs.com/19990219073x/p/12638349.html