机器学习——简单歌曲分类

歌曲文件特征处理

将歌曲.MP3格式文件转化成.wav格式文件,然后做傅里叶变换

  1. 安装pydub包,在anaconda3环境中:pip install pydub
  2. 安装ffmpeg包,在anaconda3环境中:pip install ffmpeg ,也可以在官网下载后配置环境变量http://ffmpeg.org/
    安装后运行demo发现一直报这样错误:
    在这里插入图片描述
    然后根据错误描述去相应文件夹下找到utils.py文件,加入下面图片中的一行代码:
    机器学习——简单歌曲分类_第1张图片
    但是Jupyter还是提示找不到系统文件,遂放弃,用Pycharm运行几个demo都成功(真是醉了)。
    机器学习——简单歌曲分类_第2张图片
    001是用另一种方法转的,会出现沙沙的声音,0001成功
    (多说一句,歌曲文件在网易云音乐等音乐类软件按分类下载就行)

3、将每种类别的歌曲都转成.wav模式

from pydub import AudioSegment
import wave

#将每种类别的歌曲.mp3格式转化为.wav格式
def trans_awv(class_name,n):
    path = "E:/CloudMusic/" + class_name + "/" + str(n).zfill(2) + ".mp3"
    song = AudioSegment.from_file(path, format='mp3')
    ex_path = "E:/CloudMusic/" + class_name + "/" + str(n).zfill(2) + ".wav"
    song.export(ex_path, format='wav')

class_namelist = ["ballad", "classical", "metal", "pop", "rock"]
for list in class_namelist:
    for n in range(10):
        trans_awv(list, n)

4、 将歌曲.wav格式文件做fft转换(傅里叶变换)

def trans_fft(class_name ,n):
    path = "E:/CloudMusic/" + class_name + "/" + str(n).zfill(2) + ".wav"
    # sample_rate:采样率(采样率越高,如果单位时间采样点越多,信息损失的越少)
    # X 就是音乐文件
    sample_rate, X = wavfile.read(path)
    # 用傅立叶变化处理头1000的赫兹
    fft_data = abs(fft.fft(X)[:1000])
    ex_path = "E:/CloudMusic/" + class_name + "/" + str(n).zfill(2) + ".fft"
    # 把特征存到某个具体的路径下面去
    np.save(ex_path, fft_data)

class_namelist = ["ballad", "classical", "metal", "pop", "rock"]
for list in class_namelist:
    for n in range(10):
        trans_fft(list, n)

构造训练集

"""
构造训练集
"""
X = []
Y = []
for list in class_namelist:
    for n in range(10):
        #转换后会有后缀.npy
        path = "E:/CloudMusic/" + list + "/" + str(n).zfill(2) + ".fft.npy"
        # 加载声音文件的前1000频率
        fft_data = np.load(path)
        X.append(fft_data[:,0])
        #取每种类别歌曲的索引号作为标签
        Y.append(class_namelist.index(list))

#sklearn处理数组,所以将list转为数组
X = np.array(X)
Y = np.array(Y)

模型训练

"""
用逻辑回归训练模型
"""
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(multi_class="ovr",solver="liblinear",max_iter=10000)
model.fit(X, Y)

构建测试集并做预测

"""
构建测试集(这里只取一个歌曲作为测试集)
"""
#同样的先做mp3转wav处理,再进行傅里叶变换处理
song = AudioSegment.from_file("E:/CloudMusic/test/test.mp3", format='mp3')
song.export("E:/CloudMusic/test/test.wav", format='wav')
sample_rate, test = wavfile.read("E:/CloudMusic/test/test.wav")
test_data = abs(fft.fft(test)[:1000])
np.save("E:/CloudMusic/test/test.fft", test_data)
t = np.load("E:/CloudMusic/test/test.fft.npy")
new_testdata = []
new_testdata.append(t[:,0])
new_testdata = np.array(new_testdata)
#print(new_testdata)
#print(new_testdata.shape)
type_index = model.predict(new_testdata)
print(type_index)
print(class_namelist[type_index[0]])
E:\Users\Byan\anaconda3\python.exe E:/pycharm/test.py
[3]
pop

Process finished with exit code 0

训练集测试集都很小很小 (小到都不能称为训练测试集),但分类结果竟然是对的 (只是运气比较好),所以只是学习过程中小小的实验一下,准确率的什么的就不测了哈哈哈。

补个所有导入的包,pycharm直接导入anaconda3的环境即可。可参考我另一篇博文:pycharm导入Anaconda3环境

from pydub import AudioSegment
import wave
import numpy as np
from scipy import fft
from scipy.io import wavfile

你可能感兴趣的:(机器学习)