音乐的节奏感是在聆听时不自觉就会跟随的元素。是否注意到,脚会不由自主地随着音乐的节拍而动?这种现象没有逻辑上的解释,只是自然而然地融入音乐的节奏中,心灵开始与旋律产生共鸣。
设想一下,如果能够训练一个人工智能系统,使其像一样捕捉节奏,那将是多么酷的事情。一个有趣的应用是构建一个富有表现力的人形机器人,它运行实时节拍跟踪算法,能够随着音乐跳舞而保持同步。
本文将带了解节拍跟踪的概念,面临的挑战,以及解决问题的方法,包括行业的最新解决方案。
注意:本文假设已经具备了基本的Python音频数据分析知识。如果没有,可以先阅读相关文章,然后再尝试本文的内容。
音频节拍跟踪通常被定义为确定在音频录音中,人类听众可能会随着音乐敲击脚的时间点。音频节拍跟踪使得音乐的“节拍同步”分析成为可能。
作为一个重要且相关的音乐信息检索(MIR)任务,这个领域的研究非常活跃。自动节拍跟踪任务的目标是跟踪一系列声音文件中的所有节拍位置,并输出每个文件的节拍起始时间。
为了给一个直观的任务理解,下载并听一下下面的音频文件,并查看下面标注了相应节拍时间的音频。
节拍跟踪有许多应用,但对来说最有趣的是节拍同步的灯光效果。查看下面的视频以获得真实生活的演示。
从技术角度来看,节拍跟踪可以用于音乐信息检索任务,例如音乐转录。例如,可以标注鼓的节拍,然后与其它音乐创和爱好者分享。
节拍跟踪的其他应用包括:
节拍跟踪听起来像是一个直接的概念,但实际上它至今仍然是一个未解决的问题。对于简单的曲调,算法可能很容易从音乐中找出节拍。但在现实生活中,音频要复杂得多,可能会有噪音。例如,环境噪音可能会迷惑算法,导致在检测节拍时产生误报。
从技术角度来说,处理节拍跟踪时有三个主要挑战:
现在已经对音频节拍跟踪有了大致的了解。让来看一下用来解决这一挑战的方法。
每年有一个与ISMIR会议相结合的音乐信息检索算法评估活动,称为音乐信息检索评估交换(MIREX)。它有一个叫做音频节拍跟踪的任务。研究人员参与MIREX并提交他们的方法。这里将解释其中的两种方法。第一种是简单且最原始的,而第二种是最先进的。
假设有如下的音频:
能做的是,找出声音突然爆发的位置(即起始点),并标记这些时间点。这很可能是节拍的代表。但它会包含许多误报,比如人的语音声或背景噪音。因此,为了最小化这些误报,可以找到这些起始点的最长公共子序列来识别节拍。如果想了解动态规划的详细工作原理,可以
参考这篇文章
。
将查看下面的实现,以便有一个更清晰的视角。
# 导入模块
import librosa
import IPython.display as ipd
# 读取音频文件
x, sr = librosa.load('Media-103515.wav')
ipd.Audio(x, rate=sr)
# 方法1 - 起始点检测和动态规划
tempo, beat_times = librosa.beat.beat_track(x, sr=sr, start_bpm=60, units='time')
clicks = librosa.clicks(beat_times, sr=sr, length=len(x))
ipd.Audio(x + clicks, rate=sr)
不依赖于手动的声音线索,而是可以使用机器学习/深度学习方法。下面展示了解决节拍跟踪的框架架构。要深入了解,可以阅读官方研究论文。
这种方法的要点是——预处理音频信号,然后使用递归神经网络找出这些节拍时间的最可能值。研究人员还使用了一个递归神经网络(RNN)委员会,然后使用贝叶斯网络集成他们的输出。
madmom库包含了节拍跟踪领域各种最新算法的实现,可在github上找到。它结合了基于机器学习方法的低级特征提取和高级特征分析。方法2的代码在这个仓库中以python文件的形式提供,输出输入音频文件的节拍位置。
# 导入模块
import madmom
# 方法2 - dbn tracker
proc = madmom.features.beats.DBNBeatTrackingProcessor(fps=100)
act = madmom.features.beats.RNNBeatProcessor()('train/train1.wav')
beat_times = proc(act)
clicks = librosa.clicks(beat_times, sr=sr, length=len(x))
ipd.Audio(x + clicks, rate=sr)
让深入了解刚刚看到的方法。要从音乐信号中获取音频节拍,需要执行以下四个步骤:
步骤1:预处理音频信号
与所有非结构化数据一样,人工智能系统不容易理解音频信号的概念。因此,它必须被转换成机器学习模型可以理解的格式(即预处理数据)。如下面的图片所示,有相当多的方法可以用来预处理音频数据。
步骤2:训练和微调RNN模型
现在已经预处理了数据,可以应用机器学习/深度学习模型来解读数据中的模式。
理论上,如果用足够的训练样本和适当的架构训练一个深度学习模型,它可能在问题上表现良好。但这并不总是可能的,原因包括训练数据不足等。为了提高性能,可以训练多个RNN模型在单一音乐文件类型上,以便它能够捕捉该类型的模式。这有助于缓解一些数据不足的问题。
对于这种方法,首先训练一个LSTM模型(RNN的改进版本),并将其设置为基础模型。然后微调多个从基础模型派生的LSTM模型。这种微调是在不同类型的音乐序列上进行的。在测试时,从所有模型中传递音频信号。
步骤3:选择最佳RNN模型
在这一步,简单地选择在所有模型中误差最小的模型,通过将它们与从基础模型获得的分数进行比较。
步骤4:应用动态贝叶斯网络
无论使用一个LSTM还是多个LSTMs,都有一个基本的缺陷:最终的峰值寻找阶段并不试图在选择节拍的最终位置时找到全局最优解。它只是确定作品(或一定长度的片段)的主要节奏,然后根据这个节奏对齐节拍位置,简单地选择最佳起始位置,然后逐步在预确定位置周围的某个区域内定位具有最高激活函数值的节拍位置。
为了解决这个问题,将所选神经网络模型的输出输入到动态贝叶斯网络(DBN)中,该网络联合推断节拍序列的节奏和相位。使用DBNs的另一个优点是,能够模拟节拍和非节拍状态,这被证明比只模拟节拍状态的情况表现得更好。不会详细介绍DBNs的工作原理,但如果感兴趣,可以
参考这个视频