基于说话人声音识别的技术研究语音识别技术.docx
《基于说话人声音识别的技术研究语音识别技术.docx》由会员分享,可在线阅读,更多相关《基于说话人声音识别的技术研究语音识别技术.docx(8页珍藏版)》请在冰点文库上搜索。
基于说话人声音识别的技术研究语音识别技术
基于说话人声音识别的技术研究语音识别技术
基于声音的说话人身份识别技术研究
通信1203班
成员:
艾洲、刘安邦、汪中日
余文正、王玉贵、宁文静
xx-12-28
项目背景
伴随着全球化、网络化、信息化、数字化时代的到来,我们对高可靠性的身份验证技术与身份识别技术的需求也日益增长。
在生物学和信息科学高度发展的今天,根据人体自身的生
理特征(指纹、虹膜…)和行为特征(声音…)来识别身份的生物技术认证作为一种便捷、先进的信息安全技术已经在现实生活中得到广泛的应用,它是集光学、传感技术、红外扫描和计算机技术于一身的第三代身份验证技术,能满足现代社会对于身份鉴别的准确性、安全性与实用性的更高要求。
而语音是人的自然属性之一,由于说话人发声器官的生理
差异以及后天形成的行为差异,每个人的语音都带有强烈的个人色彩,这使得通过分析语音信号来识别说话人成为可能。
设计总体框架
1.语音库的建立
2.声音样本采集
2.1特征参数提取
2.2识别模型建立
3.语音识别测试
梅尔倒谱系数(MFCC)简述
在话者识别方面,最常用到的语音特征就是梅尔倒谱系数(MFCC)。
因为,根据人耳听觉机理的研究发现,人耳对不同频率的声波有不同的听觉敏感度,得出从200Hz到5000Hz的语音信号对语音的清晰度影响最大。
所以,人们从低频到高频这一段频带内按临界带宽的大小由密到疏安排一组带通滤波器,对输入信号进行滤波。
将每个带通滤波器输出的信号能量作为信号的基本特征,对此特征经过进一步处理后就可以作为语音的输入特征。
由于这种特征不依赖于信号的性质,对输入信号不做任何的假设和限制,又利用了听觉模型的研究成果。
因此,这种参数比基于声道模型的“线性预测系数LPC”相比更好,更符合人耳的听觉特性,而且当信噪比降低时仍然具有较好的识别性能。
MFCC倒谱特征提取流图
1.
预加重
预加重处理其实是将语音信号通过一个高通滤波器:
式中μ的值介于0.9-1.0之间,我们通常取0.97。
预加重的目的是提升高频部分,使信号的频谱变得平坦,保持在低频到高频的整个频带中,能用同样的信噪比求频谱。
同时,也是为了消除发生过程中声带和嘴唇的效应,来补偿语音信号受到发音系统所抑制的高频部分,也为了突出高频的共振峰
2.分帧
先将N个采样点集合成一个观测,称为帧。
通常情况下N的值为256或512,涵盖的时间约为20~30ms左右。
为了避免相邻两帧的变化过大,因此会让两相邻帧之间有一段重叠区域,此重叠区域包含了M个取样点,通常M的值约为N的1/2或1/3。
通常语音识别所采用语音信号的采样频率为8KHz或16KHz,以8KHz来说,若帧长度为256个采样点,则对应的时间长度是256/8000×1000=32ms
3.
加窗
将每一帧乘以汉明窗,以增加帧左端和右端的连续性。
假设分帧后的信号为S(n),n=0,1…,N-1,N为帧的大小,那么乘上汉明窗后
W(n)形式如下:
不同的a值会产生不同的汉明窗,一般情况下a取0.46。
4.快速傅里叶变换
由于信号在时域上的变换通常很难看出信号的特性,所以通常将它转换为频域上的能量分布来观察,不同的能量分布,就能代表不同语音的特性。
所以在乘上汉明窗后,每帧还必须再经过快速傅里叶变换以得到在频谱上的能量分布。
对分帧加窗后的各帧信号进行快速傅里叶变换得到各帧的频谱。
并对语音信号的频谱取模平方得到语音信号的功率谱。
设语音信号的DFT为:
式中x(n)为输入的语音信号,N
表示傅里叶变换的点数。
式中x(n)为输入的语音信号,N表示傅里叶变换的点数。
5.Mel滤波器组
将能量谱通过一组Mel尺度的三角形滤波器组,定义一个有M个滤波器的滤波器组(滤波器的个数和临界带的个数相近),采用的滤波器为三角滤波器,中心频率为f(m),m=1,2,...,M。
M通常取22-26。
各f(m)之间的间隔随着m值的减小而缩小,随着m值的增大而增宽,如图所示:
三角带通滤波器有两个主要目的:
对频谱进行平滑化,并消除谐波的作用,突显原先语音的共振峰(因此一段语音的音调或音高,是不会呈现在MFCC参数内,换句话说,以MFCC为特征的语音辨识系统,并不会受到输入语音的音调不同而有所影响)此外,还可以降低运算量。
预加重代码:
len=length(x1);
heigt=0.98;
fori=2:
len
x1(i)=x1(i)-heigt*x1(i-1);
end
fori=2:
len
x2(i)=x2(i)-heigt*x2(i-1);end
三角滤波器
if(f(m)
fh=20000;endF(m,k)=(x-f(m))/(f(m+1)-f(m));
melf=2595*log(1+fh/700);m=N/2;elseif(f(m+1)
M=24;fork=1:
12F(m,k)=(f(m+2)-x)/(f(m+2)-
f(m+1));i=0:
25;n=0:
23;
elsef=700*(exp(melf/2595*i/(M+1))-1);
dctcoef(k,:
)=cos((2*n+1)*k*pi/(2*24))F(m,k)=0;N=256;;endform=1:
24endendfork=1:
256count=floor(length(x1)/m);x=fh*k/N;
特征值欧氏距离
functiond=disteu(x,y)copies=zeros(1,P);d(:
p)=sum((x-y(:
p+copies))
.^2,1)";[M,N]=size(x);%音频x赋值给【M,Nforn=1:
N
】end%%成对欧氏距离的两个矩阵的列之间d(n,:
)=sum((x(:
n+copies)-的距离[M2,P]=size(y);%音频y赋值给【M2,Py).^2,1);
】endendif(M~=M2)d=d.^0.5;else
error("不匹配!
")%两个音频时间长copies=zeros(1,N);度不相等forp=1:
Pend
d=zeros(N,P);
if(N
提下
语音匹配
functionfinalmsg=test(testdir,n,msg=sprintf("finalmsg="第此位说话%d位说
话者与模板语音信号匹配code)者符合要求!
";%界面显示语句,可随意设定,符合要求!
\n",
k);fork=1:
n%readdisp(msg);
testsoundfileofeachspeakerd=disteu(v,code{1});%计end%此算得到模板和要判断的声音之间的“距离”人不匹配file=sprintf("%ss%d.wav",
testdir,k);dist=sum(min(d,[],2))/ifdist>distminsize(d,1);%变换得到一个距离的量[s,fs]=wavread(file);msg=sprintf("第%d位说话者与msgc=sprintf("与模板语音信号的模板语音信号不匹配v=mf(s,fs);%,不符合要求!
\n",k);得到差值为:
%10f",dist);测试人语音的mel倒谱系数finalmsg="此位说话者不符合disp(msgc);%此人匹配distmin=4;%要求!
";%界面显示语句,可随意设定阈值设置处
ifdist
1.语音库的建立:
2.声音样本采样:
3.
语音识别(识别)
4.语音识别(识别不成功)
THANKS
——TheEnd
内容仅供参考