众所周知,语言是人类传播信息和表达感情的重要媒介,在人类的交流中起着极其重要的作用。二十一世纪是信息科学的世纪,移动电话、数字助听器、车载导航系统等各种各样的人机交互语音处理系统在人们的日常生活中的应用越来越多。因此,对人们交流中最常用的语音来说,对其进行处理在现代信息处理中就占有极为重要的地位。
语音信号处理技术一直以来都是国内外学者研究的热点,它跨声学、信号处理、仿生学等多个学科,应用前景广阔。然而在人们的语音通信过程中,不可避免地会受到来自周围环境、传输媒介引入的噪声,通信设备内部的电噪声,乃至其他讲话者的干扰。这些很强的背景噪声干扰,严重影响通话质量、影响了语音通信的正常进行。语音识别系统同样也会受到背景噪声的影响,背景噪声的存在不仅严重破坏了语音信号原有的模型参数和声学特性,导致许多语音处理系统服务质量的降低,而且会影响系统输出语音的可懂程度,使听众产生听觉疲劳。语音增强目的就是从被污染的语音信号中,提取尽可能纯净的原始语音,改善语音质量,使听者不觉的疲劳,并且能够提高语音的可懂度。在上述情况下,语音增强技术作为一种预处理技术,是消除这些噪声干扰的一个最重要的手段,它通过对带噪语音进行处理来改善语音质量,使人们易于接受或提高语音处理系统的性能。
有关抗噪声技术的研究,早在60年代起就已引起人们的注意,此后人们一直锲而不舍地进行这方面的研究,并取得了丰富的研究成果,现在各种的不同的学科的专门知识也引入到语音处理领域。对于增强被加性噪声污染的语音信号这一问题,近些年来,有了一定的进展。下面对国内外语音增强研究的常用方法作介绍。
频谱相减法:单声道语音增强方法中目前常用的是一类基于短时谱幅度估计的语音增强方法,该方法认为语音信号的感知不重要,没有必要精确计算。文献[2]中通过实验为此提供了一定的依据,文献[3]中则证明在一定条件下语音相位的最小均方误差(MMSE)估计就是带噪语音相位本身,因此,基于STSA估计的语音增强方法一般都是直接采用带噪语音的相位作为增强语音的相位。基于STSA估计的语音增强方法包括谱减法及其各种变形,MMSE估计法等。谱减法通过从带噪语音的STSA中直接减去噪声的平均谱幅度来得到增强语音的STSA,实现起来简单,但是剩余噪声大,并且产生不舒服的“音乐噪声”。后来,Ephraim等人 提出了STSA的MMSE估计法,部分解决了“音乐噪声”问题,但在带噪语音SNR较低时其剩余噪声还是很大,尤其是当信噪比小于5dB时。本文中介绍一种改进谱减法,他相对于传统谱减法有很好的去噪效果。
自适应噪声对消法:适用于在带噪语音信号采集过程中同时能获得参考噪声源的自适应噪声对消技术,已日趋成熟。据专家报告:运用此技术增强带噪语音,在实验环境中,信噪比SNR有40dB左右的改善,在实际中也有20dB左右的提高。
小波变换法:频谱相减法是在短时平稳假定的基础上,采用固定窗傅立叶变换,时—频分辨率均是固定不变的。然而对某些“严格非平稳” 的语音,这种分析模糊了语音的细节特征,小波变换正是满足这一需要的有力工具。
在本次语音信号的去噪研究中,使用的纯净语音文件是利用window录音设备录制的wav格式的语音文件。wav文件是Windows标准的文件格式,wav文件作为多媒体中使用的声波文件格式之一。采样速率是指声音信号在“模→数”转换过程中单位时间内采样的次数。程序实现中我们用wavread读取wav语音文件,返回抽样数据、抽样速率、每一抽的比特数。仿真程序如下:
[wavinn,fs,nbits]=wavread('C:\Documents and Settings\妮子的\桌面\1.wav');
为了验证改进之后算法的去噪能力增强,所以我们在程序开始时加入了输入信噪比可调的加白噪声函数awgn,该函数为matlab自带函数,输入纯净语音以及要求的信噪比,输出规定信噪比的语音信号。
在进行进一步处理时都是按帧从数据区取出语音数据,处理完后再取出下一帧,如此反复直到所有语音数据处理完。已取出的一帧语音s(n)要经过加窗处理。加窗实质上是用了一个短时窗w(n)截取信号。由数字信号处理理论可知,两个信号时域相乘相当于在频域卷积。矩形窗频谱旁瓣成分大,滚降衰减速度慢,加这种窗将影响语音信号的高频部分如频谱泄漏使得语音信号能量泄漏到其他频率处。为避免这些影响,通常采用高频分量幅度较小的窗形,如hamming窗。
在分帧时可以说帧长是时间和点数,具体的选择标准是10ms~30ms之间,但是为了方便傅立叶变换,一般说来,帧长取2^n,n为整数。在取数据时,前一帧和后一帧的交叠称为帧移[29]。帧移和帧长的比值一般取为0~1/2。依据此标准以及实际采样率,确定了分帧时帧长以及步长的选择标准。并且,编写了分帧函数enframe。程序如下:
- 帧长步长选择标准
case 8000 frame_len=256; step_len=128;
case 10000 frame_len=400; step_len=200;
case 12000 frame_len=512; step_len=256;
case 16000 frame_len=800; step_len=400;
case 44100 frame_len=2048; step_len=1024;
otherwise frame_len=1800; step_len=900;
2)分帧函数enframe(x,win,inc),其中x表示读取的语音文件的信息,win为帧长,inc为
重叠的步长。
function f=enframe(x,win,inc)
nx=length(x(:));
nwin=length(win);
nf = fix((nx-len+inc)/inc);
f=zeros(nf,len);
indf= inc*(0:(nf-1)).';
inds = (1:len);
f(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:));
由于汉明窗更适用于频域处理,所以选用汉明窗,这里我们应用matlab自带函数hamming求汉明窗。仿真程序如下:
window=hamming(frame_len); %定义汉明窗
fft_inframe(:,i)=fft(enframe(:,i).*window
如图所示,为在10dB输入信噪比的情况下,原始程序和去掉窗函数程序输出波形图
频谱图的对比:
从图中可以看出左下角加窗的程序输出的波形在非语音部分多余噪声较少,且波形相对左上角更加错落有致。同时,通过听两种方法输出的声音,也可以听出加窗后尖叫的噪声较少。因此,可以看出通过加窗是可以避免分帧时的截断效应的。
1)设置幅度小于噪声信号的语音
a=3; %当a取1时是普通功率谱相减法
abs_inframe2(j,i)<a*abs_noise(j,1)
abs_inframe2(j,i)=a*abs_noise(j,1);
2)功率谱相减
p_wavout(:,i)=sqrt((abs_inframe2(:,i).^2-(a*abs_noise).^2)./abs_inframe(:,i).^2).*fft_inframe(:,i)
3)非语音帧衰减
T=20*log10(mean(abs_wavout./(abs_noise*ones(1,frame_num)))); %求信噪比
T_noise=mean(T(:,1:20),2);
c=10^(-2/3); % 衰减系数为 10^(-1.5)
noise_frame=find(T<T_noise);
abs_wavout(:,noise_frame)=c* abs_wavout(:,noise_frame);
如下图,把a=1和非语音帧的衰减部分去掉,在输入信噪比为10dB的情况下作图比较前后变化:
如图,左下角为原始程序得出的波形图,左上角为去掉上面的改进方法后得到的波形图。图中浅色部分为处理前的波形和频谱,深色部分为处理后的波形和频谱。通过观察图形我们可以看出,将过减系数置1,使语音去噪不完全,仍留有很多部分白噪声,但对频谱的分布影响不大。同时,通过听输出的声音我们可以感受到若去掉上面的处理步骤,输出语音不清楚,仍混有白噪音。