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)