首页 > 编程语言 > 详细

python音乐分类--knn

时间:2020-04-05 18:58:49      阅读:176      评论:0      收藏:0      [点我收藏+]
  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()

 

python音乐分类--knn

原文:https://www.cnblogs.com/19990219073x/p/12638349.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!