发明内容
本发明实施例所要解决的技术问题在于,提供一种基于哼唱输入的乐曲合成方法及装置,可以实现对哼唱输入的高精度快速识别及合成。
为解决上述问题,本发明实施例提供了一种基于哼唱输入的乐曲合成方法,包括:
根据预设的窗函数对接收到的语音信号进行分帧处理,获得多个对应的语音帧;
对每一语音帧进行静音检测,得到每一语音帧的能量;
对每一语音帧进行滤波处理,并对滤波后的信号进行三电平削波处理,得到每一语音帧对应的削波信号;
对每一语音帧对应的削波信号进行标准自相关计算,根据计算结果提取得到每一语音帧的音高;
根据每一语音帧的能量及音高对所述语音信号进行音符切分,得到切分结果,所述切分结果包括音符、与所述音符一一对应的音符强度及音符时长;
根据用户设置的乐器类型及所述切分结果,合成得到乐曲并输出。
其中,在所述根据预设的窗函数对接收到的语音信号进行分帧处理,获得多个对应的语音帧的步骤,具体包括:
根据预设的窗函数对接收到的语音信号进行分帧处理,获得多个对应的语音帧;
根据预设的帧移长度对每一语音帧进行帧移处理,使所述语音帧相互重叠。
其中,所述对每一语音帧对应的削波信号进行标准自相关计算,根据计算结果提取得到每一语音帧的音高的步骤,具体包括:
A:采用标准自相关函数对所述每一语音帧对应的削波信号进行计算,得到每一语音帧对应的自相关函数,并根据特定的采样率在每一语音帧中选出对应的自相关函数;
B:根据预设的分段值,将选出的当前语音帧的自相关函数均分;
C:分别依次比较当前语音帧中每段自相关函数中的每两个自相关函数值的大小,将每段中值最大的自相关函数值作为峰值,得到当前语音帧的自相关函数峰值序列;
D:记录所述当前语音帧的自相关函数峰值序列中每一峰值所对应的位置信息;
E:对所述当前语音帧的自相关函数峰值序列进行遍历,确定音高位置,将特定采样率及音高位置代入音高计算公式,得到当前语音帧的音高,重复执行所述A至E过程,直至得到每一语音帧的音高。
其中,所述根据每一语音帧的能量及音高对所述语音信号进行音符切分,得到切分结果的步骤,具体包括:
依次比较每一语音帧的能量大小,将能量既大于前两个语音帧又大于后两个语音帧的当前语音帧的能量作为峰值,直至对比到最后一个语音帧,得到整个语音信号的能量峰值序列;
根据所述能量峰值序列中每一个峰值对应的音高,计算得到音符;
根据所述能量峰值序列中每一个峰值,计算得到与所述音符一一对应的音符强度;
根据所述能量峰值序列中每两个峰值之间的时间间隔,得到与所述音符一一对应的音符时长。
其中,所述根据用户设置的乐器类型及所述切分结果,合成得到乐曲并输出的步骤,具体包括:
根据用户设置的乐器类型选择对应的包络曲线,采用频率调制法逼近获得所述乐器演奏所述音符的波形;
将所述波形按照与所述音符一一对应的音符时长依次叠加,合成得到乐曲并输出。
相应地,本发明实施例还提供了一种基于哼唱输入的乐曲合成装置,所述基于哼唱输入的乐曲合成装置包括:分帧模块、检测模块、处理模块、计算模块、切分模块以及合成模块,其中:
所述分帧模块,用于根据预设的窗函数对接收到的语音信号进行分帧处理,获得多个对应的语音帧;所述检测模块,用于对所述分帧模块得到的每一语音帧进行静音检测,得到每一语音帧的能量;
所述处理模块,用于对所述分帧模块得到的每一语音帧进行滤波处理,并对滤波后的信号进行三电平削波处理,得到每一语音帧对应的削波信号;
所述计算模块,用于对所述处理模块得到的每一语音帧对应的削波信号进行标准自相关计算,根据计算结果提取得到每一语音帧的音高;
所述切分模块,用于根据所述检测模块得到的每一语音帧的能量及所述计算模块得到的每一语音帧的音高对所述语音信号进行音符切分,得到切分结果,所述切分结果包括音符、与所述音符一一对应的音符强度及音符时长;
所述合成模块,用于根据用户设置的乐器类型及所述切分模块得到的切分结果,合成得到乐曲并输出。
其中,所述分帧模块包括:加窗单元及帧移单元,其中:
所述加窗单元,用于根据预设的窗函数对接收到的语音信号进行分帧处理,获得多个对应的语音帧;
所述帧移单元,用于根据预设的帧移长度对所述加窗单元得到的每一语音帧进行帧移处理,使所述语音帧相互重叠。
其中,所述计算模块包括:采样单元、分段单元、第一对比单元、记录单元以及确定单元,其中:
所述采样单元,用于采用标准自相关函数对所述处理模块得到每一语音帧对应的削波信号进行计算,得到每一语音帧对应的自相关函数,并根据特定的采样率在每一语音帧中选出对应的自相关函数;
所述分段单元,用于根据预设的分段值,将选出的当前语音帧的自相关函数均分;
所述第一对比单元,用于分别依次比较当前语音帧中所述分段单元得到的每段自相关函数中的每两个自相关函数值的大小,将每段中值最大的自相关函数值作为峰值,得到当前语音帧的自相关函数峰值序列;
所述记录单元,用于记录所述对比单元得到的当前语音帧的自相关函数峰值序列中每一峰值所对应的位置信息;
所述确定单元,用于对所述对比单元得到的当前语音帧的自相关函数峰值序列进行遍历,确定音高位置,将特定采样率及音高位置代入音高计算公式,得到当前语音帧的音高。
其中,所述切分模块包括:第二对比单元、音符单元、音符强度单元以及音符时长单元,其中:
所述第二对比单元,用于依次比较所述计算存储单元得到的每一语音帧的能量大小,将能量既大于前两个语音帧又大于后两个语音帧的当前语音帧的能量作为峰值,直至对比到最后一个语音帧,得到整个语音信号的能量峰值序列;
所述音符单元,用于根据所述第二对比单元得到的能量峰值序列中每一个峰值对应的音高,计算得到音符;
所述音符强度单元,用于根据所述第二对比单元得到的能量峰值序列中每一个峰值,计算得到与所述音符一一对应的音符强度;
所述音符时长单元,用于根据所述第二对比单元得到的能量峰值序列中每两个峰值之间的时间间隔,得到与所述音符一一对应的音符时长。
其中,所述合成模块包括:波形单元以及叠加单元,其中:
所述波形单元,用于根据用户设置的乐器类型选择对应的包络曲线,采用频率调制法逼近获得所述音符单元得到的音符的波形;
所述叠加单元,用于将所述波形单元得到的波形按照所述音符时长单元得到的与所述音符一一对应的音符时长依次叠加,合成得到乐曲并输出。
实施本发明实施例,具有如下有益效果:
本发明实施例通过对接收的语音信号逐步进行包括分帧、帧移、静音检测、滤波、三电平削波、标准自相关计算、峰值选取、中值滤波的处理方式,能得到每一语音帧的能量及音高,并通过对能量及音高的进一步切分识别,得到获取乐曲所需的音符、音符强度、音符时长、节拍和调号等信息,最后根据用户设置的乐器类型选择对应的包络曲线,采用频率调制法逼近获得所述音符单元得到的音符的波形并叠加,即可合成得到乐曲并输出,迅速,准确,灵活,既能够得到MIDI(Musical Instrument Digital Interface,乐器数字接口)文件,又能得到简谱和五线谱。
尤其,采用三电平削波,不但能消除语音信号中的共振峰对音高提取的影响,还能降低求自相关函数的计算量。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
下面结合附图对本发明的具体实施例进行详细说明。
请参见图1,为本发明基于哼唱输入的乐曲合成装置的第一实施例的结构示意图,所述基于哼唱输入的乐曲合成装置包括:分帧模块10、检测模块20、处理模块30、计算模块40、切分模块50以及合成模块60,其中:
所述分帧模块10,用于根据预设的窗函数对接收到的语音信号进行分帧处理,获得多个对应的语音帧。
具体的,用户在任意时刻任意地点对着本发明实施例提供的基于哼唱输入的乐曲合成装置随意哼唱,所述分帧模块10即可接收到用户哼唱的语音信号,并采用窗函数对所述语音信号进行分帧处理。
所述分帧模块10具体通过对所述语音信号加一个长度为N的窗函数,将所述语音信号分为多帧进行处理。分帧后的多个语音帧可用式2-1表达:
Xn(m)=w(m)×x(n+m),0≤m≤N-1 (式2-1)
其中,Xn(m)表示帧号为n的第m个采样值,N为帧长,w(m)为窗函数,在本实施例中,采用矩形窗,窗函数如式2-2:
所述检测模块20,用于对所述分帧模块10得到的每一语音帧进行静音检测,得到每一语音帧的能量。
具体的,为了在后续音高帧序列提取过程中更准确地定位音高,需要进行静音检测(VAD,Voice Activation Detection),将静音部分的音高设置为0,同时,由于纯粹噪音部分的音量很小,没有固定音高,也要设置为0。
此外,所述检查模块20在进行静音检测时计算得到的每一语音帧的能量需要保存,用于后续的音符切分。
所述处理模块30,用于对所述分帧模块10得到的每一语音帧进行滤波处理,并对滤波后的信号进行三电平削波处理,得到每一语音帧对应的削波信号。
具体的,为了消除电磁噪声和环境噪音,以及共振峰对后续音高计算的影响,所述处理模块30对所述每一语音帧进行低通滤波处理。
考虑到人声的音高一般处于(50,500)Hz的音高区间,可以直接加入截止频率wc=500hz的低通滤波器。进一步考虑到哼唱与日常对话的不同,此处将截止频率wc设置为[500,1000]Hz之间的任意值。
具体的,低通滤波器可以选用iir(Infinite Impulse Response,无限脉冲响应)滤波器或fir(Finite Impulse Response,有限长单位冲激响应)滤波器。iir滤波器延迟小,且计算量小,能够满足实时性要求,但是需要考虑稳定性。fir滤波器设计简单,如果使用采样较低阶数的fir滤波器,可以减少延迟,同时能够获得比较好的相位信息。本实施例中以fir滤波器为例,低通相位滤波器的冲激响应函数如式2-3:
(式2-3)
其中,N为滤波器长度,N-1为滤波器阶数,M=(N-1)/2。
同理,也可以加一个上下截止频率分别为50和500的带通滤波器对每一语音帧进行滤波处理,在此不赘述。
接下来,所述处理模块30根据式2-4对每一语音帧进行卷积运算得到低通滤波后的信号。
ym(n)=h(n)*xm(n) (式2-4)
为了进一步消除语音中的共振峰对音高提取的影响,并降低下一步求自相关函数的计算量,本发明实施例中所述处理模块30继续对经过低通滤波的每一语音帧进行三电平削波处理。
三电平削波的实现函数式如式2-5:
(式2-5)
其中,CL=r*max[x(i)],0<i<N-1,r的取值范围根据经验值设置为[0.6,08],一般情况下多取r=0.68,max为求最大值运算。
所述计算模块40,用于对所述处理模块30得到的每一语音帧对应的削波信号进行标准自相关计算,根据计算结果提取得到每一语音帧的音高。
具体的,所述计算模块40采用如式2-6的自相关函数对所述处理模块30得到的每一语音帧对应的削波信号进行标准自相关计算。
(式2-6)
其中,自相关函数Rn(k)是一个偶函数,xn(m)为第n语音帧经过三电平削波处理后的信号,N为帧长。
对于Rn(k),可通过寻找峰值策略来找音高位置,得到每一语音帧的音高帧序列。
所述切分模块50,用于根据所述检测模块20得到的每一语音帧的能量及所述计算模块40得到的每一语音帧的音高对所述语音信号进行音符切分,得到切分结果,所述切分结果包括音符、与所述音符一一对应的音符强度及音符时长。
具体的,所述切分模块50对每一语音帧的能量及音高进行音符切分,得到包括音符、音符强度及音符时长,所述音符强度及音符时长与所述音符一一对应。
所述切分模块50还可以得到每一语音帧的节拍。
每一语音帧的调号信息可以设置为默认值,如C调唱法。
所述合成模块60,用于根据用户设置的乐器类型及所述切分模块50得到的切分结果,合成得到乐曲并输出。
具体的,用户可通过本发明实施例基于哼唱输入的乐曲合成装置的外部接口设置任意类型的乐器,所述合成模块60根据用户设置的乐器类型及所述切分模块50得到的切分结果即音符、音符强度、音符时长利用调频合成法合成得到MIDI格式的乐曲并输出。
同时,结合每一语音帧的节拍和调号信息,还可以获得简谱和五线谱。
本发明实施例通过对接收的语音信号逐步进行包括分帧、静音检测、滤波、三电平削波、标准自相关计算、峰值选取的处理方式,能得到每一语音帧的能量及音高,并通过对能量及音高的进一步切分识别,得到获取乐曲所需的音符、音符强度、音符时长、节拍和调号等信息,最后根据用户设置的乐器类型合成得到乐曲并输出,迅速,准确,灵活,既能够得到MIDI文件,又能得到简谱和五线谱。
尤其,采用三电平削波,不但能消除语音信号中的共振峰对音高提取的影响,还能降低求自相关函数的计算量。
请参见图2,为本发明基于哼唱输入的乐曲合成装置的第二实施例的结构示意图,所述基于哼唱输入的乐曲合成装置包括上述的基于哼唱输入的乐曲合成装置的第一实施例中的:分帧模块10、检测模块20、处理模块30、计算模块40、切分模块50以及合成模块60,本实施例中,所述基于哼唱输入的乐曲合成装置进一步包括:去除模块70。
所述去除模块70,用于对所述计算模块40得到的音高组成的音高帧序列进行中值滤波处理,以去除野点,所述野点为所述音高帧序列中明显与整体趋势不同的音高。
具体的,为了提高计算精度,去除野点,所述去除模块70对所述计算模块40得到的音高组成的音高帧序列进一步进行中值滤波处理。其中,所述野点为所述音高帧序列中明显与整体趋势不同的音高。
请参见图3,为图2中的分帧模块10的一个实施例的结构示意图,所述分帧模块10具体包括:
加窗单元101,用于根据预设的窗函数对接收到的语音信号进行分帧处理,获得多个对应的语音帧。
帧移单元102,用于根据预设的帧移长度对所述加窗单元101得到的每一语音帧进行帧移处理,使所述语音帧相互重叠。
具体的,为了使分析结果更平滑,减少加窗产生的频谱截断和频谱泄露效应,避免在合成时候产生的gibbs效应(Gibbs phenomenon,吉布斯效应),帧与帧之间需要有重叠,设重叠长度为O,帧长为N,则帧移长S=N-O。
所述帧移单元102将所述加窗单元101得到的每一语音帧移动S=N-O长度,使所述语音帧相互重叠,重叠长度为O。因此在后续计算中,每一帧与后一帧重叠的部分都要被计算两次,这样虽然增加了计算量,但是更符合求音高的原理,精度更高,误差减小。需要说明的是,由于自相关实际上是每个值与序列中的其他值都有关系,值的大小只有在序列中才有意义,因此同一个位置的点在不同的序列中得到的自相关函数值的大小是不同的,也就是说每一帧与后一帧重叠的部分在该帧和后一帧中经过自相关函数计算后得到的自相关函数值是不同的。
请参见图4,为图2中的检测模块20的一个实施例的结构示意图,所述检测模块20具体包括:
计算存储单元201,用于计算所述分帧模块10得到的每一语音帧的能量并保存。
具体的,静音检测有两种方式,短时能量法(如式2-7)和短时平均幅度法(式2-8),分别用En和Mn来表示:
(式2-7)
(式2-8)
相比起来,短时平均幅度法的计算速度较快。本发明实施例选用短时能量法计算,得到的每一语音帧的能量并保存为能量帧序列E,用于后续的音符切分。
比较单元202,用于比较所述计算存储单元201得到的每一语音帧的能量和预设的阈值的大小。
具体的,比较单元202通过预设阈值Thr来判断每一语音帧是否为静音。当语音帧的能量大于Thr时为是非静音,否则是静音。
设置单元203,用于将能量小于预设的阈值的语音帧的音高设置为0。
具体的,所述比较单元202判断当前语音帧为当静音时,所述设置单元203直接将当前语音帧的音高设置为0,不继续对其进行音高求取。
请参见图5,为图2中的计算模块40的一个实施例的结构示意图,所述计算模块40包括:采样单元401、分段单元402、第一对比单元403、记录单元404以及确定单元405,其中:
所述采样单元401,用于采用标准自相关函数对所述处理模块30得到的每一语音帧对应的削波信号进行计算,得到每一语音帧对应的自相关函数值,并根据特定的采样率在每一语音帧中得到对应的自相关函数值;
具体的,因为基音周期的范围为(2,20)ms,对于8k的采样率,所述采样单元401得到每一语音帧中索引为k=16~160的自相关函数值Rn(k);对于16k的采样率,所述采样单元401得到每一语音帧中索引为k=32~320的自相关函数值Rn(k)。因此自相关函数值的涵盖范围广,精度高,保证接下来能够检测到所有的音高,不漏检。
在本发明实施例中,所述采样单元401选择Rn(k)中索引为k=32~320的自相关函数值,即采样率为16k。
所述分段单元402,用于根据预设的分段值,将选出的当前语音帧的自相关函数均分。
具体的,所述分段单元402将Rn(k)中索引为k=32~320的点分为L段,则每段有320-31/L个自相关函数值。一般为了达到计算精度和计算速度之间的平衡,多预设L=4,当然为了提高计算精度,也可以设置比4更大的分段值,但是这样难免会降低计算的速度。假设本实施例中L=4。
所述第一对比单元403,用于分别依次比较当前语音帧中所述分段单元402得到的每段自相关函数值中的每两个自相关函数值的大小,将每段中值最大的自相关函数值作为峰值,得到当前语音帧的自相关函数峰值序列;
具体的,所述第一对比单元403按照如下方式寻找每一语音帧中的自相关函数峰值序列p(i):
所述第一对比单元403分别在所述分段单元402得到的每段自相关函数值中寻找最大自相关函数值,对于第1段自相关函数值,依次比较其中每两个自相关函数值,直至对比到第320-31/4个,得到第1段中自相关函数值最大的一个,依此类推,在4段中得到4个最大自相关函数值;
所述第一对比单元403将4个最大自相关函数值作为峰值,得到当前语音帧的自相关函数峰值序列p(i)。
所述记录单元404,用于记录所述对比单元403得到的当前语音帧的自相关函数峰值序列中每一峰值所对应的位置信息。
具体的,所述记录单元404记录下p(i)中每一峰值对应于Rn(k)中的位置信息ID(i),0≤k≤L-1,共有4个位置信息。
所述确定单元405,用于对所述对比单元404得到的当前语音帧的自相关函数峰值序列进行遍历,确定音高位置,将特定采样率及音高位置代入音高计算公式,得到当前语音帧的音高。
具体的,所述确定单元405对p(i)进行遍历,根据式2-9寻找出音高位置pos:
其中,r的取值范围是[0.6,0.8],一般情况下p(i)中的各个峰值按从大到小顺序依次排列,则pmax为p(i)中的第一个峰值,pos为p(i)中第一个峰值的ID(i)。当然,不能排除出现p(i)中的各个峰值未按从大到小的顺序依次排列的特殊情况。
为保证pos的准确,需要根据式2-9对p(i)从前向后进行遍历:pmax的初始值为p(i)中的第一个峰值,若后一个峰值乘以一个取值范围为[0.6,0.8]的小数后还比它前一个峰值大,则表明后一个峰值远大于它前一个峰值,即后一个峰值为pmax,否则pmax依旧取前一个峰值。按照此过程依次向后遍历,直至遍历到p(i)中的最后一个峰值,确定pmax对应的pos。
将pos和采样率fs的值代入式2-10,即可求得当前语音帧的音高值pitch。
(式2-10)
重复上述过程,即可分别得到每一语音帧的音高,然后由每一语音帧的音高值组合得到音高帧序列ph。
请参见图6,为图2中的切分模块50的一个实施例的结构示意图,所述切分模块包括:第二对比单元501、音符单元502、音符强度单元503以及音符时长单元504,其中:
所述第二对比单元501,用于依次比较所述计算存储单元201得到的每一语音帧的能量大小,将能量既大于前两个语音帧又大于后两个语音帧的当前语音帧的能量作为峰值,直至对比到最后一个语音帧,得到整个语音信号的能量峰值序列。
具体的,对于计算存储单元201得到的每一语音帧的能量组成的能量帧序列E和所述计算模块40得到每一语音帧的音高组成的音高帧序列ph,所述第二对比单元501按照如下方式寻找E中所有的峰值:
所述第二对比单元501依次比较所述计算存储单元201得到的每一语音帧的能量大小,将能量既大于前两个语音帧又大于后两个语音帧的当前语音帧的能量作为峰值,直至对比到最后一个语音帧,得到整个语音信号的能量峰值序列pk,从而得到峰值的索引序列IND。
所述音符单元502,用于根据所述第二对比单元501得到的能量峰值序列中每一个峰值对应的音高,计算得到音符。
具体的,所述音符单元502在pk中每一个峰值对应的索引IND处,在ph中取出该索引对应的音高值,作为一个新的音符音高np。根据式2-11计算得到音符note:
(式2-11)
所述音符强度单元503,用于根据所述第二对比单元502得到的能量峰值序列中每一个峰值,计算得到与所述音符一一对应的音符强度。
具体的,所述音符强度单元503根据pk中的每一个峰值代入式2-12计算得到与音符note一一对应的音符强度A:
(式2-12)
其中,本发明实施例采用式2-12计算音符强度,更符合正弦信号平均能量与最大幅值之间的关系。并且对A进行了饱和运算,防止溢出。
所述音符时长单元504,用于根据所述第二对比单元502得到的能量峰值序列中每两个峰值之间的时间间隔,得到与所述音符一一对应的音符时长。
具体的,所述音符时长单元504根据pk中每两个峰值之间的时间间隔得到与音符note一一对应的音符时长Tn。
同时,所述切分模块50也可以得到节拍和调号信息。
具体的,所述切分模块50可以通过分析能量帧序列pk中谷值出现的频率获取节拍信息,pk中谷值出现的频率具体通过所述计算模块40通过对自相关函数求取周期获得,用能量帧序列代替经过三电平削波处理后的信号,类似于音高帧序列的求取过程,在此不赘述。
调号信息可以设置为默认值,如C调唱法。
请参见图7,为图2中的合成模块60的一个实施例的结构示意图,所述合成模块60包括:波形单元601以及叠加单元602,其中:
所述波形单元601,用于根据用户设置的乐器类型选择对应的包络曲线,采用频率调制法逼近获得所述音符单元502得到的音符的波形。
具体的,在本发明实施例中,所述波形单元601提供的调频调制法合成音乐的一个模型如式2-13:
m(t)=ADSR(t)sin(2πfct+ADSR(t)sin(2πfmt)) (2-13)
其中,ADSR是包络曲线,决定于用户设置的乐器的类型,ADSR可以通过对现有乐器演奏的实际波形进行逼近获得,但是由于现实中的乐器千变万化,因此波形逼近只是一个近似的模拟,并不能完美的代表相应的乐器。fc=np,代表要演奏的音符的音高。fm为调制信号的频率,fc的取值范围是[20,20000]Hz,fm>>fc,能够产生丰富的谐波成分和ADSR曲线一起构成音色。
所述叠加单元602,用于将所述波形单元601得到的波形按照所述音符时长单元504得到的与所述音符一一对应的音符时长依次叠加,合成得到乐曲并输出。
具体的,t在时长Tn内持续,就得到相应音符的波形,所述叠加单元602将所有音符的波形按照与所述音符一一对应的音符时长依次叠加,即得到和哼唱输入相同旋律的乐曲输出。
本发明实施例通过对接收的语音信号逐步进行包括分帧、帧移、静音检测、滤波、三电平削波、标准自相关计算、峰值选取、中值滤波的处理方式,能得到每一语音帧的能量及音高,并通过对能量及音高的进一步切分识别,得到获取乐曲所需的音符、音符强度、音符时长、节拍和调号等信息,最后根据用户设置的乐器类型选择对应的包络曲线,采用频率调制法逼近获得所述音符单元得到的音符的波形并叠加,即可合成得到乐曲并输出,迅速,准确,灵活,既能够得到MIDI文件,又能得到简谱和五线谱。
尤其,采用三电平削波,不但能消除语音信号中的共振峰对音高提取的影响,还能降低求自相关函数的计算量。
请参见图8,为本发明基于哼唱输入的乐曲合成方法的第一实施例的流程图,所述方法包括:
S101,根据预设的窗函数对接收到的语音信号进行分帧处理,获得多个对应的语音帧。
具体的,用户在任意时刻任意地点对着本发明实施例提供的基于哼唱输入的乐曲合成装置随意哼唱,所述S101即可接收到用户哼唱的语音信号,并采用窗函数对所述语音信号进行分帧处理。
所述S101具体通过对所述语音信号加一个长度为N的窗函数,将所述语音信号分为多帧进行处理。分帧后的多个语音帧可用式2-1表达:
Xn(m)=w(m)×x(n+m),0≤m≤N-1 (式2-1)
其中,Xn(m)表示帧号为n的第m个采样值,N为帧长,w(m)为窗函数,在本实施例中,采用矩形窗,窗函数如式2-2:
S102,对每一语音帧进行静音检测,得到每一语音帧的能量。
具体的,为了在后续音高帧序列提取过程中更准确地定位音高,需要进行静音检测,将静音部分的音高设置为0,同时,由于纯粹噪音部分的音量很小,没有固定音高,也要设置为0。
此外,所述S102在进行静音检测时计算得到的每一语音帧的能量需要保存,用于后续的音符切分。
S103,对每一语音帧进行滤波处理,并对滤波后的信号进行三电平削波处理,得到每一语音帧对应的削波信号。
具体的,为了消除电磁噪声和环境噪音,以及共振峰对后续音高计算的影响,所述S103对所述每一语音帧进行低通滤波处理。
考虑到人声的音高一般处于(50,500)Hz的音高区间,可以直接加入截止频率wc=500hz的低通滤波器。进一步考虑到哼唱与日常对话的不同,此处将截止频率wc设置为[500,1000]Hz之间的任意值。
具体的,低通滤波器可以选用iir滤波器或fir滤波器。iir滤波器延迟小,且计算量小,能够满足实时性要求,但是需要考虑稳定性。fir滤波器设计简单,如果使用采样较低阶数的fir滤波器,可以减少延迟,同时能够获得比较好的相位信息。本实施例中以fir滤波器为例,低通相位滤波器的冲激响应函数如式2-3:
(式2-3)
其中,N为滤波器长度,N-1为滤波器阶数,M=(N-1)/2。
同理,也可以加一个上下截止频率分别为50和500的带通滤波器对每一语音帧进行滤波处理,在此不赘述。
接下来,所述S103根据式2-4对每一语音帧进行卷积运算得到低通滤波后的信号。
ym(n)=h(n)*xm(n) (式2-4)
为了进一步消除语音中的共振峰对音高提取的影响,并降低下一步求自相关函数的计算量,本发明实施例中所述S103继续对经过低通滤波的每一语音帧进行三电平削波处理。
三电平削波的实现函数式如式2-5:
(式2-5)
其中,CL=r*max[x(i)],0<i<N-1,r的取值范围根据经验值设置为[0.6,08],一般情况下多取r=0.68,max为求最大值运算。
S104,对每一语音帧对应的削波信号进行标准自相关计算,根据计算结果提取得到每一语音帧的音高。
具体的,所述S104采用如式2-6的自相关函数对所述S103得到的每一语音帧对应的削波信号进行标准自相关计算。
(式2-6)
其中,自相关函数Rn(k)是一个偶函数,xn(m)为第n语音帧经过三电平削波处理后的信号,N为帧长。
对于Rn(k),可通过寻找峰值策略来找音高位置,得到每一语音帧的音高。
S105,根据每一语音帧的音高帧序列对所述语音信号进行音符切分,得到切分结果。
具体的,所述S105对每一语音帧的音高帧序列进行音符切分,得到包括音符、音符强度及音符时长,所述音符强度及音符时长与所述音符一一对应。
所述S105还可以得到每一语音帧的节拍。
每一语音帧的调号信息可以设置为默认值,如C调唱法。
S106,根据用户设置的乐器类型及所述切分结果,合成得到乐曲并输出。
具体的,用户可通过本发明实施例基于哼唱输入的乐曲合成装置的外部接口设置任意类型的乐器,所述S106根据用户设置的乐器类型及所述S105得到的切分结果即音符、音符强度、音符时长利用调频合成法合成得到MIDI格式的乐曲并输出。
同时,结合每一语音帧的节拍和调号信息,还可以获得简谱和五线谱。
本发明实施例通过对接收的语音信号逐步进行包括分帧、静音检测、滤波、三电平削波、标准自相关计算、峰值选取的处理方式,能得到每一语音帧的能量及音高,并通过对能量及音高的进一步切分识别,得到获取乐曲所需的音符、音符强度、音符时长、节拍和调号等信息,最后根据用户设置的乐器类型合成得到乐曲并输出,迅速,准确,灵活,既能够得到MIDI文件,又能得到简谱和五线谱。
尤其,采用三电平削波,不但能消除语音信号中的共振峰对音高提取的影响,还能降低求自相关函数的计算量。
请参见图9,为本发明基于哼唱输入的乐曲合成方法的第二实施例的流程图,所述方法包括:
S201,根据预设的窗函数对接收到的语音信号进行分帧处理,获得多个对应的语音帧;
S202,根据预设的帧移长度对每一语音帧进行帧移处理,使所述语音帧相互重叠。
S203,对每一语音帧进行静音检测,得到每一语音帧的能量。
S204,对每一语音帧进行滤波处理,并对滤波后的信号进行三电平削波处理,得到每一语音帧对应的削波信号;
S205,对每一语音帧对应的削波信号进行标准自相关计算,根据计算结果提取得到每一语音帧的音高。
S206,对所述音高组成的音高帧序列进行中值滤波处理,以去除野点。
S207,根据每一语音帧的能量及音高对所述语音信号进行音符切分,得到切分结果。
S208,根据用户设置的乐器类型及所述切分结果,合成得到乐曲并输出。
请参见图10,为本发明的基于哼唱输入的乐曲合成方法的对每一语音帧进行静音检测的流程图,包括:
S2031,计算每一语音帧的能量并保存;
S2032,判断每一语音帧的能量是否大于预设的阈值,若是,则执行S2033,否则,执行S2034。
S2033,对当前语音帧进行滤波处理。
具体的,所述S2033为图8中所示的S204,即当S2032判断出当前语音帧的能量大于预设的阈值时,所述S2033则对当前语音帧进行滤波处理和三电平削波处理,并继续对当前语音帧执行图8中所示的S205,计算得到当前语音帧的音高。
S2034,将当前语音帧的音高设置为0。
本发明实施例通过对每一语音帧进行静音检测,将能量小于阈值的语音帧的音高直接设置为0,可以减小下一步滤波处理和三电平削波处理的处理量及后续音高计算的计算量,能加快语音帧的处理速度。
请参见图11,为本发明的基于哼唱输入的乐曲合成方法的对每一语音帧对应的削波信号进行标准自相关计算,根据计算结果提取得到每一语音帧的音高的流程图,包括:
S2051,采用标准自相关函数对所述每一语音帧对应的削波信号进行计算,得到每一语音帧对应的自相关函数,并根据特定的采样率在每一语音帧中选出对应的自相关函数;
S2052,根据预设的分段值,将选出的当前语音帧的自相关函数均分;
S2053,分别依次比较当前语音帧中每段自相关函数中的每两个自相关函数值的大小,将每段中值最大的自相关函数值作为峰值,得到当前语音帧的自相关函数峰值序列;
S2054,记录所述当前语音帧的自相关函数峰值序列中每一峰值所对应的位置信息;
S2055,对所述当前语音帧的自相关函数峰值序列进行遍历,确定音高位置,将特定采样率及音高位置代入音高计算公式,得到当前语音帧的音高;
重复执行所述S2051~S2055,即可分别得到每一语音帧的音高值,然后由每一语音帧的音高值组合得到音高帧序列。
请参见图12,为本发明的基于哼唱输入的乐曲合成方法的根据每一语音帧的能量及音高对所述语音信号进行音符切分,得到切分结果的流程图,包括:
S2071,依次比较每一语音帧的能量大小,将能量既大于前两个语音帧又大于后两个语音帧的当前语音帧的能量作为峰值,直至对比到最后一个语音帧,得到整个语音信号的能量峰值序列;
S2072,根据所述能量峰值序列中每一个峰值对应的音高,计算得到音符;
S2073,根据所述能量峰值序列中每一个峰值,计算得到与所述音符一一对应的音符强度;
S2074,根据所述能量峰值序列中每两个峰值之间的时间间隔,得到与所述音符一一对应的音符时长。
请参见图13,为本发明的基于哼唱输入的乐曲合成方法的根据用户设置的乐器类型及所述切分结果,合成得到乐曲并输出的流程图,包括:
S2081,根据用户设置的乐器类型选择对应的包络曲线,采用频率调制法逼近获得所述乐器演奏所述音符的波形;
S2082,将所述波形按照与所述音符一一对应的音符时长依次叠加,合成得到乐曲并输出。
本发明实施例通过对接收的语音信号逐步进行包括分帧、帧移、静音检测、滤波、三电平削波、标准自相关计算、峰值选取、中值滤波的处理方式,能得到每一语音帧的能量及音高,并通过对能量及音高的进一步切分识别,得到获取乐曲所需的音符、音符强度、音符时长、节拍和调号等信息,最后根据用户设置的乐器类型选择对应的包络曲线,采用频率调制法逼近获得所述音符单元得到的音符的波形并叠加,即可合成得到乐曲并输出,迅速,准确,灵活,既能够得到MIDI文件,又能得到简谱和五线谱。
尤其,采用三电平削波,不但能消除语音信号中的共振峰对音高提取的影响,还能降低求自相关函数的计算量。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的硬件平台的方式来实现,当然也可以全部通过硬件来实施。基于这样的理解,本发明的技术方案对背景技术做出贡献的全部或者部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。
以上所揭露的仅为本发明一种较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。