发明内容
本发明的目的在于提供一种通过歌曲分析,侦测出歌声段落,免去了手动定位的繁琐操作的一种歌声侦测的方法。
为了解决上述技术问题,本发明的技术方案如下:
一种歌声侦测的方法,具体步骤如下:
101)获取BGM频谱特征步骤:选定出目标歌曲中一段没有歌唱的纯背景音乐即BGM,提取其频谱特征,所述频谱特征的获取方式为先将BGM划分为N个单元,提取每个单元的频谱,而后求其频谱均值来作为其频谱特征;
102)剔除BGM步骤:根据步骤101)针对一个频点,遍历其前后5个单元的相应频点的频谱特征,并根据频谱特征得到的频谱值来找出其中的次极大值;当次极大值大于等于该值时,则该频点为需要进行剔除处理的频点;
103)人声判断步骤:将经过步骤102)处理后的音频信号,利用WebRTC来判断人声,并将音频信号分割为每次输入10ms的音频信号,WebRTC检测后的结果为“真”表示是人声,为“假”表示不是人声;所述WebRTC是Google开放项目,其中的VAD功能用于检测人声;
104)侦测数据的后处理步骤:将步骤103)的判断后的结构数据进行处理,最终将以时间段落的方式呈现歌声,具体包括如下处理的状况:
将步骤103)中经过判断的每段检测结果作为一个结果单元,根据其是否在歌声区域进行进一步的判别处理,当该结果单元处于歌声区域,并且WebRTC检测结果为“真”,则计算已有歌声区间的长度,当其大于歌声区间的长度则判定构建为一段歌唱区间,并进行重置标志量,若其小于歌声区间的长度则进行下一个结果单元的判定;当该结果单元处于歌声区域,并且WebRTC检测结果为“假”,则进行累加静音时长,再将该静音时长与预设的一首歌的静音阈值进行比较,若小于静音阈值则直接进行下一个结构单元的判定,若大于等于静音阈值则计算前一段声长并与声长下限阈值进行对比,若小于声长下限阈值则丢弃这段数据,重置标志量,若大于下限阈值则构建为一段歌唱区间,重置标志量;当该结果单元不处于歌声区域,则进一步判定是否是歌声,若是,则标志歌声开始,若不是,则进行下一个结果单元的判定。
进一步的,所述步骤102)某个需要进行剔除处理的频点的频谱值为X(k),则处理后的频谱值为
X′(k)=G*X(k) 公式(1)
其中G=0.000001为剔除增益;因直接这样抹除BGM,其处理后的信号平滑性仍不足。声音会有触发、衰减、延续、释放的过程,因此还需进一步结合该机理过程,在触发和释放阶段做平滑处理。
进一步的,所述平滑处理,具体处理方式如下:
触发阶段取20毫秒,释放阶段取100毫秒;
触发阶段,每一个单元的增益G1有:
G1=10gain/(20.0*(1+Ta*SampleRate/StepSize)) 公式(2)
其中,Ta是触发时长,SampleRate是信号的采样率,StepSize是分析步进,综合性能与平滑度取StepSize=N/4,gain是以分贝计量的增益;
可通过如下公式(3)换算得到:
gain=20*log10G 公式(3)
释放阶段,每一个单元的增益G2有:
G2=10gain/(20.0*(1+Tr*SampleRate/StepSize)) 公式(4)
其中,Tr是释放时长,其他参量含义与公式(2)相同。
进一步的,所述触发阶段、释放阶段在应用时,会出现一下子将信号衰减到很小,这就会大大降低信号的平滑度,因此需将所要求衰减的增益与触发增益比较,取其中较大的值,以保证处理后的信号在时域上有较好的平滑度。同样,释放阶段也需要这样处理。
进一步的,所述触发阶段、释放阶段在应用时,在时域上的平滑处理,能保证处理后的信号随时间不会出现过大跃变,但同一时间点,信号相邻频点之间仍有可能出现跃变的情况,因此会对出现该跃变进行处理;
具体处理如下:令某一频点的增益为Gi,前一个频点的增益为Gi-1,后一个频点的增益为Gi+1,取该频点前后频点增益的均值作为平滑后的频谱值,该频点的增益为
进一步,转换代入频谱值得到公式(6):
X′(k)=G′*X(k) 公式(6)
其中G'是经过上述时域频域平滑后的信号增益。
本发明相比现有技术优点在于:本发明通过歌曲分析,侦测出歌声段落,免去了手动定位的繁琐操作。在歌曲分析中采用了快速傅里叶变换,使得乘法计算量减半,最终的算法时间复杂度大大降低,为高精度快速频谱分析提供了保证。
本发明在声音触发阶段、释放阶段都做了相应的平滑处理,同时在频域也做了平滑处理。这样做可以使得处理后的信号更趋近与真实信号,最终可以得到较高的检测准确度。
具体实施方式
下面结合附图和具体实施方式对本发明进一步说明。
如图1和图2所示,一种歌声侦测的方法,具体步骤如下:
101)获取BGM频谱特征步骤:选定出目标歌曲中一段没有歌唱的纯背景音乐即BGM,提取其频谱特征,所述频谱特征的获取方式为先将BGM划分为N个单元,提取每个单元的频谱,而后求其频谱均值来作为其频谱特征。
音频信息是通过FFT进行分析,所述FFT即快速傅里叶变换为DFT(即离散傅里叶变换)的一种改进型快速处理音频信息的方法。
所述DFT采用如下公式(1)进行频谱分析:
其中N为有限长序列的数量,x(n)为有限长序列的表达式,
j为虚数单位,e为自然常数。对于N点有限长序列,DFT需要进行4N
2次乘法运算,计算的时间复杂度为O(N
2)。而为了要想获取高精度频谱分析结果,N值一般在512以上,此时的计算量很大,将直接导致该方法的实时性很差。作为DFT的一种快速算法,FFT要求输入序列的数量N=2
L,(L是为方便,用指数形式表示序列个数的一个数学表示量,例如:L=1,序列个数2
L=2;L=2序列个数2
L=4...)如果不满足这个条件,可以人为地加上若干零值点,使之达到这一要求。FFT的输入序列可以分别表示成如下公式(4)偶点序列x
1(r)和奇点序列x
2(r),r为序列的索引值:
进而DFT的表达式可以拆分为如下公式(5):
X1(k)和X2(k)分别是x1(r)和x2(r)的N/2点DFT,从而演化的公式(7):
可以看出,一个N点DFT已分解成两个N/2点的DFT,他们又组成一个N点DFT。而X1(k)和X2(k)以及x1(r)和x2(r)都是N/2点序列,X(k)却有N点。用上述计算得到的只是X(k)的前一半项数结果,要想利用X1(k)和X2(k)得到X(k)的全部的值的话,需利用复指数根的周期性如下公式(8):
从而可以得到如下公式(9):
X1(k+N/2)=X1(k),X2(k+N/2)=X2(k) 公式(9)
结合公式(9)和公式(10)可得到完整的N点FFT的表达式为,如下公式(11)进行前半部分分析,公式(12)进行后半部分分析:
做这样的分解分析计算后,乘法计算量减半,同时因为输入的FFT序列个数为2L,因此还可以进一步一直分解,最后分解为2点DFT,分解次数为log2N,最终的算法时间复杂度为O(Nlog2N)。这样相比原始的DFT,FFT的时间复杂度大幅缩减。以N=1024为例,耗时与DFT差2个数量级。这为高精度频谱分析提供了保证。
102)剔除BGM步骤:根据步骤101)针对一个频点,遍历其前后5个单元的相应频点的频谱特征,并根据特征频谱值来找出其中的次极大值,当次极大值大于等于该值时,则该频点为需要进行剔除处理的频点。
令某个需要进行剔除处理的频点的频谱值为X(k),则处理后的频谱值为
X′(k)=G*X(k) 公式(13)
其中G=0.000001为剔除增益,如果不是目标剔除频点则G=1.0;因直接这样抹除BGM,其处理后的信号平滑性仍不足。声音会有触发、衰减、延续、释放的过程,因此还需进一步结合该机理过程,在触发和释放阶段做平滑处理。
一般触发阶段取20毫秒,释放阶段取100毫秒;
触发阶段,每一个单元的增益G1有:
G1=10gain/(20.0*(1+Ta*SampleRate/StepSize)) 公式(14)
其中,Ta是触发时长,SampleRate是信号的采样率,StepSize是分析步进,综合性能与平滑度取StepSize=N/4,gain是以分贝计量的增益;
gain可以通过如下公式(15)换算:
gain=20*log10G 公式(15)
释放阶段,每一个单元的增益G2有:
G2=10gain/(20.0*(1+Tr*SampleRate/StepSize)) 公式(16)
其中,Tr是释放时长,其他参量含义与公式(14)相同。
具体以触发阶段为例,在应用时,如果一下子将信号衰减到很小,就会造成信号的平滑度不好,因此需将所要求衰减的增益与触发增益比较,取其中较大的值,以保证处理后的信号在时域上有较好的平滑度。同样,释放阶段也需要这样处理。
所述触发阶段、释放阶段在应用时,在时域上的平滑处理,能保证处理后的信号随时间不会出现过大跃变,但同一时间点,信号相邻频点之间仍可能出现跃变的状况,因此会对出现该跃变进行处理;
令某一频点的增益为Gi,前一个频点的增益为Gi-1,后一个频点的增益为Gi+1,取该频点前后频点增益的均值,平滑后,该频点的增益为
进一步,转换后得到公式(18):
X′(k)=G′*X(k) 公式(18)
其中G'是经过上述时域频域平滑后的信号增益。
得到X′(k)之后,再利用IFFT(快速傅里叶逆变换),计算得出时域音频信号。对于IFFT,只需将式-1中的因子:
替换成
相应的x(n)替换成频谱X(k)即可。
103)人声判断步骤:因为经过步骤102)处理后,可以将绝大部分音乐剔除掉,剩下的音频信号中的主要成分是人声,也有小部分残留的音乐信息。针对将经过步骤102)处理后的音频信号即剩下的音频信号,可以利用WebRTC来判断人声,并将音频信号分割为每次输入10ms的音频信号,WebRTC检测后的结果为“真”表示是人声,为“假”表示不是人声;所述WebRTC是Google开放项目,其中的VAD功能用于检测人声。这一步得出结果,将称其为“结果单元”。将步骤102)得出的数据源源不断的送给VAD进行检测,可以得出一连串“结果单元”供步骤104)来进行处理。
104)侦测数据的后处理步骤:将步骤103)的判断后的结构数据进行处理,最终将以时间段落的方式呈现歌声。具体加入该处理步骤是因一首歌,可能有会几分钟。因此,对于10ms的处理单元而言,会有上万个“结果单元”。这么大的数据量直接使用起来不方便,同时与实际歌唱表现的直接关联性也较弱。实际歌唱时音与音之间也可能会有几十至上百毫秒的停顿(即没有发声),一段话也不会一口气从头唱的尾,因此还需要结合实际对数据进一步处理,处理的目的是要得出更精炼,更易用的结果。经过这一步处理,最终歌声将以时间段落的方式呈现。比如得出:5100ms~12000ms含有歌声。具体包括如下处理的内容:
将步骤103)中经过判断的每段检测结果作为一个结果单元,根据其是否在歌声区域进行进一步的判别处理。当该结果单元处于歌声区域,并且WebRTC检测结果为“真”,则计算已有歌声区间的长度,当其大于歌声区间的长度则判定构建为一段歌唱区间,并进行重置标志量,若其小于歌声区间的长度则进行下一个结果单元的判定;当该结果单元处于歌声区域,并且WebRTC检测结果为“假”,则累加静音时长,再比较该静音时长与预设的一首歌的静音阈值,若小于静音阈值则直接进行下一个结构单元的判定,若大于静音阈值则计算前一段声长,并与声长下限阈值进行对比,若小于声长下限阈值则丢弃这段数据,重置标志量,若大于下限阈值则构建为一段歌唱区间,重置标志量;当该结果单元不处于歌声区域,则进一步判定是否是歌声,若是,则标志歌声开始,若不是,则进行下一个结果单元的判定。
重复上述步骤102)、步骤103)、步骤104),直至所有要侦测的歌曲范围完成,既而完成了对整首歌的歌声的检测。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员,在不脱离本发明构思的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明保护范围内。