音乐系统文件分类 双声道

课程学习来自x风x 个人笔记整理 课程讲的不好,老师似乎代码都没搞清楚,讲些皮毛,主要是学一些新的表达和思路

一、基础知识补充
1.try的工作原理是:当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。

假如在读一个文件的时候,希望在无论异常发生与否的情况下都关闭文件,该怎么做呢?这可以使用finally块来完成。注意,在一个try块下,可以同时使用except从句和finally块。如果要同时使用它们的话,需要把一个嵌入另外一个。

2.glob模块的主要方法就是glob,该方法返回所有匹配的文件路径列表(list);该方法需要一个参数用来制定匹配的路径字符串(字符串可以为绝对路径也可以为相对路径),
其返回文件名只包括当前目录里的文件名,不包括子文件夹里的文件。
https://blog.csdn.net/qq_40196164/article/details/83067846

3.sys 和os 设置系统参数 https://blog.csdn.net/zengxiantao1994/article/details/58188527’’’

4.Python lower() 方法转换字符串中所有大写字符为小写。 语法 lower()方法语法: str.lower() 参数 无

5.集合(set) python的数据结构的另一种表现形式。 作用:自动清除集合类型中的元素重复数据(set),以及元素排序。 集合类型的元素排序是无序不重复。

6.python zip
https://www.cnblogs.com/wdz1226/p/10181354.html

7.glob.glob
glob模块的主要方法就是glob,该方法返回所有匹配的文件路径列表(list)
该方法需要一个参数用来指定匹配的路径字符串(字符串可以为绝对路径也可以为相对路径),其返回的文件名只包括当前目录里的文件名,不包括子文件夹里的文件。
https://blog.csdn.net/qq_17753903/article/details/82180227

8.map函数
https://www.runoob.com/python/python-func-map.html

9.Numpy知识点补充:np.vstack()&np.hstack()
https://www.jianshu.com/p/2469e0e2a1cf

10.通俗理解OvO与OvR
https://blog.csdn.net/alw_123/article/details/98869193

11.isinstance
https://www.runoob.com/python/python-func-isinstance.html

12.SVM是Support Vector Machines(支持向量机)的缩写,可以用来做分类和回归。SVC是SVM的一种Type,是用来的做分类的,SVR是SVM的另一种Type,是用来的做回归的。
https://blog.csdn.net/u012331016/article/details/45223135

13.Python 字典(Dictionary) get()方法
https://www.runoob.com/python/att-dictionary-get.html

14.在做模型训练的时候,尤其是在训练集上做交叉验证,通常想要将模型保存下来,然后放到独立的测试集上测试,下面介绍的是Python中训练模型的保存和再使用。
scikit-learn已经有了模型持久化的操作,导入joblib即可

https://blog.csdn.net/helloxiaozhe/article/details/80658438
在这里插入图片描述
在这里插入图片描述

二、代码part

'''
代码热身
没有的话需要安装 
pip install pydub
pip install python_speech_features
'''


from pydub.audio_segment import AudioSegment  #切割
from scipy.io import wavfile  #mp3是压缩过后的音乐 失掉很多特征
from python_speech_features.base import mfcc
import pandas as pd
import numpy as np


song=AudioSegment.from_file("./cccc/abc.MP3",format="mp3")
song.export("./cccc/abc.wav",format="wav")
rate,data=wavefile.read("./cccc/abc.wav")
#print(data)
#print(rate)


#mfcc包含了傅里叶变换  和 梅尔倒谱系数
mf_feat=mfcc(data,rate,numcep=13,nfft=2048)
#13是维度 nfft是傅里叶转化时候的速率
#print(mf_feat)#打印出来是一个13维的向量

mm=np.mean(mf_feat,axis=0) #降维处理1*13
mf=np.transpose(mm)
mc.cov(mf)#我不需要行和行,要的是列之间的 关系 转置之后看

result=mm

for k in range(len(mm)):
    result=np.append(result,np.diag(mc,k))
print(result)

features

#feature  老师用的python3 因为起名可以用中文...
import pandas as pd
import numpy as np
import glob
from pydub.audio_segment import AudioSegment  
from scipy.io import wavfile 
from python_speech_features.base import mfcc
import os 
import sys
import time


#def 获取歌单(): 我看着难受...
def getMusicMenu():
    data=pd.read_csv(./ccc)
	data=data[["name","tag"]] #标签使csv文件中已经打好标签了清新摇滚。。
	return data

