音乐自动剪辑算法

音乐自动剪辑算法

前言

随着移动互联网在国内的飞速发展,移动音乐作为国内最受欢迎的娱乐休闲方式之一也得到飞速的发展,有包括酷狗、QQ、酷我等在内的全用户覆盖的音乐软件,又有像网易云、虾米等在内的有着较高用户针对性的产品。移动音乐是指依托手机、平板电脑等可移动设备,通过移动通讯网络或互联网进行传输的音乐,以app为载体的移动音乐涵盖音乐播放器、音乐电台、音乐铃声、音乐娱乐、音乐学习等层面以及游戏、秀场等领域。

据中国产业调研]网发布的中国移动音乐行业现状研究分析及市场前景预测报告(2020年)显示,在各类应用的使用率排行中,音乐类应用在休闲娱乐类的软件中排在第一位。排在前三名的依次是即时通讯89.3%、搜索引擎80.3%和新闻资讯79.6%。除却网民在移动互联网上的交互和资讯获取等基本需求外,网民对于音乐的需求较高。

除开普通用户对于音乐的需求,现兴起的短时频、直播行业同样对音乐有着很大的需求因此对于音乐售卖方,能够提供一个片段让用户进行试听选择的功能至关重要。音乐自动剪辑功能的目的就是剪辑出一个高潮片段来供用户试听缩小选择音乐所需的时间,且还能够提供彩铃的功能。

实现原理

副歌(英文为Refrain或Chorus)是歌曲中一句或一段重复的歌词。通常出现在几段正歌(英文Verse;中文又称作主歌)之间。叫副歌,因为有个相对的“正歌”,不管是长度还是内容上来说,副歌在长度、旋律、节奏和情感上均与正歌形成反差。为歌曲曲调提供变化性。

副歌与正歌一起组成正副歌形式,作为流行音乐中最重要最常用的音乐形式之一 。副歌采用重复的形式,在歌曲中通常位于情感上的高潮部分,以其概括性令听者易于记忆。一般作曲者也会先写出副歌部分,再进行正歌的创作。为了让整体的关系更加紧密,许多流行曲也会编写导歌(英文Pre-Chorus)作为两者之间的联系,即由正歌至导歌后才到副歌,作为副歌预先作好铺排,从而丰富副歌歌词所表达的内在含意。

因此对于一般的流行音乐高潮部分一般位于歌曲的副歌中,本文以一种由相似矩阵查找副歌的开始时间,进而使用能量窗口挑选出高潮片段。

具体实现

副歌定位

首先将音频文件读取到内存中,并提取音频的色谱图(chromagram),如下图所示:

image

假设我们拥有一首5分钟的音频文件,设置0.2秒为一帧。那么我们会得到一个1500 x 12的二维矩阵,它代表该音频的色谱图

image

此时我们将歌曲转变为一个包含12个音符的帧的集合,所以我们需要一个相似性函数来比较任何给定的歌曲帧。如果 V1V2 是这首歌任意两个例子中的12个音符向量,那么我们将使用以下相似函数:
sim(V_1,V_2)=1-{||V_1-V_2||\over 12}

这样我们将2帧之间的相似度限制在0-1区间内,且相似度越大代表这2帧越相似。

通过相似函数我们就可以对整个色谱图构造出一个按照时间维度上的相似矩阵M
M[x][y]=sim(x,y)

矩阵M还有以下2个特征:

  1. 该矩阵以对角线对称相等,也就是说有
    M[x][y]=M[y][x]
  1. 对角线的值都是1,因为对角线上是该帧与自己的相似度计算因此都是1

M[x][x] = 1

如下图,排除大矩阵对角线外的直接外拥有高亮直线的地方都代表了相似如框中02:30-03:0000:45–01:15存在相似。

image

在矩阵运算中,对角线相对比较难判断。因此采用一个延时矩阵T通过线性变换将斜线变为直线:
T[x][y]=M[x][x-y]=sim(x,x-y)

最终我们得到延时矩阵T,再经过去噪(指定一个阈值过滤低于该阈值的值)和平滑处理后可以得到包含多条高亮直线的直方图,下图展示的是图4中区间中局部结果,可以发现原本对称的高亮斜线已经被拉伸为直线。

image

最后,我们需要挑选出一个最佳的副歌区域。

将所有直线按照时间点进行统计,如果某一时刻出现的线条数按照加权和计算最终得到每一条直线的权重,并最终选择权重最大的那一条作为副歌区域。

假设一条直线从x开始y结束每一个时间点含有的重叠线条数为nn\in[j,k]。定义每一条直线的权重值为δ
W_(x,y)=\sum_{i=x}^y \sum_{n=j}^k δ
通过上述算式就能够查找到副歌区域。但是该算法不适用于节奏不一致的音乐,例如早期没有节拍器由由鼓手来计时的音乐,歌手主歌副歌歌唱速度不一致或者副歌部分很短的歌曲等。针对这种情况我们将不能获得副歌的起始位置只能跳过该步骤直接查找高光片段。

检索高光片段

检索高潮片段的原理很简单:我们采用加窗比较窗口中能量大小得到能量最大的片作为高潮片段,然后再用小窗口对起点进行微调。

假设文件采样率fs、原始信号为S,使用最小切片时长t,得到窗口大小设为Ws
W_s=t*f_s*\alpha
其中α是一个大于1的常量,这里我们设置为1.5也就是说窗口大小应该大于剪辑限制因为我们还需要对起始位置进行微调。

首先将信号S按照窗口大小划分为多个片段然后计算每一个窗口中能量我们的平均能量值
E = \frac {\sum_{i=n}^{n+W_s}||S||} {W_s}
最终选择平均能量值最大的那个窗口为高潮片段得到高潮部分的起始时间点S_E ,使用一个小窗口对起始时间点前后进行微调。使用小窗口的目的是为了检测一句话或一个旋律的开始部分它应该是一个短暂的停顿因此这里我们使用长度为0.5秒的窗口。
W_q=\beta *f_s, \beta=0.5
检测范围为[S_E-r,S_E+r],其中r代表滑动检测区域。按照上述计算平均能量的方式计算每个小窗口的平均能量。但不同的是这次取平均能量的最小值作为按照能量微调后的起始时间点。

按照上述方法在高能量片段起始点检测平均能量最小点作为一段旋律的开始点,并按照该方法检索结束位置即可。

结论

综上,我们使用副歌查找加高光片段检索的方式来实现了歌曲自动剪辑功能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容