基于 Python 的音乐流派分类

news2024/10/7 13:09:41

音乐就像一面镜子,它可以告诉人们很多关于你是谁,你关心什么,不管你喜欢与否。我们喜欢说“you are what you stream” - Spotify

Spotify 拥有 260 亿美元的净资产,是如今很受欢迎的音乐流媒体平台。它目前在其数据库中拥有数百万首歌曲,并声称拥有适合所有人的乐谱。Spotify 的 Discover Weekly 服务已成为千禧一代的热门话题。毋庸置疑,Spotify 已投入大量研究来改进用户查找和收听音乐的方式。机器学习是他们研究的核心,从 NLP 到协同过滤再到深度学习。根据歌曲的数字签名对一些因素进行分析,包括节奏、曲调、力度、可跳舞性等,以回答那个不可能的古老的第一次约会问题:你喜欢什么样的音乐?

公司现在使用音乐分类,要么能够向他们的客户推荐(例如 Spotify、Soundcloud),要么只是作为一种产品(例如 Shazam)。确定音乐流派是朝着这个方向迈出的第一步。机器学习技术已被证明在从大型数据池中提取趋势和模式方面非常成功。同样的原则也适用于音乐分析。

在本文中,我们将研究如何使用 Python 分析音频/音乐信号。然后,我们将利用学到的技能将音乐片段分类为不同的流派。

使用 Python 进行音频处理

声音以具有频率、频宽、分贝等参数的音频信号形式表示。典型的音频信号可以表示为振幅和时间的函数。

这些声音有多种格式,使计算机可以读取和分析它们。比如:

  • mp3格式

  • WMA(Windows 媒体音频)格式

  • wav(波形音频文件)格式

音频库

Python 有一些很棒的音频处理库,例如 Librosa 和 PyAudio。还有用于一些基本音频功能的内置模块。

我们将主要使用两个库进行音频采集和播放:

1. Librosa

它是一个 Python 第三方库,用于分析一般的音频信号,但更适合音乐。它包括构建 MIR(音乐信息检索)系统的具体细节。它有很好的文档记录,还有很多示例和教程。

安装

pip install librosa``or``conda install -c conda-forge librosa

如果想要更多音频解码能力,您可以安装 FFmpeg,它附带许多音频解码器。

2.IPython.display.Audio

IPython.display.Audio 可让您直接在 jupyter notebook 中播放音频。

加载音频文件

import librosa``audio_path = '../``   ``T08-violin.wav'``x , sr = librosa.load(audio_path)print(type(x), type(sr))``<class 'numpy.ndarray'> <class 'int'>print(x.shape, sr)``(396688,) 22050


  

这将返回一个音频时间序列作为一个 numpy 数组,默认采样率为 22KHZ 单声道。我们可以通过以下语句进行修改:  





librosa.load(audio_path, sr=44100)


将采样率设置为 44.1KHz   

  





librosa.load(audio_path, sr=None)


禁用重采样功能  


采样率是每秒传输的音频样本数,以 Hz 或 kHz 为单位。

播放音频

使用 IPython.display.Audio 播放音频

import IPython.display as ipd``ipd.Audio(audio_path)

这会在 jupyter notebook 中返回一个音频小部件,如下所示:

音频小部件的屏幕截图

这个小部件在这里不起作用,但它会在你的笔记本上起作用。有兴趣的话,可以通过下述链接查看:https://soundcloud.com/parul-pandey-323138580/t08-violin?utm_source=cdn.embedly.com&utm_campaign=wtshare&utm_medium=widget&utm_content=https%253A%252F%252Fsoundcloud.com%252Fparul-pandey-323138580%252Ft08-violin

您甚至可以为音频示例使用 mp3 或 WMA 格式。

可视化音频

波形

我们可以使用 librosa.display.waveplot 绘制音频:



%matplotlib inlineimport matplotlib.pyplot as pltimport librosa.displayplt.figure(figsize=(14, 5))librosa.display.waveplot(x, sr=sr)



Spectrogram

Spectrogram是声音或其他信号随时间变化的频率频谱的直观表示。频谱图有时称为声谱图、声纹或语音图。当数据以 3D 图表表示时,它们可能被称为瀑布图。在二维数组中,第一个轴是频率,第二个轴是时间。

我们可以使用 librosa.display.specshow 显示频谱图。



