语音增强

随着人们对语音增强知识的认识和发展,各种各样的语音增强算法都相应的发展起来。如前所述,由于噪声特性各异,总的来说,现在比较流行的算法主要有以下几种:

  1. 小波分解法;
  2. 听觉屏蔽法;
  3. 噪声对消法;
  4. 谐波增强法;
  5. 基于语音生成模型的增强算法;
  6. 基于短时谱估计的增强算法;

以上的各种语音增强算法虽然在具体实现上是有差别的,但从另一个方面来说,它们都不得不在语音的可懂度和主观度量这两个方向上做一番权衡。至于到底侧重与哪一方面,就要看算法内部的参数选取了。

       其中,噪声对消法的基本原理是从带噪语音中减去噪声。这一原理是显而易见的,但问题是如何得到噪声的复制品。如果可以用两个麦克风(或多个麦克风)的信号采集系统,一个采集带噪语音,另一个(或多个)采集噪声,则这一任务比较容易得到解决。并且在强噪声环境下,这种方法可以得到很好的消除噪声结果。如果采集到的噪声足够“逼真”,甚至可以与带噪语音在时域上直接进行相减。噪声对消法可以用于平稳噪声相消,也可以用于准平稳噪声。采用噪声对消法时,两个话筒之间必须要有相当的隔离度,但采集到的两路信号之间不可避免地会有时间差,因此实时采集到的两路信号中所包含的噪声段是不同的,回声及其它可变衰减特性也将影响所采集噪声的“纯净”性。因而,采集到的噪声必须经过数字滤波器,以得到尽可能接近带噪语音中的噪声。通常,这就需要采用自适应滤波器曰,使相减噪声与带噪语音中的噪声一致,其原理类似于回波抵消器。自适应滤波器通常采用FIR滤波器,其系数可以采用最小均方(LMS)法进行估计,使如下信号的能量最小。

语音的声音按照其激励形式的不同可以分为三类:第一类是浊音,当气流通过声门时,如果声带的张力刚好使声带发生张弛振荡式的振动,那么就可以产生准周期的空气脉冲,这一空气脉冲激励声道得到浊音,对应于图中就是u(n)为间隔是基音周期T的脉冲串;第二类是摩擦音或清音,如果声道在某处发生收缩,同时迫使空气以高速冲过这一收缩部分而产生湍流,就得到这种音,此时建立的宽带噪声源激励了声道,对应于图中就是u(n)为宽带噪声;如果使声道完全闭合,在闭合后产生气压,然后突然释放,这就得到爆破音。一般而言,语音信号可以看作是由浊音、清音以及它们之间的过渡组成的。

1.语音信号的频谱分量比较集中

通过对语音信号发声过程的研究以及观察记录的各种语音波形,人们发现语音信号的频谱分量主要集中在300~3400Hz的范围内,这是因为人的声道的变化不可能太快。这一点给我们的语音研究和计算带来了很大的便利,我们只要把注意力放在这一区域就可以了。

2.语音是一个时变的、非平稳的随机过程

人类发声系统的生理结构的变化速度是有一定的限度的,在一段短时间内(5-50ms)人的声带和声道形状有相对稳定性,可近似认为其特征不变,因而语音的短时谱分析也有相对稳定性。短时谱的这种平稳性是很多语音处理算法和技术的基础。

3.语音大体上可以分为清音和浊音两大类

一般而言,人类的语音信号往往在有些时段表现出明显的周期性(浊音),这种语段在频域上有共振峰结构,其能量大部分集中在较低频段内;而在另一些时段表现出完全的随机性(清音),这种语段在频域上没有明显的共振峰结构,其频谱类似于白噪声;其余的就是由两者相混合而成。这一点反映在图2-1就是:激励源u(n)要么就是由脉冲发生器发出,要么就是由白噪声发生器发出,要么就是由两者按一定比例混合后发出。

4.作为一个随机过程,语音信号可以用统计分析特性来描述

在高斯模型假设下,傅立叶展开系数被认为是独立的高斯随机变量,均值为0,而方差是时变的。这种高斯模型应用于有限帧长时只是一种近似的描述,在宽带噪声污染的带噪语音的语音增强中,这种假设可用于分析的前提。

