STRAIGHT分析合成算法

STRAIGHT自适应加权谱内插的语音转换与重构

STRAIGHT( Speech Transformation and Representation using Adaptive Interpolation of weighted spectrum)算法(Kawahara,1998),是一种语音信号分析、合成、修改的算法,模型基本原理来源于声码器 (VOCODER)。

STRAIGHT 特点:将语音信号解析成时频域相互独立的频谱参数和基频参数,自适应加权谱内插能够精确提取出与基频不相干的谱信息。

能够对语音信号基频、时长、增益、语速等参数进行灵活调整。该模型在分析阶段仅针对语音基音频率、平滑功率谱和非周期成分 3 个模型参数进行提取分析,在合成阶段利用上述 3 个模型参数进行语音重构。
STRAIGHT分析合成算法_第1张图片

VOCODER以及 线性预测编码LPC 可灵活对参数进行优化,因为其功率谱和源信号参数间的内部约束较小。因此,STRAIGHT模型采用VOCODER为原型的源-滤波器 表征语音信号,可将语音信号视为一激励信号通过时变线性滤波器后的输出结果。
该模型一方面利用补偿窗来消除时域信号的周期性干扰,另一方面在样条空间中进行逆滤波来消除频域干扰,因此在很大程度上提高了合成语音的质量。

引言

STRAIGHT分析算法是基于源-滤波模型构建的。

1.源-滤波模型:
基于人发声的机理构建的一种模型。源就是嗓音源,对应图中的激励部分;滤波就是图中的声道谐振部分,声道被看作是一个谐振腔(共振峰模型,正弦模型),还有另一种角度,把声道看成是由多个不同截面积的短管串联而成的系统(声管模型,LPC滤波器)。
STRAIGHT分析合成算法_第2张图片
传统的激励为二元激励,要么输出清音,要么浊音。这样虽简单,但过于粗糙,所以出现了混合激励。

2.STRAIGHT混合激励
混合激励就是将随机噪声序列和周期脉冲按一定的比例叠加,作为声源激励信号。

  • 浊音激励源:通过高低通滤波器的随机噪声+脉冲序列(两种成分的相对比例随信号的浊化程度变化)
  • 清音激励源:噪声序列+一个位置随机的正脉冲跟随一个负脉冲构成的脉冲对形成的爆破脉冲

激励脉冲+抖动方式jitter:

  • 将基音相关程度不大或残差信号中存在的较大峰值时的语音作为抖动浊音帧。
  • 周期脉冲的相位需随机抖动,对每个基音周期的长度乘上一个在0.75~1.25之间的均匀分布随机数,提高语音自然度。

应用:
混合激励线性预测MELP编码中,将二元激励,码激励及多带激励MBE的优点综合在一起,得到混合激励源
下面是二元激励源与MELP混合激励源的波形对比图。
STRAIGHT分析合成算法_第3张图片

在STRAUGHT中,有两个控制混合激励源的参数:

  • 非周期参数AP(Aperiodic):控制噪声与总能量的比例
  • 组延迟(group delay):通过对高频部分随机添加相位,影响高频的能量分布,从而控制浊音段噪声的比例。

STRAUGHT还有专门生成类噪声的模快,最后加入到浊音段的合成中。

3.STRAIGHT中的相位感知
STRAIGHT合成语音质量高还有个关键原因,就是他在相位上的控制,其合成其中由多个调整相位的模块。

特征提取

1. 平滑功率谱提取(包括低频带补偿和清音帧处理等过程)

STRAIGHT模型分析阶段的一个关键步骤是进行自适应频谱分析———获取无干扰且平滑的功率谱。

直观概念:
传统声码器的核心思想是将语音中的声源信息和声道频谱信息分离出来,但这种方法的缺陷是:提取出的声源参数与声道参数之间仍有较强的相关性,一定程度上仍会互相影响,不便于各自独立调整修改。

通常浊音信号产生:s(t)=p(t)*v(t)。激励信号与频谱信息的卷积。
理想情况是p(t)和v(t)完全独立,不相关。STRAIGHT中,使用下面公式计算语音信号的短时谱SW(w,t):

在这里插入图片描述
信号s(t)加窗截断作用,会导致短时谱在频率轴和时间轴上出现与基频f0相关的周期性,采用如下窗函数,加窗后的短时谱在时域和频域具有一致的周期性:
STRAIGHT分析合成算法_第4张图片

加上高斯窗函数后,如下图的短时谱,很明显在时间轴和频率轴上都有很强的周期性特征,所以此时并没有把声道参数和声源参数完全分离,导致谱参数的调整受到限制。
STRAIGHT分析合成算法_第5张图片
经过平滑补偿窗等一系列操作,就能得到去除周期性之后的谱,如下图,即短时谱在时间轴和频率轴上没有了周期相关性,这就是STRAIGHT分析要得到的谱。
STRAIGHT分析合成算法_第6张图片

具体算法步骤:
自适应加权谱的提取,其核心算法在于对提取出的功率谱进行一系列的平滑和补偿过程。对输入的语音信号进行:语音信号预处理 -> 功率谱提取 -> 低频噪声补偿 -> 过平滑补偿 -> 无音帧谱的处理,最后得到自适应功率谱。

  • 预处理:包括让语音信号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。

2. 非周期成分提取

