AI实战:用 HuBERT 识别乐曲风格

摘要

本项目的目标是使用深度学习来识别乐曲风格,如一首歌曲是流行乐还是摇滚乐。

我们将把乐曲特征转换为图像数据,再利用 HuBERT 进行训练,生成的模型可以存储到你自己的 Hugging Face 帐号中。

本教程的 Jupyter 文件地址:
https://openbayes.com/console/public/tutorials/ODwKxev36xS

本教程的视频地址:
https://www.bilibili.com/video/BV11E421w76X

运行环境

因为 AI 需要在 GPU 上运算,而一般的 PC 是没有 GPU 的,所以我们要借用云端的算力。

我选择的云端算力平台是 OpenBayes,你使用下面的链接进行注册,将可以获得免费 4 小时 RTX-4090 显卡的使用时长。

注册链接如下:
https://openbayes.com/console/signup?r=comehope_JrJj

点击它,会出现下面的登录界面,填写用户名、邮箱、密码、手机号和短信验证码,就可以完成注册,如下图所示。

在这里插入图片描述

克隆教程

注册成功之后,进入到个人控制台,在左侧菜单中选择“公共资源/公共教程”,搜索“hubert”,找到“基于 HuBERT 实现歌曲风格分类”这篇教程,如下图所示。

在这里插入图片描述

打开这篇教程,点击右上角的“克隆”按钮,如下图所示。

在这里插入图片描述

在接下来“从模板创建:基本信息”的界面中点击“下一步:选择算力”按钮,如下图所示。

在这里插入图片描述

所谓算力,就是显卡类型,请选择“RTX 4090”,这里会显示您获赠的时长。再选择镜像类型中,选择“TensorFlow”,然后,显示右下角的“下一步:审核”按钮,如下图所示。

在这里插入图片描述

接下来列出了刚才选择过的算力和镜像,点击右下角的“继续执行”按钮,如下图所示。

在这里插入图片描述

接下来,系统会自动分配资源,稍待片刻,等到页面中显示“打开工作空间”按钮,点击它,就可以进入运行中的教程了,如下图所示。

在这里插入图片描述

工作空间的界面如下图所示。

在这里插入图片描述

接下来,运行“教程.jpynb”文件即可。以下内容与 “教程.jpynb” 的内容完全相同,建议您在 Jupyter 中运行,可以实时看到运行结果。

教程正文

在开始正文之前,需要一点准备工作。

请准备好你的 Hugging Face Token,在训练结束之后,我们会把新模型上传到 Hugging Face。

请安装本教程依赖的第三方库。

!pip install -r /openbayes/home/requirements.txt -q

音频处理的基本概念

在开始正式编码之前,让我们了解音频文件中包含了什么信息,以及如何使用它们。

接下来我们会讨论几个术语:

  • 采样率
  • 波形图(时域图)
  • 频域图
  • 时频图
  • 梅尔时频图
采样率

采样率决定了连续音频样本之间的时间间隔,你可以把它看作是音频数据的时间分辨率,类似于图片分辨率,值越高,就越清晰,数据量也就越大。

例如,对 5 秒的声音进行采样,当采样率为 16,000 Hz 时,得到的数据量是 80,000 个值。

关于采样率要注意两点:一是要确保数据集中所有的音频都应具用相同的采样率;二是数据集的采样率必须与预训练模型的采样率相同,否则需要先对数据集进行重采样处理。无论执行何种音频任务,始终保持采样率一致都非常重要。

波形图(时域图)

声音的振幅描述了某一特定时刻的声压级,以分贝(dB)为单位。样本的位深度(如 8-bit 或 16-bit)决定了描述该幅度值的精度。

我们可以绘制随时间变化的样本值,描绘出声音幅度的变化,这也称为声音的时域图。

时域图对于识别音频信号的特定特征非常有用,例如各个声音事件的时间、信号的整体响度以及音频中存在的任何不规则或噪声。

我们来观察一个小号声音的时域图。

在这里插入图片描述

在上图中,y 轴表示信号的幅度,x 轴表示时间,每个点对应于对该声音进行采样时获取的单个样本值。另外请注意,librosa 已将音频的幅度映射为浮点值,并且幅度在 [-1.0, 1.0] 范围内。

频域图

可视化音频数据的另一种方法是绘制音频信号的频谱,也称为频域图。

下图是时域图与频域图的区别。

在这里插入图片描述

对采样数据进行离散傅里叶变换(DFT,Discrete Fourier Transform),就能计算出声音的频谱,它描述了构成信号的各个频率及其强度。

虽然可以绘制整个声音的频谱,但绘制一小段时间的频谱更有利于我们观察。在这里,我们选择对前 4096 个样本进行 DFT 运算,这大约是演奏的第一个音符的长度。

在这里插入图片描述

上图绘制了该音频片段中存在的各种频率分量的强度。频率值位于 x 轴上,通常以对数刻度绘制,幅度位于 y 轴上。

可以观察到,频域图中显示了几个尖峰值。这些发音与正在演奏的音符的和声相对应,和声越高越安静。

时频图

时域图绘制了音频信号随时间变化的幅度,频域图显示了一段时间内各个频率的幅度,它是给定时刻的频率的快照。如果我们想查看音频信号的频率如何随时间而变化,该怎么办?解决方案是采用多个 DFT 运算,每个仅覆盖一小部分时段(通常持续几毫秒),并将所有小时段的频谱叠加起来,得到时频图。执行此计算的算法称为短傅立叶变换(Short Fourier Transform,STFT)。

让我们绘制此前小号声音的时频图。

在这里插入图片描述

在上图中,x 轴代表时间,y 轴代表以 Hz 为单位的频率,颜色的明度表示每个时间点频率分量的功率幅度,以分贝 (dB) 为单位。

我们可以观察到图像中有多个竖直的切片,每个竖直的切片相当于前面绘制的一个频谱图,但是它被竖起来,并且分贝值被可视化为颜色的明度。

默认情况下,librosa.stft() 将音频信号分割为 2048 个样本长的小片段,在频率分辨率和时间分辨率之间进行了良好的平衡。

由于时频图和时域图是同一数据的不同视图,因此可以使用逆 STFT 将时频图转回原始波形的时域图。 在这种情况下,我们可以使用相位重建算法(例如经典的 Griffin-Lim 算法),或使用称为向量的神经网络来从频谱图中重建波形。

梅尔时频图

梅尔时频图是语音处理和机器学习任务中常用的时频图的变体。它也是随着时间的推移记录音频信号的频率内容,但频率轴有所不同,简单地说就是频率范围变小了,更适合处理人类的语音。

在这里插入图片描述

梅尔频段定义了一组频率范围,使用一组滤波器分离出这些频率,这些被定义的频率都在人耳敏感的频率范围之内。我们关心的最高频率(以 Hz 为单位),通常是 4k 或 8k。

模型

尽管 Transformer 架构最初是设计用于处理文本数据的,但已经出现许多用 Transformer 设计的用于处理音频数据的架构。这些模型在作为输入的音频数据类型和内部功能的细微差别方面可能有所不同,但总体而言,它们倾向于遵循与原始 Transformer 非常相似的方法。

在这里,我们将使用 HuBERT,它是一种仅编码器模型,非常适合音频分类任务。它的主要思想是屏蔽输入音频的某些部分,并且训练模型来学习如何重新预测这些被屏蔽的片段。它还使用簇集成来生成伪标签,帮助指导预测被掩盖部分的学习过程。

数据集

我们将使用 GTZAN 数据集,它包含 500 多个 30 秒长的音频样本,其中包含多种风格的音乐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值