一种乐音音符识别方法
技术领域
本发明属于数字音频处理技术,涉及乐音识别方法,具体为一种乐音音符识别方法。
背景技术
乐音识别技术在音乐作品数字化、音乐创作及音乐数据库检索领域中有广阔的应用前景。乐音识别的关键在于单音符的识别,该识别通常通过估计乐音的基音频率(简称基频)来实现。基音频率是音频的一种基本特征,它为发音体整体在一定时间内的振动次数,频率越高则音调越高。基音频率直接决定了乐音的音符和旋律。
现有的基频估计方法大体可分为有参数和无参数两大类:
有参数的基频估计方法利用音频信号及其特征来训练特定的数学模型,如语音参数模型、高斯混合模型、隐马尔科夫模型、神经网络模型等等,然后根据最小均方误差(MMSE)或最大似然(ML)准则来计算模型参数,从而估计出基频。该类方法一般涉及复杂的训练过程,计算量较大。
无参数的基频估计方法不需要建立明确的数学模型,而是直接根据信号在时域或频域上的特征来估计基频。通常该类方法的计算复杂度不高,适合于有实时要求的应用。在时域方法中,RAPT和YIN是两种应用比较广泛的算法。RAPT计算信号自相关函数,提取候选的基音频率,再使用动态规划从候选频率中选取全局最优的基频序列;而YIN算法则是使用平方差函数提取候选的基频。在频域方法中,典型的方法是利用基波(或基音)和其整数倍谐波(或泛音)的能量关系来估计基频,如梳状滤波方法设计通带中心频率与泛音序列相匹配的滤波器;谐波叠加(SHS)方法则计算各种可能的基音及其泛音的能量之和,选择能量和最大的频率作为基音频率。
虽然音符识别技术有了质的发展,但由于音乐信号本身的复杂性和多变性,以及各种应用环境因素的影响,现有方法的性能并不太理想,音符识别还存在如下几个问题:(1)由于基音的能量可以比其泛音的能量低,甚至很低以至出现“基音消失”的现象,这使得利用频谱能量来寻找基音的方法失效;(2)低频段的基频估计是一直存在的难点问题,这主要由于低频段的基音间隔小,要求算法具有很高的频率分辨率;另外,基音消失也时常发生在低音部分。在实际的应用中,如对现场演奏的录制音频进行识别时,人为敲击乐器带来的干扰声、背景噪声等因素都会使低频基音的识别变得更加困难;(3)识别性能好的算法往往计算复杂度高,不能满足实时性的要求。
发明内容
本发明的目的在于针对背景技术存在的问题,提供一种可靠且快速的乐音音符识别方法。本发明的技术方案是:一种乐音音符识别方法,包括如下步骤:
将音频数据按固定长度划分为各音频帧;
S1.计算音频参数:
S11.对各音频帧数据加窗,进行短时傅里叶变换,得到音频帧的频谱;
S12.搜寻频谱幅度的最大值Amax及其对应的最大频率fmax,将fmax映射为标准MIDI(Musical Instrument Digital Interface)音符Nmax;
S2.静音判断:将Amax与设定的幅度门限进行比较,若小于该门限,则判定当前帧为静音,不作音符识别,跳至S1处理下一音频帧;
S3.筛选局部极大点:
S31.搜寻音频帧频谱幅度的局部极大点作为初级局部极大点;
S32.将初级局部极大点对应的频率值映射为标准MIDI音符,将映射为相同音符的频率点作为一组,对每个频率点组,选出幅度值最大的频率点作为筛选出的二级局部极大点;
S4.统计频率差模式:
S41.初始化幅度参考值:R=Amax;
S42.扫描二级局部极大点,保留幅度值大于R的频率点;
S43.统计保留下来的频率点的数目mf,若mf大于设定阈值Tnum(20≤Tnum≤40),则结束整个扫描,跳至S5;
S44.计算保留下来的相邻频率点间的频率差;
S45.对频率差逐个进行考察,对满足条件的频率差的出现次数进行累加统计:若频率差f对应的MIDI音符为Nmax,则将f出现的次数累加到f所对应的计数器中;
否则,进行以下统计:若f连续出现n次(n≥2),则将n-1累加到f所对应的计数器中,在统计连续出现次数时,f的后续频率若为f的2倍频,则视为f进行统计;
S46.更新幅度参考值:R=R-η·Amax,其中0.005≤η≤0.02,跳至S42,开始下一次扫描;
S5.确定音符:
将累加值大于设定阈值Tacc(4≤Tacc≤6)的所有频率差映射为MIDI音符,将其组成当前音频帧的“疑似音符集”;判断“疑似音符集”是否为空,若为空,则设置当前音频帧的音符为Nmax;否则,遍历“疑似音符集”,将累加值最大的频率差所对应的MIDI音符作为当前音频帧的音符;
S6.修正音符:对乐音的过渡带的音频帧进行音符修正;
S61.确定各音符的起始帧
S611.设置各静音帧的音频能量为0,计算各非静音帧的能量Ei(i为帧编号)和其最大值Emax,并将Ei进行如下归一化:
计算归一化后非静音帧的整体平均能量
S612.计算所有音频帧能量的局部极大点和局部极小点;
S613.计算每个局部极小点与其相邻的局部极大点的能量差,选择能量差大于E/2的局部极小点,将其对应音频帧的下一帧作为一新音符的起始帧;
S62.对音符起始帧及其前后两音频帧进行音符修正:
S621.对当前起始帧与前一起始帧之间的所有音频帧,找到其“疑似音符集”中出现次数最多的音符,将该音符作为当前起始帧前一音频帧的音符值;
S622.对当前起始帧与后一起始帧之间的所有音频帧,找到其“疑似音符集”中出现次数最多的音符,将该音符作为当前起始帧及其后一音频帧的音符值。
需要说明的是:所述阈值Tnum为经验阈值,优选的范围为:20≤Tnum≤40;所述阈值Tacc为经验阈值,优选的范围为:4≤Tacc≤6;所述乐音的过渡带即为从一个音符转换为另一个音符的过渡音频段。
本发明的有益效果:本发明方法提高了低频段音符识别的性能,增强了在基音消失、噪声干扰等非理想情况下识别的鲁棒性(robust),且算法简单,处理快速,适合于设备处理能力不高且有实时要求的乐音识别应用,如在手机、掌上电脑等移动终端上实现对演奏乐曲的现场评分。
附图说明
图1为本发明乐音音符识别方法的流程示意图。
图2为本发明乐音音符识别方法中统计频率差模式的流程示意图。
图3为实施例中测试音频时域波形图。
图4为实施例中测试音频第25帧的频谱图,其中(a)为第25帧的0~4K Hz的频谱图,(b)为0~1860Hz的频率部分进行了放大显示图。
图5为Melodyne软件和本发明乐音音符识别方法的识别结果图,其中(a)为Melodyne软件识别结果,(b)为本发明识别结果。
具体实施方式
实施例
本实施例以一段实际弹奏并录制的钢琴音频作为输入。录制音频以wav文件保存,其采样率为8K Hz。在实际应用中,若输入音频的采样率不为8K Hz,可先进行采样率转换,将采样率转换为8K Hz再进行后续处理。该实例音频时长为39秒,包含了7个完整的八度音程,即从音符A2(对应27.500Hz)到音符g4(对应3322.437Hz)的84个音符,其时域波形图如图3所示。下面以第25帧为例,对其进行音符识别的具体步骤为:
将音频数据按2048个采样点的长度等分为各音频帧,其总帧数为305帧。
S1.计算音频参数:
S11.对各帧数据加汉明窗后进行短时傅里叶变换,得到音频帧的频谱。图4(a)给出了第25帧的0~4K Hz的频谱图,图4(b)是将其中的0~1860Hz的频率部分进行了放大显示。该帧的基音频率为39.06Hz,对应的MIDI音符为27,其位置在图中用椭圆标出。从图中可以看到,基音的幅度值相对于整个频谱的幅度峰值来说是非常低的,而基音的各高次泛音幅度较大,且对应频谱的峰值位置。各泛音间的相对位置隐含着基频信息,这是本发明方法得以提出的基础。
S12.找到频谱幅度的最大值Amax=185.42,它对应第61个频率点,其频率fmax=238.28Hz。按照频率f与标准MIDI音符N之间的映射公式
将频率fmax映射为标准MIDI音符Nmax,得到Nmax=58;
S2.静音判断:静音幅度门限设为1.5,由于Amax大于门限1.5,故判定当前帧不为静音,继续执行后续步骤;
S3.筛选局部极大点:
S31.搜寻音频帧频谱幅度的局部极大点,找到第2、5、7、9、12、…1023等273个频率点,将其作为初级局部极大点;
S32.将第2、5、7、9、12、…1023等273个频率点对应的频率值映射为1、15、21、25、30、…107等标准MIDI音符,将映射为相同音符的频率点作为一组,对每个频率点组,选出幅度值最大的那个频率点作为筛选出的二级局部极大点,经过该步骤,筛选出2、5、7、9、12、…1019等65个二级局部极大点。
S4.统计频率差模式:通过对筛选出的二级局部极大点的多次扫描来统计出现的各种频率差模式。设R为扫描使用的幅度参考值,其值从Amax开始,以η·Amax的步长逐次均匀递减,即R=R-η·Amax,设置η=0.01。
S41.初始化幅度参考值:R=Amax=185.42;
扫描一共进行了99次,下面以第95次扫描为例进行说明。在第94次扫描结束,R降至11.13,出现的频率差数目共有7个,其中频率差10对应的累加数(即频率差10的计数器的计数值)最大,其值为9。在此基础上,进行如下步骤:
S42.将二级局部极大点逐个与R进行比较,保留幅度超过R的频率点,则保留下来的频率点有41、51、61、71、102、112、123、133、144、154和287等11个;
S43.将频率点数目mf=11与设定阈值Tnum=25进行比较,由于mf小于25,则继续执行后续步骤;
S44.计算保留下来的相邻频率点的频率差为:10、10、10、31、10、11、10、11、10和133等10个;
S45.对当前10个频率差逐个进行考察,对满足条件的频率差的出现次数进行累加统计:由于各频率差对应的MIDI音符均不为Nmax,进而统计其连续出现次数,统计出频率差10连续出现3次,则将频率差10对应的累加值加2,即由原来的9加2变为11。
S46.更新幅度参考值:R=R-0.01·Amax=9.27,跳至S42,开始下一次扫描;
S5.确定音符:设置阈值Tacc=4,找到累加值大于Tacc的所有频率差,经过前面的扫描,频率差10对应的累加值为18,除此之外的其他频率差对应的累加值都不大于Tacc,故只将频率差10对应的MIDI音符27加入到当前帧的“疑似音符集”中,由于“疑似音符集”不为空,则将累加值最大的频率差10对应的MIDI音符27作为当前帧的音符;
S6.修正音符:对乐音过渡带的音频帧进行音符修正。
S61.确定各音符的起始帧;
S611.设置各静音帧的音频能量为0,计算各非静音帧的能量Ei(i为帧编号)和其最大值Emax,其中能量定义该帧包含的各个频率点的幅度和。将Ei进行如下归一化:
对第25帧而言,计算出的能量E25=1531.4,归一化为E25=1531.4/2732.5=0.56。最后计算归一化后非静音帧的整体平均能量E为0.33;
S612.计算所有音频帧能量的局部极大点和局部极小点;
S613.计算每个局部极小点与其相邻的局部极大点的能量差,选择能量差大于E/2,即0.165的局部极小点,将其对应帧的下一帧作为一新音符的起始帧。对整个测试音频,共找到84个音符起始帧为:2、5、9、13、16、20、24、28、…302帧。
S62.对音符起始帧及其前后两帧进行音符修正,下面以第13帧为例说明:
S621.对介于第9帧与第12帧间的音频帧,找到其“疑似音符集”中出现次数最多的音符为23,则将23作为第12帧的音符值;
S622.对介于第13帧与第15帧间的音频帧,找到其“疑似音符集”中出现次数最多的音符为25,则将25作为第13帧和14帧的音符值;
下面从识别效果和处理速度两个方面对本发明方法的有效性进行验证,并将其结果与音高分析插件Melodyne(2.0版本)进行比较。Melodyne由德国著名效果器插件生产商Celemony公司研发,2012年荣获格莱美技术奖,该软件也因其较好的音高分析功能成为众多混音师常用的工具。
1.识别效果
图5显示了Melodyne和本发明两种方法对实施例的测试乐音进行识别的效果,图中(a),(b)分别对应Melodyne和本发明方法的结果。从图中可以看到,在较低和较高的频段,Melodyne的识别结果出现错误。特别是在0~6秒,对应27.5~128Hz范围,Melodyne对乐音的识别基本失效。这是由于实际弹奏的录制音频是非理想的,存在诸如手指与琴键碰撞的干扰声,背景噪声等影响因素,而这些因素并没有对本发明方法的识别性能产生多大影响。特别地,对实施例列举的第25帧(如图4所示),最大幅度出现在238.28Hz而并非是基音频率39.06Hz的位置。相反,该基音频率的幅度很小,相对于最大幅度相差了约71dB,可以说,基音被覆盖或消失了。即使在这种情况下,本发明方法仍能准确地识别出该基音频率。
2.处理速度
用Melodyne软件和本发明方法对测试乐音进行识别处理。表1列出了相应处理时间(单位为秒)的结果,测试机器为Intel(R)i3处理器,主频为2.53GHz。
表1 Melodyne软件和本发明的识别时间比较
可以看到,本发明方法的处理速度很快,对39秒的测试音频,仅用0.1秒就完成识别,其处理的实时速度比(音频总时间/处理时间)达390。而相对于Melodyne软件,本发明方法的速度优势非常明显,其处理速度是Melodyne的40倍。