非周期成分可灵活描述周期能量和噪声能量间的比例关系,其中周期能量和噪声能量分别由语音功率谱的上包络和下包络决定。由于非周期成分的提取过程包含许多复杂的非线性运算,如包裹相位映射和等效矩形带宽(ERB)域的功率谱计算等,因此很难精确地用公式对非周期成分进行表示。
STRAIGHT分析合成算法_第7张图片
上下谱包络提取后,进行相减,然后转换到ERB域。ERB是等价矩形带宽,相关概念需参考听觉心理学教程。

在这里插入图片描述

语音的谐波成分在其功率谱中所占比重隐含于非周期成分参数中,非周期成分参数a (w ,t)可表示为:
在这里插入图片描述
其中,PoH(w, t)和PoL(w, t)分别为Po,(w t)的上下功率谱包络。

  • 语音非周期成分的提取,主要是分析信号的功率谱,提取功率谱的上包络与下包络(ERB域提取谱包络),利用上下谱包络的比例t(f,n)=EL/EH,判决语音信号在该频率点处的非周期成分的大小。t(f,n)在频率f处越大,非周期成分也越大,则合成时衰减频率f处的可能性也越大,从而提升合成音质。对非周期成分划分组得到bap。

3. 基频轨迹提取

通过小波时频分析的方式。首先是通过对语音信号中的基频信息进行解析,然后计算出相应的瞬时基频值,最后在频率域上进行谐波解析,并在频率轴上进行平滑处理,获得语音信号的各基频参数。
基频F0提取:设计一个Gabor滤波器(频域有较高分辨率)。

引言
为简单起见,采用FIR滤波器,冲激相应就是滤波器系数(卷积系数),且具有线性相位。先设计LP滤波器,再变频为BP滤波器。
STRAIGHT分析合成算法_第8张图片

为了获得好的频率响应,采用类似Gabor变换的方法,设计滤波器系数(FIR中即冲激响应)为:(例:T0=7.87ms,f0=127.1Hz时)
在这里插入图片描述
其中f0为所设计的中心频率,其傅里叶变化仍为类高斯函数,带宽约为2f0。为了进一步压缩带宽,用另一B-锤形函数与它卷积:
在这里插入图片描述
左图wd1, 右wd2
STRAIGHT分析合成算法_第9张图片

卷积得到wwd
STRAIGHT分析合成算法_第10张图片

从而可以进一步压缩带宽为f0。要变为BP滤波器,只要乘以余弦即可变频:
在这里插入图片描述
STRAIGHT分析合成算法_第11张图片

具体步骤
F0的提取步骤主要分为:F0粗定位->F0轨迹平滑->F0精定位。

  • F0粗定位:对语音信号进行小波变换,得到小波系数。再将小波系数转换为瞬时频率作为各帧的一组候选F0值。在进行小波变换前,要经过高通滤波器去除信号的直流分量;然后对信号降采样。
  • F0轨迹平滑:根据计算得到的高频能量比、最小噪声能量、判决门限、跳跃度(帧级别的基音频率与参考频率的误差),在一组候选F0值中寻找最可能的F0平滑曲线。
  • F0精定位和F0粗定位相似,也会用到瞬时频率。但F0粗定位是用小波变换得到瞬时频率,而F0精定位则是用FFT得到瞬时频率,再根据当前帧的噪声能量和语音能量对瞬时频率进行微调。

通过复合Gabor滤波器得到分析小波gAG(t),输入信号经过分解滤波得到复合信号D(t,τ0)
STRAIGHT分析合成算法_第12张图片
式中第一项为AM成分的幅度值;第二项为总能量,用来归一化AM成分的幅值;第三项为FM成分的幅值;第四项为基频平方,用来归一化FM成分的幅值;第五项表示时域积分区间的归一化因子。
当AM和FM取最小值时,基本性指数M值最大。

STRAIGHT分析合成算法_第13张图片
STRAIGHT分析合成算法_第14张图片

语音合成

STRAIGHT 算法采用 PSOLA 技术和最小相位脉冲响应相结合的方式,在合成语音时输入待合成语音的基音频率轨迹和去除了周期性的二维短时谱包络。
待合成语音 y(t) :
STRAIGHT分析合成算法_第15张图片

第一个公式反映的是基音同步叠加的过程 , Q 表示用于实现语音合成的基音同步标记的集合, y(t)表示所恢复的语音信号,函数G( )表示基频调整参数,它可以是任意形式的映射关系。
第二个公式说明的是每帧语音信号的冲击响应求取过程,ф(w)是一个具备附加控制相位激励的全通滤波器,可以用来改善听觉,函数V( ) 表示最小的相位冲击响应傅里叶变换,由前面的平滑包络谱S(w,t)得到,并利用刀谱分析理论方法将一般相位谱强制转化为最小相位谱。实际中进行转换得到的谱没有相位信息,这里也是还原了一定的相位谱。相关计算公式:

STRAIGHT分析合成算法_第16张图片
第三个公式反映了确定基音同步位置的过程。q表示倒谱,A, u,r函数分别对应幅度谱S(u,r)在幅度,频率,时间轴上的修改。

STRAIGHT代码应用

里面有主要的四个.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);

你可能感兴趣的:(信号处理,语音基础知识,算法,语音识别,人工智能)