def getMusicFeatures(file):
    items=file.split(",")
	file.format=items[-1].lower()
	file_name=file[:-len(file.format)+1)]
	if file_format!="wav":
	   #把mp3格式的文件转化为wav,保存至原文件夹
	   song=AudioSegment.from_file(file,format="mp3")
	   file=file_name+".wav"  #我怎么记的这个不合适
	   song.export(file,format="wav")
	#提取wav格式歌曲特征 
	try:
	   rate,data=wavefile.read(file)
	   mfcc_feas=mfcc(data,rate,numcep=13,nfft=2048)#卷积的算法降维
	   mm=np.transpose(mffc_feas)
	   mc=np.cov(mm)
	   result=mc
	   for i in range(mm.shape[0]):
	       result=np.append(result,np.diag(mc,i))
		return result
		
	except Exception as msg:   #为了报错不影响往下进行
	    print(msg)
 	   
	   
def reatureExtraction():
    df=	getMusicMenu()
	name_label_list=np.array(df).tolist()
	name_label_dict=dict(map(lambda t:(t[0],t[1]),name_label_list))
	labels=set(ame_label_dict.values())#不要忘了.values()
	label_index_dict=dict(zip(labels,np.arrange(len(labels))))
	all_music_files=glob.glob(歌曲路径)
	all_music_files.sort()
	loop_count=0
	flag=True
	
	all _mfcc=np.array([])
	for file_name in all_music_files:
	    print("开始处理"+file_name.replace("\xa0",""))
		#xa0  https://blog.csdn.net/clovejava/article/details/89511172
		#因为是文件夹下 music\下面的 
	    music_name=file_name.split("\\")[-1].split(".")[-2].split("-")[-1]
		music_name=music_name.strip()
		if music_name in name_label_dict:
		   label_index=label_index_dict[name_label_dict[music_name]]
		   ff=getMusicFeatures(file_name)
		   ff=np.append(ff,label_index)
		   
		   if flag:
		      all_mfcc=ff
			  flag=Flase
			  
			else:
			    print("无法处理"+file_name.replace("\xa0","")+",找不到对应的lable")
			print(looping----%d" % loop_count)
			print(all_mfcc.shape:",end="")
			print(all_mfcc.shape)
			loop_count+=1
			
		
		label_index_list=[]
		for k in label_index_dict:
		    label_index_list.append([k,label_index_dict[k])
        pd.DataFrame(label_index_list).to_csv(数值化标签路径,header=None,\
		                                      index=False,encoding="utf-8")
											  
		pd.DataFrame(all_mfcc).to_csv(歌曲特征文件存放路径,header=None,\
		                              index=False,encoding="utf-8")
		return all_mfcc

if __name__="main":
   歌曲路径="./data/music_info.csv"
   歌曲源路径"./data/music/*.mp3"
   数值化标签路径="./data/music_index_label.csv"
   歌曲特征文件存放路径="./data/music_features.csv"
   start=time.time()
   reatureExtraction()
   end=time.time()
   
   print("总耗时%.2f秒%(end-start))
   

```bash
#acc 是老师自己写的  预测值和真实值的差异
def get(res,tes):
    n=len(res)
	truth=(res==tes)
	pre=0
	for flag in truth:
	    if flag:
		    pre+=1
	return (pre*100)/n

from sklearn import svm
from sklearn.utils import shuffle  #打乱,再训练,洗牌
from sklearn.model_selection import GridSearchCV,train_test_split 
#网格交叉验证是调参的,交叉验证是评估模型
from sklearn.externals import joblib
import pandas as pd
import numpy as np
import acc  #自己写的
import sys
import time

#选取最优的核函数 rbf高斯核函数  linear 是独立的  poly有互相交叉相乘  半正定
def internal_cross_validation(X,Y):
    parameters={
	     “kernel":("linear","rbf","poly"),
		 "c":[0.1,1]  #松弛因子,泛化能力
		 "probability":[True,False],
		 “decision_function_shape":["ovo","ovr"]
	}
	
	clf=GridSearchCV(svm.SVC(random_state=0),param_grid=parameters,cv=5)
	print(begining...)
	clf.fit(X,Y)
	print("best parameter= ",end="")
	print(clf.best_params_)
	print("best accuracy= ",end="")
    print(clf.best_score_)

def cross_validation(music_csv_file_path=None,data_percentage=0.7):
    if not music_csv_file_path:
       music_csv_file_path=	歌曲特征文件存放路径
	print("begining read data"+music_csv_file_path)
	
	data=pd.read_csv(music_csv_file_path,sep=",",header=None,ending="utf-8")
	sample_fact=0.7  #感觉他这个写错了
	
	if isinstance(data_percetage,float) and 0<data_percentage<1:
	   sample_fact=data_percentage
    
    data=data.sample(frac=sample_fact).T
	X=data[:-1].T  #忘了他不包含右边界了
	Y=np.array(data[-1:])[0]
	#print(X)
	#print(Y)	
	internal_cross_validation(X,Y)
	

def poly_model(X,Y):

	#进行魔性训练,并且计算训练集上预测值与label的准确性

    clf=svm.SVC(kernel="poly",C=0.1,probability=True,decision_function_shape="ovo",random_state=0)	
	clf.fit(X,Y)
	res=clf.predict(X)
	restrain=acc.get(res,Y)
	
    return clf,restrain
		 
def trainModels(train_percentage=0.7,fold=1,music_csv_file_path=None,model_out_f=None)
	
    if not music_csv_file_path:
        music_csv_file_path=歌曲特征文件存放路径
    data=pd.read_csv(music_csv_file_path,sep=",",header=None, encoding="utf-8")
   
    max_train_score=None
    max_test_score=None
    max_source=None
    best_clf=None
    flag=True
    
    for index in range(1,int(fold)+1):
        print(index)
		shuffle_data=shuffle(data)
		X=shuffle_data.T[:1].T
		Y=np.array(shuffle_data.T[-1])[0]
		X_train,X_test,Y_train,Y_test=train_test_split(X,Y,train_size=0.3, random_state=0)
		(clf,train_source)=poly_model(X_train,Y_train)
		y_predict=clf.predict(x_test)
		test_source=acc.get(y_predict,y_test)#测试集的准确率
		source=0.35*train_source+0.65*test_source #模型综合准确率
		if flag:
		    max_source=source
			max_train_source=train_source
			max_test_source=test_source
			best_clf=clf			
        	flag=False	
 
        else:
		    if max_source<source:
			   max_source=source
			   max_train_source=train_source
			   max_test_source=test_source
			   best_clf=clf
		print("第%d次训练,训练集上的正确率为:%.2f,测试集上的正确率为:%.2f,
		      加权平均正确率为:%.2f"%(train_source,test_source,source)
		 
	print("最优训练模型,训练集上的正确率为:%.2f,测试集上的正确率为:%.2f,
		  加权平均正确率为:%.2f"%(max_train_source,max_test_source,max_source) 
		 
	print("最优模型是:")
    print(best_clf)
    if not model_out_f:
        model_out_f=模型保存路径
    joblib.dump(best_clf,model_out_f)		 
		 
if __name__="__main__":
     
	print("="*30+" begining searching the most suitable model..." "+"+"*30
	#打印30个等号 
	start=time.time()
	cross_validation(music_csv_file_path=None,data_percentage=0.7)
	end=time.time()
	print("cost time%.2f" %(end-start))
    #sys.exit(0)
	print("="*30+" begining searching the most suitable model..." +"+"*30)
	start=time.time()
	trainModels(train_percentage=0.7,fold=1000,music_csv_file_path=None,model_out_f=None)
	end=time.time()
	print("cost time%.2f" %(end-start))
	
#svm main
import feature
import pandas as pd
import numpy as np
from sklearn.externals import joblib 
import sys
import time

数值化路径="./data/xx.csv"
def load_model(model_f=None):
    if not model_f:
	    model_f=模型保存路径
	clf=joblib.load(model_f):
	return clf


def 歌曲标签数值化(): #fetch_index_label
    #从文件中读取index和label之间的映射关系,并返回dict
	data=pd.read_csv(数值化路径,header=None,encoding="utf-8")
	name_label_list=np.array(data).tolist()
	index_label_dict=dict(map(lambda t:(t[1],t[0],name_label_list))
	return index_label_dict
index_label_dict=歌曲标签数值化()


def predict_labels(clf,X):
    label_index=clf.predict([x])#win7没有方括号跑不了
	label=index_label_dict[label_index[0]]
	return label
	
if __name__=="__main__":
    数值化标签路径="./data/xx.csv"
    模型保存路径=“./data/music_model.pkl"
    clf=load_model()
    parh=
    music_feature=feature.获取歌曲特征
    label=predict_labels(clf,music_feature)
    print("预测标签为:%s"%label)
  
发布了39 篇原创文章 · 获赞 1 · 访问量 452

猜你喜欢

转载自blog.csdn.net/qq_40647378/article/details/103791721