1 项目描述

有一家音乐app公司希望我们提供一个音乐分类器,他们希望得到的结果是:输入一首歌,可以对输入的歌曲进行分类。

机器学习(十三)-多分类逻辑回归项目音乐分类器

2 项目难点

2.1 维度的问题

音乐是几维? 如何给音乐升维呢?

如果音乐是一单声道的,它就是一维,如果音乐是双声道的,他就是二维

2.2 音乐数据

  • 首先把一个wma文件读入python,然后绘制它的频谱图(spectrogram)来看看是什么样的?如下图所示:

机器学习(十三)-多分类逻辑回归项目音乐分类器

  • 其次我们把每一种的音乐都抽一些出来打印频谱图以便比较:

机器学习(十三)-多分类逻辑回归项目音乐分类器

2.3 时域和频域

  • 时域是横向的;
    机器学习(十三)-多分类逻辑回归项目音乐分类器

  • 频域是纵向的;
    机器学习(十三)-多分类逻辑回归项目音乐分类器

2.4 傅立叶变化FFT

FFT是一种数据处理技巧,它可以把time domain上的数据,例如一个音频,拆成一堆基准频率,然后投射到frequency domain上。

机器学习(十三)-多分类逻辑回归项目音乐分类器

2.5 时域和频率

时域是真实世界,是惟一实际存在的域。

机器学习(十三)-多分类逻辑回归项目音乐分类器

3 项目流程

3.1 音乐数据预处理

注意: 数据集下载

import numpy as np
from scipy import fft
from scipy.io import wavfile
from tqdm import tqdm


def create_fit(g ,n):
    # zfill 返回指定长度的字符串,原字符串右对齐,前面填充0
    rad = "./genres/" + g + "/converted/" + g + "." + str(n).zfill(5) + ".au.wav"
    # sample_rate:采样率
    # 模电(连续的信号)变数电(数字的表达)
    # 采样率越高,如果单位时间采样点越多,信息损失的越少
    # X 就是音乐文件
    sample_rate, X = wavfile.read(rad)
    # 用傅立叶变化处理1000以下的赫兹
    fft_features = abs(fft(X)[:1000])
    sad = "./trainset/" + g + "." + str(n).zfill(5) + ".fft"
    # 把特征存到某个具体的路径下面去
    np.save(sad, fft_features)

if __name__ == '__main__':
    # 把wav格式做fft转换
    genre_list = ["classical", "jazz", "country", "pop", "rock", "metal"]
    for g in genre_list:
        for n in tqdm(range(100)):
            create_fit(g, n)


相关文章: