4

QQ音乐超嗨DJ之节拍检测算法

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI1NjEwMTM4OA%3D%3D&%3Bmid=2651233091&%3Bidx=1&%3Bsn=ac04808f45d9e12a6ddddb5ea099be9a
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1. 什么是节拍?

节拍(beat)是音乐在时间上的基本单位,它指强拍和弱拍的组合规律。如每隔一个弱拍出现一个强拍时是一种节拍,每隔两个弱拍出现一个强拍时是另一种节拍。当我们在听一首歌时,总会不自觉的摇头晃脑,或跟着节奏抖腿,或击掌打拍子,这些动作的时刻点,对应到音乐的时间里,就是节拍了。

2. 应用方向

  1. 音频可视化:如根据音频的节拍变换切换视频场景

  2. 游戏方向:如节奏大师、beatmaps

  3. 音乐风格化:如QQ音乐的超嗨DJ

3. 节拍检测算法

如开源的librosa采用节拍检测算法librosa.beat.beat_track,是基于动态规划算法实现的,其参考文献是:Ellis, Daniel PW. “Beat tracking by dynamic programming.” Journal of New Music Research 36.1 (2007): 51-60.

其实现过程主要是以下3个步骤:

  1. Measure onset strength

  2. Estimate tempo from onset correlation

  3. Pick peaks in onset strength approximately consistent with estimated tempo

3.1 Onset检测

音符起始点检测(onset detection)是音乐信号处理中非常重要的一个算法。节拍和速度(tempo)的检测都会基于音符起始点的检测。Onset一般发生在 能量/音高/音色 改变的时刻,一般情况下也是能量变大的时刻。这块主要涉及到的方法有:时域分析,计算能量函数,通过计算波形文件的能量累积,找到突变点。但是多声部曲子因为有多个乐器演奏很难通过能量函数突变来找到起始点。频域分析,不同乐器在频谱上位置是不一样的,通过计算频谱能量变化来得到突变。

常见的使用数字信号处理进行节拍检测的流程如下:

NZNVFrV.png!web

接下来,通过下图进行直观理解,介绍Onset Event detection在时域 & 频域的过程。

采用的音频为卡农的钢琴版和小提琴版,从图可以看出,敲击乐有明显的能量起伏变化,而弦乐则不明显。

  1. 基于时域能量包络:

    eiaeq2z.png!web

  2. 基于频域短时频谱:

    yQZj2qu.png!web

其具体原理如下表所概况,以及从上图可看出,基于频域的效果更佳,有更好的鲁棒性。

方案 原理 适用场景 不适用场景 基于时域能量包络 1. 信号的能量包络;
2. 能量包络的差分;
3. 获取峰值得到onset. 音符的起始能量突出,如打击/弹拨类乐器。 对弦乐/复杂混音(多乐器及人声场景)效果不佳。 基于短时频谱 1. 短时频谱;
2. 差分短时频谱;
3. onset包络;
4. 获取峰值得到onset. 音符的起始能量突出,如打击/弹拨类乐器,以及较简单的混音。 对复杂混音(多乐器及人声场景)效果不佳。

3.2 动态规划

通过上一节的onset detection的结果,将作为beat tracking的候选点。

这里主要介绍librosa采用的方法。

C(t):  目标函数。
O(t):  onset detection得到的onset energy。
F(t):   beats序列间隔与全局tempo之间一致性的评价函数。

7FRjUjV.png!web

VBfERjM.png!web

通过以上2个公式,推导出  :

2mu2uur.png!web

以上即可通过动态规划进行求解了。

Librosa所采用的方法在tempo基本稳定时表现较好,否则,表现比较差。主要其在进行beat估计时,第3步需要采用第二步得到的tempo (Estimate tempo from onset correlation)。

我们来看看librosa具体的表现效果。

从下面3个图可以看出,在敲击乐(piano)表现很好,在弦乐(violin)表现差,在人声较强节拍弱的音频,表现很不理想。

rUzemez.png!web

mANfErA.png!web

zIZ7jeA.png!web

对于人声较强节拍弱的这部分音频,如何更好的进行beat估计呢?

现在越来越多的深度学习已经在节拍检测上表现出更大的优势。

3.3 深度学习

我们主要通过深度学习,对节拍(beat)和重拍(downbeat)进行了检测。具体实现框架如下:

imUrymn.png!web

从下图可以看出,此网络对beat 和 downbeat 的估计表现很好。

JBJZNrm.png!web

4. 超嗨DJ

最近QQ音乐上线了超嗨DJ功能,可以自动地将一首歌曲电音化,将一首节奏感不强的歌曲变得更有动感,节奏更嗨 。

uYFVJzq.png!web

算法先使用MIR技术计算歌曲的特征信息,包括BPM、Beat、DownBeat、Chord、TimeSignature以及副歌时间点,然后以此信息为基础,设定混音规则和选取混音采样,通过规则和采样的不同组合得到几个不同的混音模板;在歌曲的播放过程中,先对原始歌曲进行变速处理,再通过设定的模板以及歌曲beat信息实时生成需要进行混音的各Loop音轨数据,然后通过一定的调制方式将生成的音轨数据与原始数据进行混合;最后针对混合的数据进行全局调制得到最后输出的电音歌曲。方法的整体处理流程下图所示:

QFjAZvy.png!web

5. 结语

本文介绍了QQ音乐基础开发组团队的节拍检测方案,属于MIRnest系统的一部分,以及客户端开发团队的超嗨DJ技术。希望大家多多体验QQ音乐的超嗨DJ功能,有新的想法或建议,欢迎交流,谢谢!

6. 参考

1. Ellis, Daniel PW. “Beat tracking by dynamic programming.” Journal of New Music Research 36.1 (2007): 51-60


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK