改进音高轮廓创建和选择的旋律提取算法
2018-10-16于凤芹
李 强,于凤芹
(江南大学 物联网工程学院,江苏 无锡 214122)(*通信作者电子邮箱1944189618@qq.com)
0 引言
旋律作为音乐的灵魂,越来越引起研究者的关注,旋律的提取也成为音乐信息检索(Music Information Retrieval, MIR)领域的研究热点之一。旋律是单音高序列,即倾听者能够以该序列作为基准采用哼唱或吹口哨的方式重现音乐片段,或者倾听者会自然而然地将其识别为音乐的本质或核心[1],物理表示为对应主音中感知音高的基频值(F0)序列[2]。在音乐信息检索[3-4]、歌手识别[5]、音乐识谱[6-7]、以及音乐流派分类[8]等方面有广泛的应用。
音乐旋律的提取方法分为基于源分离和基于音高显著性两大类[9]。后者一般直接对音频信号计算音高显著性,然后根据不同的方法提取旋律音高。文献[10]提出源/滤波器模型的方法计算音高显著性,然后采用维特比平滑的后处理算法得到旋律音高线;该模型提高了音高估计精度,但是算法计算音高显著性的复杂度很高,并且对含有大量无声帧的音乐效果很差。文献[11]提出基于谐波和(Harmonic Summation, HS)的方法计算音高显著性,然后采用听觉流线索[12]的方法创建音高轮廓,通过对音高轮廓的各特征分布特性设计滤波规则来滤除非旋律音高轮廓,降低了计算音高显著性的复杂度;但是当计算新的音高轮廓特征时,该算法必须重新设计滤波规则。文献[13]提出采用机器学习的分类算法自动选择旋律音高轮廓,克服了重新设计滤波规则的缺点;但是该算法采用HS计算音高显著性,相较于源/滤波器模型,取得的音高估计精度较低。文献[14]提出将源/滤波器模型和HS相结合计算音高显著性,提高了音高估计精度;但是该算法只针对具有时间重叠的音高轮廓采用基于概率的大小来选择旋律音高轮廓,并没有区分含有倍频错误的音高轮廓。
为了提高音高估计精度和减少倍频错误,本文从音高轮廓的创建、旋律音高轮廓的选择以及后处理三个部分提出改进音高轮廓创建和选择的旋律提取算法。首先,采用HS和源滤波模型相结合的方法计算音高显著性,得到旋律音高候选;然后,在采用基于时间和音高保持连续的听觉流线索创建音高轮廓的基础之上,提出利用音高显著性的连续性,即将听觉流线索和音高显著性的连续性相结合创建音高轮廓,减少因不同声源的相互干扰而导致同一声源音高序列的不连续;通过计算音高轮廓的统计特征并采用该特征训练的随机森林分类器选择旋律音高轮廓,考虑到伴奏一般用于主音的修饰或作音乐片段的重复,提出利用伴奏的重复特性进一步选择旋律音高轮廓,由于重复特性在音高轮廓集中表现为不同时间上具有等长且等音高的音高轮廓,将采用动态时间规整(Dynamic Time Warping, DTW)算法计算音高轮廓间的相似度,减小因音符长度的不同而引入的非线性偏差;最后,根据相邻音高轮廓间的长时关系,提出基于相邻音高轮廓每一帧的音高加权均值在时间上的平均检测倍频错误,并利用维特比平滑算法平滑旋律音高轮廓形成旋律音高线。
1 基本原理
1.1 基于听觉流线索和音高显著性的连续性创建音高轮廓
由于不同声源的相互干扰,采用基于时间和音高保持连续的方法创建的音高轮廓将会同时出现不同声源的音高,为了提高同一声源音高序列的连续性,将听觉流线索和音高显著性的连续性相结合创建音高轮廓。
创建音高轮廓时,为了减少非旋律音高轮廓的创建,将删除音高显著性满足式(1)的时频点。
(1)
其中:μs和σs分别为音高显著性的均值和标准差;τσ是界定滤波器低于μs的偏差程度;s[t]为帧t内的音高显著性,smax[t]为帧t内的最大音高显著性;τ+是一个比例参数。
为了跟踪时频点形成音高轮廓,首先选择具有最大音高显著性的点作为起始点(t,pt);根据听觉流线索方法,对t+1帧计算满足式(2)的音高集;然后,为了利用音高显著性的连续性,对该范围内的音高计算与起始点的音高显著性差值和音高差值,将满足两差值的绝对值之和最小的音高作为t+1帧的音高值,如式(3)。对起始点重复上述步骤计算t+2帧的音高值,以此类推,形成音高轮廓,否则重新选择起始点重复上述步骤形成新的音高轮廓。
(2)
(3)
在创建音高轮廓过程中,当伴奏和主音的音高相近时,采用时间和音高保持连续的方法将无法区分两者的音高。所以,本节从音高显著性的连续性角度,将两者相结合以进一步区分旋律候选音高。
1.2 基于伴奏重复特性选择旋律音高轮廓
DTW是一种非线性匹配算法,可以处理发音长短不一的模板匹配问题。该算法主要是为了寻找一个时间规整函数j=w(i),将序列T(i)的时间轴i非线性地映射到序列R(j)的时间轴j上,并使该函数w满足式(4)。
(4)
其中:d[T(i),R(w(i))]是序列T的第i个元素和序列R的第j=w(i)个元素之间的距离测度,则D[T,R]是处于最优时间规整情况下两序列之间的累积距离。
伴奏的重复特性在音高轮廓集中表现为不同时间上具有等长且等音高的音高轮廓,反过来,满足一定周期性的音高轮廓属于伴奏,即将音高轮廓按周期平移后,能找到一音高轮廓与之近似相等,如式(5)。利用这一思想,提出一个两阶段方法从旋律音高轮廓集中去除非旋律音高轮廓:第一阶段,从非旋律音高轮廓集中得到满足式(5)的音高轮廓;第二阶段,遍历旋律音高轮廓集,去除集合中与该音高轮廓近似相等的音高轮廓。整个过程被描述见算法1。
(5)
算法1 基于伴奏重复特性选择旋律音高轮廓。
根据验证集上的最大综合评价指标设置的似然性阈值F1,将音高轮廓划分到旋律音高轮廓集P1={C1,C2,…,CM}和非旋律音高轮廓集P2={C1′,C2′,…,CN′};
将伴奏的重复周期范围设置为T∈[1,5]s;
for 每一个Ci′∈P2do
ρ=0;
for 每一个Cj′∈P2(i≠j,Ci′和Cj′没有时间重叠) do
if |len(Ci′)-len(Cj′)|≤Δυthen
采用DTW算法计算Ci′和Cj′之间的相似度SD;
ρ++;
endif
endif
endfor
ifρ>0 then
for 每一个Ck∈P1(Ci′和Ck没有时间重叠) do
采用DTW算法计算Ci′和Ck之间的相似度SD;
从集合P1中删除音高轮廓Ck;
endif
endif
endfor
endif
endfor
returnP1;
由于音高轮廓集P1和P2是根据音高轮廓和实际旋律线的音高重叠率进行划分的,所以音高轮廓无论被标记为什么类型的轮廓,音高轮廓中都会含有一定数量的旋律音高,导致分类器给出误分类。所以,本节利用伴奏具有的重复特性,进一步去除P1中的非旋律音高轮廓。
1.3 倍频错误的检测
根据以下假设[11]提出基于相邻音高轮廓的长时关系检测倍频错误:旋律音高轮廓的音高显著性均值要大于其倍频处的音高显著性均值,以及旋律倾向于有一个连续的音高序列,避免大的音高跳跃。
首先,为了找到发生倍频的音高轮廓,搜索满足时间重叠以及在重叠时间内轮廓音高距离的均值满足倍频程的音高轮廓对;然后,对倍频音高轮廓的重叠区域向前和向后分别延伸两个重叠时间,根据式(6),计算这两个时间段内每帧的音高加权均值,体现正确旋律音高轮廓有很大的音高显著性;为了利用音高轮廓间的长时关系,根据式(7),计算音高加权均值在两个延伸时间段内的均值;最后,去除音高均值远离上述均值的倍频音高轮廓。
(6)
其中:pt为对应帧t的音高,spt为时频点(t,pt)的音高显著性,SSt为帧t的音高显著性和,Wt为帧t的音高加权均值。
(7)
2 算法实现
算法框图如图1所示,具体步骤如下:
1)采用等响度滤波器处理音频,增大听觉敏感的频率范围;对音频信号进行短时傅里叶变换(Short Time Fourier Transform, STFT),为得到精确的频率和幅度值,采用相位声码器[15]进行频率/幅度纠正,提取每帧的频谱峰值。
2)将HS和源滤波模型相结合计算音高显著性,提取每帧的音高显著性峰值。
3)将式(1)滤除的时频点存储在S-,剩余的点存储在S+;将S+中满足最大音高显著性的点(t,pt)作为起始点添加到Ch;从Ch中当前点的下一帧出发,搜索S+中与起始点的音高差满足式(2)的时频点集,对搜索到的时频点计算其与起始点的音高差值Pd和音高显著性差值Sd,根据式(3),将满足(|Pd|+λ|Sd|)最小的时频点添加到Ch,并从原集合S+中删除;对Ch中当前点的下一帧重复上述步骤,直到在原集合S+中没有满足式(2)的时频点;考虑到被掩蔽的时频点可能位于S-,按上述步骤搜索S-,当跟踪长度位于100 ms范围内,将得到的时频点添加到Ch,重新回到S+重复上述步骤,否则,去除S-中的音高跟踪,将Ch添加到集合C中,并将起始点从S+中删除以及Ch清零;在S+中重新寻找满足最大音高显著性的点重复上述步骤,直到S+中没有剩余点;C即为形成的音高轮廓集。
4)计算关于时间、音高、音高显著性等音高轮廓统计特征,然后利用音高轮廓标签特征和统计特征训练的随机森林分类器选择旋律音高轮廓。
5)根据算法1,从旋律音高轮廓集P1中进一步去除非旋律音高轮廓。
7)利用维特比平滑算法平滑旋律音高轮廓形成旋律音高线。
图1 改进音高轮廓创建和选择的旋律提取算法
3 仿真实验与结果分析
为了验证本文算法的有效性,通过仿真将本文算法、SAL算法[11]和C3算法[14]在音乐数据集ORCHSET[16]上进行对比分析。数据集ORCHSET作为音乐信息检索评测(Music Information Retrieval Evaluation eXchange, MIREX)比赛的测试数据之一,由交响乐、交响诗、芭蕾舞套装和其他由交响乐团演奏的音乐形式,共由64个wav格式的音频录音组成,采样率为44.1 kHz,音乐持续时间的范围为10~32 s,并且该数据集将每一首音乐的左声道和右声道以平均的形式合并为单声道。对比算法将会在Inter Core i3-3234 3.4 GHz CPU、2 GB RAM的硬件环境,以及Windows 10、Python 2.7、Ubuntu1 4.04的软件环境下运行。
实验将数据集随机划分为63%的训练集、12%的验证集和25%的测试集。为了解释最终结果的偏差,采用四次不同的随机划分重复每一次实验。
算法评价指标采用MIREX的评价方法,对于音高估计的评价采用原音高精度(Raw Pitch Accuracy, RPA),即正确估计的基频个数占真实基频个数的比例;原色度精度(Raw Chroma Accuracy, RCA)表示将估计的音高值映射到一个八度范围内,计算正确估计的基频个数占真实基频个数的比例;对于有声和无声帧的检测采用声音召回率(Voicing Recall rate,VR)评价,即正确估计的有声帧的个数占真实有声帧个数的比例;声音虚警率(Voicing False Alarm rate,VFA)表示错误估计的有声帧个数占真实无声帧个数的比例;而对音高估计和帧检测两者总的评价采用总精度(Overall Accuracy,OA),即正确估计的帧和音高个数占真实帧和音高个数的比例。
为了验证本文在创建音高轮廓、选择旋律音高轮廓以及后处理阶段提出的各方法的有效性,将各方法分别组合进行仿真实验得到表1。
表1 各阶段的方法及其组合在总精度上的对比结果
从表1可以看出,本文提出的创建音高轮廓方法相比听觉流线索提高了0.98个百分点的总精度;在本文的创建音高轮廓方法基础之上,基于伴奏重复特性的音高轮廓选择方法提高了1.6个百分点的总精度,倍频错误的检测方法提高了2.47个百分点的总精度,说明了该类型的音乐数据满足伴奏的重复特性以及含有一定的谐波特性;对比OA列的起始和结束行得出本文算法提高了3.32个百分点的总精度,说明了本文方法的有效性。
仿真实验得出SAL算法、C3算法和本文算法的评价指标在测试数据集上的均值结果如表2所示。
表2 各算法的评价指标在测试数据集上的均值结果
从表2可以看出,相对于SAL算法,C3算法在OA上提高了21.57个百分点,而本文算法在OA上较C3算法提高了3.32个百分点;从RPA结果可以看出,本文算法提高了音高估计精度,观察RPA和RCA两列的差别,从上到下分别为30.42个百分点、17.9个百分点和8.72个百分点,本文算法得到了最小的差别,表明了本文提出的倍频错误检测方法的有效性;对比表2中三种算法的VR和VFA两列,得出想要提高有声帧的召回率,那么相应地将会提高有声帧的错误率;由于本文算法进一步选择旋律音高轮廓以及进行后处理步骤,得出本文降低了有声帧的召回率。
为了可视化各算法在音乐数据集上的效果,得到各算法提取的旋律音高线的对比如图2,其中灰色线段为算法估计的旋律,而黑色线段为真实旋律。为了提高可视化的可对比效果,将各算法提取的旋律音高在原基础上提高一个倍频程,真实旋律的音高保持不变,并且采用虚线连接部分音高轮廓(虚线点不代表音高)。
从图2可以看出,大部分的音高错误都集中在5~15 s以及20~28 s的范围内,是音高变化相对频繁的区域;而图2(a)的SAL算法在该范围内给出了近90%的错误,即算法对该类型的数据效果很差;对于图2(b),C3算法在10~15 s以及23~28 s的范围内丢失了大量的音高轮廓,说明该算法在该范围内将正确的音高轮廓划分为非旋律轮廓;而图2(c)中的本文算法则在该范围内给出了正确的音高轮廓,但是算法在5~10 s以及20~22 s的范围内产生了少量的倍频错误和一部分音高轮廓的丢失。
图2 各算法提取的音高旋律线与真实旋律的对比
4 结语
本文针对旋律音高线包括不同声源的音高而导致音高估计精度降低,以及在音高轮廓分类之后,如何进一步选择旋律音高轮廓的问题,提出改进音高轮廓创建和选择的旋律提取算法。算法在采用听觉流线索方法创建音高轮廓的基础上,利用音高显著性的连续性,降低音高轮廓包括不同声源的音高,并通过伴奏的重复特性进一步去除旋律音高轮廓中的非旋律音高轮廓,以提高旋律音高轮廓的区分精度。实验结果表明,所提算法可有效提高音高估计精度和总精度。仿真实验结果表明,该算法提高了音高估计精度,减少了倍频错误,但是总精度却只达到了53.64%,说明本算法还有很大的完善空间,下一步将考虑引入音色特征,进一步提高音高轮廓的区分精度。