X = librosa.stft(x)Xdb = librosa.amplitude_to_db(abs(X))plt.figure(figsize=(14, 5))librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')plt.colorbar()


  



垂直轴显示频率(从 0 到 10kHz),水平轴显示剪辑的时间。由于所有动作都发生在频谱底部,我们可以将频率轴转换为对数轴。



librosa.display.specshow(Xdb, sr=sr, x_axis=‘time’, y_axis=‘log’)``plt.colorbar()


![](https://mmbiz.qpic.cn/mmbiz_png/oWYZNQOgMwwaao3RInDticJbZ8GLWKlPKwovykARab9tojVQXNccCrPGn4pNI9CMPXNflyxUib2eSheaibqHVxXBA/640?wx_fmt=png)

  

**写入音频文件**  


librosa.output.write_wav 可以将 NumPy 数组保存到 WAV 文件。



librosa.output.write_wav(‘example.wav’, x, sr)


  



创建音频信号

现在让我们创建一个 220Hz 的音频信号。音频信号可以是一个 numpy 数组,因此我们将创建一个数组并将其传递给音频函数。



import numpy as npsr = 22050 # sample rateT = 5.0 # secondst = np.linspace(0, T, int(T*sr), endpoint=False) # time variablex = 0.5np.sin(2np.pi220t)# pure sine wave at 220 HzPlaying the audioipd.Audio(x, rate=sr) # load a NumPy arraySaving the audio``librosa.output.write_wav(‘tone_220.wav’, x, sr)


所以,此处我们便创建好了第一个声音信号。  



特征提取

每个音频信号都包含许多特征。但是,我们必须提取与我们要解决的问题相关的特征。提取特征以将其用于分析的过程称为特征提取。让我们详细研究一些功能。

Zero-Crossing Rate

Zero-Crossing Rate 是符号随信号变化的速率,即信号从正变为负或反向的速率。此功能已大量用于语音识别和音乐信息检索。对于金属和摇滚中的高打击乐声音,它通常具有更高的值。



Load the signalx, sr = librosa.load('../T08-violin.wav')#Plot the signal:plt.figure(figsize=(14, 5))librosa.display.waveplot(x, sr=sr)


![](https://mmbiz.qpic.cn/mmbiz_png/oWYZNQOgMwwaao3RInDticJbZ8GLWKlPKYbQMwqdcr4N3pZibShn8rna9RCZPzXk7xM7FRwWGKHHQ6ia0oWwXjurA/640?wx_fmt=png)




Zooming inn0 = 9000n1 = 9100plt.figure(figsize=(14, 5))plt.plot(x[n0:n1])``plt.grid()


上述显示有 6 个零交叉点。让我们用 librosa 验证一下。  





zero_crossings = librosa.zero_crossings(x[n0:n1], pad=False)print(sum(zero_crossings))6


  



Spectral Centroid

它代表了声音的“质心”所在位置,并计算声音中存在的频率的加权平均值。考虑两首歌曲,一首来自蓝调类型,另一首属于金属。现在,与整个长度相同的布鲁斯风格歌曲相比,金属歌曲在结尾处有更高的频率。因此,布鲁斯歌曲的频谱质心将位于其频谱中间附近的某个位置,而金属歌曲的频谱质心将接近其末端。

librosa.feature.spectral_centroid 函数可以计算每个帧的Spectral Centroid:



spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0]spectral_centroids.shape(775,)# Computing the time variable for visualizationframes = range(len(spectral_centroids))t = librosa.frames_to_time(frames)# Normalising the spectral centroid for visualisationdef normalize(x, axis=0): return sklearn.preprocessing.minmax_scale(x, axis=axis)#Plotting the Spectral Centroid along the waveformlibrosa.display.waveplot(x, sr=sr, alpha=0.4)plt.plot(t, normalize(spectral_centroids), color=‘r’)


![](https://mmbiz.qpic.cn/mmbiz_png/oWYZNQOgMwwaao3RInDticJbZ8GLWKlPKzvIDvgLlhYQsic0bdxfia5GQTB8d49KY8nLT1sUWvanPJu0VV74AogJg/640?wx_fmt=png)

  

**Spectral Rolloff**  



它是信号形状的度量。它表示总频谱能量的百分比(例如 85%)低于该频率。

librosa.feature.spectral_rolloff 可以计算每一帧的Spectral Rolloff:



spectral_rolloff = librosa.feature.spectral_rolloff(x+0.01, sr=sr)[0]librosa.display.waveplot(x, sr=sr, alpha=0.4)plt.plot(t, normalize(spectral_rolloff), color=‘r’)


![](https://mmbiz.qpic.cn/mmbiz_png/oWYZNQOgMwwaao3RInDticJbZ8GLWKlPKUnNVribibltNic6giamSVL0SC3tnwqYtcNIp4Dakml6BqibuqjVkDxrRiaFA/640?wx_fmt=png)

  



Mel-Frequency Cepstral Coefficients

MFCC 是一小组特征(通常约为 10-20),简明地描述了频谱包络的整体形状。它可以模拟人声的特征。



x, fs = librosa.load(‘…/simple_loop.wav’)``librosa.display.waveplot(x, sr=sr)


  

librosa.feature.mfcc 可以计算音频信号的 MFCC:  





mfccs = librosa.feature.mfcc(x, sr=fs)print mfccs.shape(20, 97)#Displaying the MFCCs:librosa.display.specshow(mfccs, sr=sr, x_axis=‘time’)


  

![](https://mmbiz.qpic.cn/mmbiz_png/oWYZNQOgMwwaao3RInDticJbZ8GLWKlPKspxKnqM2rOzMR2ViaLGtYR6o5gWOBvkuiav5aEW7Bso2VBicDcejMXUTg/640?wx_fmt=png)

这里 mfcc 在 97 帧上计算了 20 个 MFCC 。  



我们还可以执行特征缩放,使得每个系数维度具有零均值和单位方差:



import sklearnmfccs = sklearn.preprocessing.scale(mfccs, axis=1)print(mfccs.mean(axis=1))print(mfccs.var(axis=1))librosa.display.specshow(mfccs, sr=sr, x_axis=‘time’)


  

![](https://mmbiz.qpic.cn/mmbiz_png/oWYZNQOgMwwaao3RInDticJbZ8GLWKlPKCZyRN2Z59icIqONicUpqLbQic7Ec1fvRmtwhfLQACLibxDITgMvsnZribMA/640?wx_fmt=png)

  

**Chroma features**  



Chroma features 是音乐音频的一种有趣而强大的表示,其中整个频谱被投射到 12 个 bins 上,代表音乐八度音阶的 12 个不同的半音(或色度)。

librosa.feature.chroma_stft 可以帮我们计算:



Loadign the filex, sr = librosa.load('../simple_piano.wav')hop_length = 512chromagram = librosa.feature.chroma_stft(x, sr=sr, hop_length=hop_length)plt.figure(figsize=(15, 5))``librosa.display.specshow(chromagram, x_axis=‘time’, y_axis=‘chroma’, hop_length=hop_length, cmap=‘coolwarm’)


![](https://mmbiz.qpic.cn/mmbiz_png/oWYZNQOgMwwaao3RInDticJbZ8GLWKlPKAdicl0pW0tEVQ3wBvLHMZibR2A4ZBIhQJibd8VS8hEY4pG05GkubwibXvA/640?wx_fmt=png)

  

**案例研究:将歌曲分为不同的流派。**  



在对声学信号、其特征及其特征提取过程进行了概述之后,是时候利用我们新开发的技能来处理机器学习问题了。

我们将尝试建立一个分类器模型来将歌曲分类为不同的流派。让我们假设一个场景,由于某种原因,我们在硬盘上发现了一堆随机命名的 MP3 文件,这些文件被认为包含音乐。我们的任务是根据音乐流派将它们分类到不同的文件夹中,例如爵士、古典、乡村、流行、摇滚和金属类。

数据集

我们将使用著名的 GITZAN 数据集进行案例研究。该数据集被 G. Tzanetakis 和 P. Cook 在 IEEE Transactions on Audio and Speech Processing 2002 中发表的著名流派分类论文“音频信号的音乐流派分类”中使用。

该数据集包含 1000 个音轨,每个音轨长 30 秒。它包含十种流派:蓝调、古典、乡村、迪斯科、嘻哈、爵士、雷鬼、摇滚、金属和流行。每个流派包含 100 个声音片段。

数据预处理

在训练分类模型之前,我们必须将原始数据从音频样本转换为更有意义的表示形式。音频片段需要从 .au 格式转换为 .wav 格式,使其兼容 python 的 wave 模块读取音频文件。我使用开源 SoX 库进行转换。



sox input.au output.wav


  



分类

特征提取

然后我们需要从音频文件中提取有意义的特征。我们将选择五个特征来对我们的音频剪辑进行分类,即Mel-Frequency Cepstral Coefficients, Spectral Centroid, Zero Crossing Rate, Chroma Frequencies, Spectral Roll-off.。然后将所有特征附加到 .csv 文件中,以便可以使用分类算法。

分类

一旦提取了特征,我们就可以使用现有的分类算法将歌曲分类为不同的流派。您可以直接使用频谱图图像进行分类,也可以提取特征并在其上使用分类模型。

尾记

音乐流派分类是音乐信息检索的众多分支之一。从这里,您可以对音乐数据执行其他任务,例如节拍跟踪、音乐生成、推荐系统、音轨分离和乐器识别等。音乐分析是一个多元化的领域,也是一个有趣的领域。音乐会话以某种方式代表用户的时刻。找到这些时刻并描述它们是数据科学领域的一项有趣挑战。

---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1001616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java拓展--空间复杂度和时间复杂度

空间复杂度和时间复杂度 文章目录 空间复杂度和时间复杂度空间复杂度时间复杂度**评价排序算法****时间频度****什么是时间频度****忽略常数项****忽略低次项****忽略系数** **时间复杂度****什么是时间复杂度****计算时间复杂度的方法****常见的时间复杂度** **常见的时间复杂…

正中优配:证券融资融券是什么意思?

证券融资融券&#xff08;简称“融资融券”&#xff09;是一种股票出资办法&#xff0c;是指出资者经过融券生意和融资生意来进行股票出资。它在出资商场上具有重要的作用&#xff0c;因为经过这种办法&#xff0c;出资者能够使用假贷资金进行股票生意&#xff0c;能够进步出资…

腾讯云4核8G服务器选CVM还是轻量比较好?价格对比

腾讯云4核8G云服务器可以选择轻量应用服务器或CVM云服务器标准型S5实例&#xff0c;轻量4核8G12M服务器446元一年&#xff0c;CVM S5云服务器935元一年&#xff0c;相对于云服务器CVM&#xff0c;轻量应用服务器性价比更高&#xff0c;轻量服务器CPU和CVM有区别吗&#xff1f;性…

23062C++QTday4

仿照string类&#xff0c;完成myString 类 代码&#xff1a; #include <iostream> #include <cstring> using namespace std; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度public://无参构造my…

华为云云耀云服务器L实例评测 | 由于自己原因导致MySQL数据库被攻击 【更新中。。。】

目录 引出起因&#xff08;si因&#xff09;解决报错诶嘿&#xff0c;连上了 不出意外&#xff0c;就出意外了打开数据库what&#xff1f;&#xff1f;&#xff1f; 找华为云求助教训&#xff1a;备份教训&#xff1a;密码 解决1.改密码2.新建一个MySQL&#xff0c;密码设置复杂…

Android T 窗口层级其三 —— 层级结构树添加窗口

文章目录 序节点添加Task以DefaultTaskDisplayArea为父节点以Task为父节点 ActivityRecordWindowTokenWindowState以WindowToken为父节点以ActivityRecord为父节点 小结调用场景添加差异 流程分析添加log堆栈打印流程LauncherStatusBar 序 尚未添加窗口的层级结构树&#xff0…

前端该了解的网络知识

网络 前端开发需要了解的网络知识 URL URL(uniform resource locator,统一资源定位符)用于定位网络服务. URL是一个固定格式的字符串 它表达了: 从网络中哪台计算机(domain)中的哪个服务(port),获取服务器上资源的路径(path),以及要用什么样的协议通信(schema). 注意: 当…

探索Netty的FuturePromise

Netty—Future&Promise 一、JDK原生 Future二、Netty包下的 Future三、Promise1、使用Promise同步获取结果2、使用Promise异步获取结果.3、使用Promise同步获取异常 - sync & get4、使用Promise同步获取异常 - await5、使用Promise异步获取异常 在异步处理时&#xff0…

颜色代码对照表

颜色代码对照表 各颜色代码: 1 白色 #FFFFFF 2 红色 #FF0000 3 绿色 #00FF00 4 蓝色 #0000FF 5 牡丹红 #FF00FF 6 青色 #00FFFF 7 黄色 #FFFF00 8 黑色 #000000 9 海蓝 #70DB93 …

出行类APP商业化路径解决方案

当下市场主流的商业化路径和方法相比于之前区别不大&#xff0c;开发者们都是在现有商业化体系下&#xff0c;制定更加详细、优质的策略&#xff0c;以期获得更高利益。 出行类App用户结构分析 年龄层次&#xff1a;出行类App用户的年龄分布比较广泛&#xff0c;主要集中在20…

商品防伪查询溯源小程序开发源码

企业商家在销售商品的过程中被人仿冒产品以次充好损害公司名声和影响产品销量是很多企业的痛点。我们基于次帮助企业开发了一款商品防伪溯源查询小程序&#xff0c;解决企业痛点&#xff0c;酿造更好的经商坏境。 核心功能&#xff1a; 我们采用一物一码的逻辑&#xff0c;可…

【网络基础】——HTTPS

目录 HTTPS背景知识 HTTPS是什么&#xff1f; 加密解密 为什么要加密 常见的加密方式 对称加密 非对称加密 数据摘要&&数据指纹 数字签名 HTTPS工作过程探究 方案1&#xff1a;只使用对称加密 方案2&#xff1a;只使用非对称加密 方案3&#xff1a;双方…

day37 线程

一、线程安全 二、多线程并发的安全问题 当多个线程并发操作同一临界资源 由于线程切换实际不确定 导致操作顺序出现混乱 产生的程序bug 严重时出现系统瘫痪 临界资源 &#xff1a;操作该资源的完整流程同一时间只能被单一线程操作的资源 多线程并发会出现的各种问题、 如…

IT运维:使用数据分析平台监控奇安信

监控目标 本文基于鸿鹄2.10.0版本。 ●监控奇安信日志类型分布 ●监控奇安信攻击行为、分析攻击类型 ●监控奇安信攻击来源情况 操作步骤 数据导入 1、创建数据集&#xff0c;如使用已经存在的数据集&#xff0c;可跳过此步骤 数据集名称&#xff1a;qax_syslog&#xff08;仪表…

管理类联考——数学——汇总篇——知识点突破——应用题——鸡兔同笼

⛲️ 一、考点讲解 第一鸡兔同笼问题 若已知脚数之和及鸡兔总数&#xff0c;求各多少只&#xff1a; 假设全都是鸡&#xff0c;则有 兔数 ( 实际脚数 − 2 鸡兔总数 ) ( 4 − 2 ) 兔数(实际脚数-2鸡兔总数)(4-2) 兔数(实际脚数−2鸡兔总数)(4−2) 假设全都是兔&#xff0…

Python 基础知识:语法、数据类型和控制结构

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 如果开发和环境中已安装 Python&#xff0c;请启动 Python REPL 和代码。或者&#xff0c;如果您想跳过安装并立即开始编码&#xff0c;我建议您前往Google Colab并一起编码。 你好&#xff0c;Python&#xff01; 在…

【算法日志】单调栈: 单调栈简介及其应用

代码随想录刷题60Day 目录 单调栈简介 单调栈的应用 下次更高温 下一个更大元素1 下一个更大元素2 接雨水 柱状图中最大矩形 单调栈简介 单调栈&#xff08;Monotonic Stack&#xff09;是一种特殊的栈数据结构&#xff0c;它满足元素的单调性&#xff0c;这种单调性需…

vue3使用el-form实现登录、注册功能,且进行表单验证(Element Plus中的el-form)

简介&#xff1a;Element Plus 中的 el-form 是一个表单组件&#xff0c;用于快速构建表单并进行数据校验。它提供了丰富的表单元素和验证规则&#xff0c;使表单开发变得更加简单和高效。可以搭配el-dialog实现当前页面的登录、注册页 &#xff0c;这两天在vue3中用到了表单登…

微信小程序 按钮颜色

<button type"primary">主要按钮样式类型</button> <button type"default">默认按钮样式类型</button> <button type"warn">警告按钮样式类型</button> <view>按钮plain是否镂空</view> <bu…

全局光照RSM

Reflective Shadow Maps&#xff08;RSM&#xff09; 一切被直接光照照到的物体&#xff0c;会作为次级光源。 问题1&#xff1a;哪些面片被直接照亮 使用ShadowMap就可以知道哪些面片被直接照亮 问题2&#xff1a;各个面片对P点的贡献分别是多少。 对渲染方程代入如上计算…