1)初始操作:

x=wavread('samples.wav');

n=wavread('white.wav');

[p,q]=size(x);

[a,b]=size(n);

x1=x(150000:250000,1);

n1=n(1:length(x1),1);

y=x1+n1;

其中,wavread('filename.wav',k)函数把文件名为filename的.wav文件的前k个采样点读入当前工作空间中。在未说明情况下,读入全部数值。分别用数组x、n储存纯净语音与高斯白噪声数据。size( )函数返回数组维数大小p,q。在这之前,由于我们引入的是双通道语音,所以q=2,p=语音长度。为了在计算机仿真时,算法程序不至于因为占用过多内存而导致系统瘫痪,我们截取数组x的第150000~250000个点进行操作,同样为了保证数组间操作的维数的一致性,对噪音数据采取同类操作。

2)核心谱减部分:

       aa=2;

bb=6;

anglen=angle(fft(n1));

ampn=abs(fft(n1));

ampy=abs(fft(y));

angley=angle(fft(y));

cn=bb*(ampn.^aa);

xx=(ampy.^aa-cn).^(1/aa);

ifftx=real(ifft(xx.*exp(j*angley)));

本段程序是对基本谱减法的改进程序,其中aa、bb分别相当于式2-10中的和。当前值是经过反复实验后得到的经验值。程序中主要用到的函数说明如下:

y为纯净语音信号,fft(y,N)为快速傅立叶变换函数,其中y为操作对象信号,N为进行多少点傅立叶变换系数(默认情况下,N取256)。abs和 angle函数分别对256点傅立叶变换后的y取绝对值和相角,ifft (x,N)为逆傅立叶变换的标准函数,x为操作对象,N为逆变换点数。real对傅立叶反变换后的复数进行取实部操作所得ifftx即为增强结果,采用soundview(‘filename’,Fs)回放。Fs为采样频率。

       整个语音信号的端点检测可以分为4段:静音、过度段、语音段、结束。程序中使用一个变量status来表示当前所处的状态。在静音段,由于参数的数值比较小,不能确信是否处于真正的语音段,因此只要两个参数的数值都回落到低门限以下,就将当前状态恢复到静音状态。而如果在过渡段中两个参数中的任一个超过了高门限,就可以确定进入语音段了。

三种定义的短时能量分别用下面三行MATLAB命令实现:

amp1=sum(abs(y),2);

amp2=sum(y.*y,2);

amp3=sum(log(y.*y+eps),2);%加上浮点小数eps,是为了防止log运算中可能出现的溢出。

过零率的计算:

zcr=zeros(size(y,1),1);

delta=0.02;

for  i=1:size(y,1)

       x=y(i,:);

       for  j=1:length(x)-1

              if     x(j)*x(j+1)<0&abs(x(j)-x(j+1))>delta

                     zcr(i)=zcr(i)+1;

              end

       end

end

其中,delta=0.02为门限,这个值是我们经过许多实验得到的经验值,可以进行细微的调整。由于毕业设计的时间所限,目前的端点检测仅能针对单个数字发音的识别,应用到整段较长数据的话会引入较大失真,还需要对算法做进一步改进。

原始纯净语音波形如下图所示:

当加载2倍白噪声信号,即系统输入信号为Y=x1+2*n1时,采用各算法后所得波形依次如下(显示先后顺序:带噪语音、基本谱减、STFT谱减、维纳滤波、小波变换):

图4-2  带噪语音波形

图4-3     基本谱减法操作后波形

图4-4     STFT谱减操作后波形

图4-5     维纳滤波后波形

图4-6   小波处理后波形

同样是在系统输入信号为Y=x1+2*n1时,采用各算法后所得语谱图依次如下(显示先后顺序:纯净语音、带噪语音、基本谱减、STFT谱减、维纳滤波、小波变换):

纯净语音的语谱图

带噪语音的语谱图

基本谱减后的语谱图

STFT谱减后的语谱图

维纳滤波后的语谱图

小波变换后的语谱图

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/108850138