6.1.2分帧
虽然声音信号是非线性时变信号,但它同时具有短时平稳的特点,所以对其进行分帧可以提取其短时特性。
在处理语音信号时一般取帧长为10~30ms,为了避免帧与帧之间的特性变化太大,所以帧移一般取帧长的1P3或1P2。
6.1.3加窗
为了进行短时分析必须加窗,这在理论上应使用两端具有平滑过渡特性的窗口。
即其目的就是为了减少帧起始和结束处的信号不连续性。
常用的窗
函数有:
(1)方窗
(2)汉明窗(HammingWindow)(3)汉宁窗(HannWindow):
其中最常用的窗函数是汉明窗。
函数为:
6.1.4端点检测
所谓端点检测,就是在实时输入的声音信号中,区分背景噪声和环境噪声,准确地判断出声音信号的开始点和结束点。
这一过程应由特定地算法自动完成,通常利用短时能量来检测浊音,用过零率来检测清音,两者配合实现可靠的端点检测。
端点检测算法常用的是由语音能量和过零率组合的有双门限法,以及由短时能量和过零率的乘积构成的能频值法。
具体过程如下图:
6.1.5然后我们进行特征参数的提取,特征参数主要有:
能量、幅度、过零率、频谱、倒谱和功率谱等,另外考虑到其他因素的影响,还有许多基于基本参数的参数,本文选用了MEL频率倒谱系数(MFCC)进行提取特征参数。
MFCC:
MFCC系数的计算是以“bark”为其频率基准的,它和线性频率的转换关系是:
(2-9)
MFCC系数也是按帧计算的,首先要通过FFT得到该帧信号的功率谱S(n),转换为Mel频率下的功率谱。
这需要在计算之前先在语音的频谱范围内设置若干个带通滤波器:
NHm(n)m=0,1,…,M-1;n=0,1,…,N/2-1(2-10)
M为滤波器的个数,通常取24,与临界带的个数一样;N为一帧语音信号的点数,为了计算FFT的方便,通常取256。
滤波器在频域上为简单的三角形,其中心频率fm在Mel频率轴上是均匀分布的。
从下图就可以看到MFCC系数的计算过程如下:
(1)预处理:
确定每一帧语音采样序列的长度(如N=256),并对每帧序列s(n)进行预加重、分帧和加窗处理;
(2)计算离散功率谱:
对预处理的每帧进行离散FFT变换得到其频谱,再取模的平方作为离散功率谱S(n);
(3)将功率谱通过滤波器组:
计算S(n)通过M个Hm(n)后所得的功率值,即计算S(n)和Hm(n)在各离散频率点上的乘积之和,得到M个参数Pm,m=0,1,……M-1;
(4)取对数:
计算Pm的自然对数,得到Lm,m=0,1,……M-1;
(5)离散余弦变换:
对Lm计算其离散余弦变换,得到Dm,m=0,1,……M-1,舍去代表直流成份的D0,取D1,D2,……,Dk作为MFCC参数。
6.2通过DTW算法建立模型。
DTW算法:
在孤立词语音识别中,最为简单有效的方法是采用DTW(DynamicTimeWarping,动态时间归整)算法,该算法基于动态规划(DP)的思想,解决了发音长短不一的模板匹配问题,是语音识别中出现较早、较为经典的一种算法。
用于孤立词识别,DTW算法与HMM算法在训练阶段需要提供大量的语音数据,通过反复计算才能得到模型参数,而DTW算法的训练中几乎不需要额外的计算。
所以在孤立词语音识别中,DTW算法仍然得到广泛的应用。
6.3
6.4
六、模型优缺点评价
7.1优点:
音纹识别可推广至只多方面如工业、家电、通信、汽车电子、医疗、家庭服务、消费电子产品等各个领域。
7.2缺点:
模型建立的特征值数据库比较庞大,存储和读取数据较慢,识别需要较长时间。
七、模型推广
八、参考文献
附录
程序1
%%MFCC参数的提取函数
functionccc=mfcc(x)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%functionccc=mfcc(x);
%对输入的语音序列x进行MFCC参数的提取,返回MFCC参数和一阶
%差分MFCC参数,Mel滤波器的阶数为24
%fft变换的长度为256,采样频率为8000Hz,对x256点分为一帧
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bank=melbankm(24,256,8000,0,0.5,'m');
%归一化mel滤波器组系数
bank=full(bank);
bank=bank/max(bank(:
));
%DCT系数,12*24
fork=1:
12
n=0:
23;
dctcoef(k,:
)=cos((2*n+1)*k*pi/(2*24));
end
%归一化倒谱提升窗口
w=1+6*sin(pi*[1:
12]./12);
w=w/max(w);
%预加重滤波器
xx=double(x);
xx=filter([1-0.9375],1,xx);
%语音信号分帧
xx=enframe(xx,512,80);
%计算每帧的MFCC参数
fori=1:
size(xx,1)%size(xx,1)返回xx的维数
y=xx(i,:
);
s=y'.*hamming(1024);%乘窗
t=abs(fft(s));
t=t.^2;%计算能量
c1=dctcoef*log(bank*t(1:
129));%dctcoef为DCT系数,bank归一化mel滤
波器组系数
c2=c1.*w';%w为归一化倒谱提升窗口
m(i,:
)=c2';
end
%差分系数
dtm=zeros(size(m));
fori=3:
size(m,1)-2
dtm(i,:
)=-2*m(i-2,:
)-m(i-1,:
)+m(i+1,:
)+2*m(i+2,:
);
end
程序2
%提取MFCC参数并保存在speakertestdata.mat中
fori=1:
80
fprintf('\n=====testdata\n');
tic
testNum=[];
testsnoring=dir(files);
testsnoring(1:
2)=[];
fprintf('%s\n',testsnoring(i).name);%显示处理进程
fullPath=[files,'\',testsnoring(i).name];%取出每一个语句的完整路径和文件名
[y,fs,nbits]=readwav(fullPath);
nbits=str2num(nbits(3:
end));
x=fix(y(:
1)*(2^(nbits-1)));%对数据进行扩大
cc=mfcc(x);
tspeaker(i).name=testsnoring(i).name;
tspeaker(i).data=cc;%24MFCC参数
savespeakertestdatatspeaker
end
t=toc
程序3