STRAIGHT( Speech Transformation and Representation using Adaptive Interpolation of weighted spectrum)算法(Kawahara,1998),是一种语音信号分析、合成、修改的算法,模型基本原理来源于声码器 (VOCODER)。
STRAIGHT 特点:将语音信号解析成时频域相互独立的频谱参数和基频参数,自适应加权谱内插能够精确提取出与基频不相干的谱信息。
能够对语音信号基频、时长、增益、语速等参数进行灵活调整。该模型在分析阶段仅针对语音基音频率、平滑功率谱和非周期成分 3 个模型参数进行提取分析,在合成阶段利用上述 3 个模型参数进行语音重构。
VOCODER以及 线性预测编码LPC 可灵活对参数进行优化,因为其功率谱和源信号参数间的内部约束较小。因此,STRAIGHT模型采用VOCODER为原型的源-滤波器 表征语音信号,可将语音信号视为一激励信号通过时变线性滤波器后的输出结果。
该模型一方面利用补偿窗来消除时域信号的周期性干扰,另一方面在样条空间中进行逆滤波来消除频域干扰,因此在很大程度上提高了合成语音的质量。
STRAIGHT分析算法是基于源-滤波模型构建的。
1.源-滤波模型:
基于人发声的机理构建的一种模型。源就是嗓音源,对应图中的激励部分;滤波就是图中的声道谐振部分,声道被看作是一个谐振腔(共振峰模型,正弦模型),还有另一种角度,把声道看成是由多个不同截面积的短管串联而成的系统(声管模型,LPC滤波器)。
传统的激励为二元激励,要么输出清音,要么浊音。这样虽简单,但过于粗糙,所以出现了混合激励。
2.STRAIGHT混合激励
混合激励就是将随机噪声序列和周期脉冲按一定的比例叠加,作为声源激励信号。
激励脉冲+抖动方式jitter:
应用:
混合激励线性预测MELP编码中,将二元激励,码激励及多带激励MBE的优点综合在一起,得到混合激励源
下面是二元激励源与MELP混合激励源的波形对比图。
在STRAUGHT中,有两个控制混合激励源的参数:
STRAUGHT还有专门生成类噪声的模快,最后加入到浊音段的合成中。
3.STRAIGHT中的相位感知
STRAIGHT合成语音质量高还有个关键原因,就是他在相位上的控制,其合成其中由多个调整相位的模块。
STRAIGHT模型分析阶段的一个关键步骤是进行自适应频谱分析———获取无干扰且平滑的功率谱。
直观概念:
传统声码器的核心思想是将语音中的声源信息和声道频谱信息分离出来,但这种方法的缺陷是:提取出的声源参数与声道参数之间仍有较强的相关性,一定程度上仍会互相影响,不便于各自独立调整修改。
通常浊音信号产生:s(t)=p(t)*v(t)。激励信号与频谱信息的卷积。
理想情况是p(t)和v(t)完全独立,不相关。STRAIGHT中,使用下面公式计算语音信号的短时谱SW(w,t):
信号s(t)加窗截断作用,会导致短时谱在频率轴和时间轴上出现与基频f0相关的周期性,采用如下窗函数,加窗后的短时谱在时域和频域具有一致的周期性:
加上高斯窗函数后,如下图的短时谱,很明显在时间轴和频率轴上都有很强的周期性特征,所以此时并没有把声道参数和声源参数完全分离,导致谱参数的调整受到限制。
经过平滑补偿窗等一系列操作,就能得到去除周期性之后的谱,如下图,即短时谱在时间轴和频率轴上没有了周期相关性,这就是STRAIGHT分析要得到的谱。
具体算法步骤:
自适应加权谱的提取,其核心算法在于对提取出的功率谱进行一系列的平滑和补偿过程。对输入的语音信号进行:语音信号预处理 -> 功率谱提取 -> 低频噪声补偿 -> 过平滑补偿 -> 无音帧谱的处理,最后得到自适应功率谱。
预处理:包括让语音信号x(n)经过三个六阶butterworth高通滤波器:截止频率分别为70Hz,300Hz,3kHz。滤波得到x1(n),x2(n),x3(n)。算法通过x1(n)求取功率谱,通过x2(n),x3(n)产生无音帧功率谱的加权系数。
提取当前帧的功率谱:首先要设计截取帧的数据窗函数,窗函数w1(n)和频率有关,因此由于各帧基音频率F0不同,窗长是变化的。当语音信号x1(n)被截取后,作FFT得到功率谱。为使功率谱更平滑,算法基于w1(n)设计了一个补偿滤波器w2(n)。w2(n)在频域上对w1(n)的幅度谱进行了搬移,在相位谱上则较w2(n)偏移了pi/2.
低频噪声补偿的原因:若当前帧为有音帧,基音频率为F0,功率谱E(k)在F0的倍频处具有较强的能量,而在其他频率各处能量较低,考虑到STAIGHT算法在语音合成部分,E(k)需要按输入的基音频率为间隔进行抽样,因此需要保证E(k)在F0以下的低频处比较平滑,因此需要对F0以下的频带进行低频噪声补偿,将 F0/2 ~ F0 Hz频带上的功率谱E(k)翻折复制到0~F0/2的频带上。
过平滑补偿:经过低频噪声补偿的功率谱为E1(k)。对E1(k)进行一次平滑w1(n),以获取E1(k)的大致变化趋势E’1(k)。过平滑补偿则首先构造出平滑滤波器的逆滤波器g1(n),使得: g1(n)*w1(n) = 冲激函数.对经过低频噪声补偿的功率谱E1(k)在时域进行过平滑补偿,再转换为频域的功率谱E2(k);最后,利用变化趋势E’1(k)和E2(k)进行加权,得到过平滑补偿后的功率谱E3(k)。
清音帧功率谱修正:首先获得300Hz以上语音x2(n)的各帧能量P1(nframe),根据有/无音的程度,将P1(nframe)和本帧功率谱E3(k)所得能量P(nframe)加权,得到P’1(nframe),最后,当语音帧为无音帧时,功率谱作如下修正:
E3(k,nframe) = P’1(nframe)E3(k,nframe)/∑∑E3(k,nframe)。
(当语音帧为有音帧时,相邻帧能量较为接近,高频能量也较为相似;而无音帧相邻帧的高频能量变化剧烈,因此采用此性质来判断有/无音程度)
对语音进行快速傅里叶变换(FFT),并通过一系列方法进行修正与补偿,最终获取平滑功率谱。 通过固定时窗函数与基音自适应平滑滤波器产生的可变基音间的尺寸误匹配消除时域的周期干扰。同时,对频域的相位干扰进行处理,利用补偿时间窗消除相位失真引起的频谱空洞。另外,为了进一步提高STRAIGHT模型的语音合成质量,在频域中采用过平滑补偿法恢复一些潜在的语音功率谱结构特征。
根据上述功率谱提取步骤,经过一系列降干扰后语音平滑功率谱Pr(w,t)可近似表示为:
其中,Po(w ,t)和Pc(w ,t)分别为语音信号的原始功率谱和补偿功率谱,ζ为补偿系数,即得到的谱的时间变化最小,实验结果最佳ζ为0.13655。
非周期成分可灵活描述周期能量和噪声能量间的比例关系,其中周期能量和噪声能量分别由语音功率谱的上包络和下包络决定。由于非周期成分的提取过程包含许多复杂的非线性运算,如包裹相位映射和等效矩形带宽(ERB)域的功率谱计算等,因此很难精确地用公式对非周期成分进行表示。
上下谱包络提取后,进行相减,然后转换到ERB域。ERB是等价矩形带宽,相关概念需参考听觉心理学教程。
语音的谐波成分在其功率谱中所占比重隐含于非周期成分参数中,非周期成分参数a (w ,t)可表示为:
其中,PoH(w, t)和PoL(w, t)分别为Po,(w t)的上下功率谱包络。
通过小波时频分析的方式。首先是通过对语音信号中的基频信息进行解析,然后计算出相应的瞬时基频值,最后在频率域上进行谐波解析,并在频率轴上进行平滑处理,获得语音信号的各基频参数。
基频F0提取:设计一个Gabor滤波器(频域有较高分辨率)。
引言
为简单起见,采用FIR滤波器,冲激相应就是滤波器系数(卷积系数),且具有线性相位。先设计LP滤波器,再变频为BP滤波器。
为了获得好的频率响应,采用类似Gabor变换的方法,设计滤波器系数(FIR中即冲激响应)为:(例:T0=7.87ms,f0=127.1Hz时)
其中f0为所设计的中心频率,其傅里叶变化仍为类高斯函数,带宽约为2f0。为了进一步压缩带宽,用另一B-锤形函数与它卷积:
左图wd1, 右wd2
从而可以进一步压缩带宽为f0。要变为BP滤波器,只要乘以余弦即可变频:
具体步骤
F0的提取步骤主要分为:F0粗定位->F0轨迹平滑->F0精定位。
通过复合Gabor滤波器得到分析小波gAG(t),输入信号经过分解滤波得到复合信号D(t,τ0)
式中第一项为AM成分的幅度值;第二项为总能量,用来归一化AM成分的幅值;第三项为FM成分的幅值;第四项为基频平方,用来归一化FM成分的幅值;第五项表示时域积分区间的归一化因子。
当AM和FM取最小值时,基本性指数M值最大。
STRAIGHT 算法采用 PSOLA 技术和最小相位脉冲响应相结合的方式,在合成语音时输入待合成语音的基音频率轨迹和去除了周期性的二维短时谱包络。
待合成语音 y(t) :
第一个公式反映的是基音同步叠加的过程 , Q 表示用于实现语音合成的基音同步标记的集合, y(t)表示所恢复的语音信号,函数G( )表示基频调整参数,它可以是任意形式的映射关系。
第二个公式说明的是每帧语音信号的冲击响应求取过程,ф(w)是一个具备附加控制相位激励的全通滤波器,可以用来改善听觉,函数V( ) 表示最小的相位冲击响应傅里叶变换,由前面的平滑包络谱S(w,t)得到,并利用刀谱分析理论方法将一般相位谱强制转化为最小相位谱。实际中进行转换得到的谱没有相位信息,这里也是还原了一定的相位谱。相关计算公式:
第三个公式反映了确定基音同步位置的过程。q表示倒谱,A, u,r函数分别对应幅度谱S(u,r)在幅度,频率,时间轴上的修改。
里面有主要的四个.m文件,一般足够项目用了。
1.源信息F0、AP提取
[f0raw,ap,analysisParams]=exstraightsource(x,fs,optionalParams)
输入参数:
x : input signal. if it is multi channel, only the first channel is used
fs : sampling frequency (Hz)
optionalParams : Optional parameters for analysis
输出参数:
f0raw : fundamental frequency (Hz)
ap : amount of aperiodic component in the time frequency representation
analysisParams : Analysis parameters actually used
应用:
Case 1: The simplest method
[f0raw,ap]=exstraightsource(x,fs);
Case 2: You can get to know what parameters were used.
[f0raw,ap,analysisParams]=exstraightsource(x,fs);
CAse 3: You can have full control of STRAIGHT synthesis.
Please use case 2 to find desired parameters to modify.
[f0raw,ap,analysisParams]=exstraightsource(x,fs,optionalParams);
2.谱信息SP提取
[n3sgram,nalysisParamsSp]=exstraightspec(x,f0raw,fs,optionalParamsSP)
输入参数:
x : input signal. only the first channel is analyzed
f0raw : fundamental frequency (Hz) in 1 ms temporal resolution
: set 0 for aperiodic part
fs : sampling frequency (Hz)
optionalParamsSP : spectrum analysis parameters
输出参数:
n3sgram : Smoothed time frequency representation (spectrogram)
analysisParamsSp : Actually used parameters
应用:
Case 1: The simplest method
n3sgram = exstraightspec(x,f0raw,fs);
Case 2: You can get to know what parameters were used.
[n3sgram,analysisParamsSp]=exstraightspec(x,f0raw,fs);
CAse 3: You can have full control of STRAIGHT synthesis.
Please use case 2 to find desired parameters to modify.
[n3sgram,analysisParamsSp]=exstraightspec(x,f0raw,fs,optionalParamsSP);
3.参数语音合成
[sy,prmS] = exstraightsynth(f0raw,n3sgram,ap,fs,optionalParamsS)
输入参数:
f0raw : fundamental frequency (Hz)
n3sgram : STRAIGHT spectrogram (in absolute value)
ap : aperiodic component (dB re. to total power)
fs : sampling frequency (Hz)
optionalParamsS : optional synthesis parameters
输出参数:
sy : synthesized speech
prmS : Actually used synthesis parameters
应用:
Case 1: The simplest method
sy = exstraightsynth(f0raw,n3sgram,ap,fs);
Case 2: You can get to know what parameters were used.
[sy,prmS] = exstraightsynth(f0raw,n3sgram,ap,fs);
CAse 3: You can have full control of STRAIGHT synthesis.
Please use case 2 to find desired parameters to modify.
[sy,prmS]=exstraightsynth(f0raw,n3sgram,ap,fs,optionalParamsS);
4.用其他F0提取方式时:
AP需用如下函数算
[ap,analysisParams]=exstraightAPind(x,fs,f0,optionalParams)
输入参数:
x : input signal. if it is multi channel, only the first channel is used
fs : sampling frequency (Hz)
f0 : fundamental frequency (Hz)
optionalParams : Optional parameters for analysis
输出参数:
ap : amount of aperiodic component in the time frequency represntation
: represented in dB
analysisParams : Analysis parameters actually used
应用:
Case 1: The simplest method
ap=exstraightAPind(x,fs,f0);
Case 2: You can get to know what parameters were used.
[ap,analysisParams]=exstraightAPind(x,fs,f0);
CAse 3: You can have full control of STRAIGHT synthesis.
Please use case 2 to find desired parameters to modify.
[ap,analysisParams]=exstraightAPind(x,fs,f0,optionalParams);