声纹识别.docx
《声纹识别.docx》由会员分享,可在线阅读,更多相关《声纹识别.docx(19页珍藏版)》请在冰豆网上搜索。
![声纹识别.docx](https://file1.bdocx.com/fileroot1/2022-11/26/725429d9-6f5f-48e3-a874-ca2ef6633b03/725429d9-6f5f-48e3-a874-ca2ef6633b031.gif)
声纹识别
声
纹
识
别
25组
摘要
随着信息技术的发展,人们的交互手段越来越多样化,对身份鉴别的要求随之越来越高,生物认证技术基于人们自身的生理和行为特征进行身份鉴别,以其独特的优势,日益显示出它的价值。
声纹识别技术,又称说话人识别技术(SpeakerRecognition),被认为是最自然的生物认证技术,它是一项通过语音信号提取代表说话人身份的相关特征(如反映声门开合频率的基频特征、反映口腔大小形状及声道长度的频谱特征等),进而识别出说话人身份等工作方面的技术。
近年来,声纹识别技术己成为研究领域的一大热点与此同时,这一技术也存在着许多问题,集中于怎样从语音信号中提取尽量多与身份相关且比较稳定的特征信息(声纹特征会受到说话人的身体状况、说话的方式、录音信道及环境噪音的干扰而波动),以及怎样进行改进特征提取的方法,使其针对现有的特征能得到更好的识别结果。
它可以广泛应用于国家安全、刑侦、电话银行、智能门禁及娱乐增值等领域。
针对第一问我们我们采用文本相关数据,在matlab环境中建立MFCC模型,首先使用wavread(file)函数读入,然后以帧长256,帧移80进行分帧。
接着由语句x=filter([1-0.9375],1,x)实现对高频的加重处理,滤除低频干扰,特别是50Hz到60Hz的工频干扰,对语音识别更为有用的高频部分进行频谱提升。
接着,为了保持语音信号的短时平稳性,利用汉明窗函数来减少由截断处理导致的Gibbs效应。
最后提取出声音信号中的采样值,频率和采样位数。
针对第二问我们首先采用双门限的算法端点检测vad(x),然后采用MFCC参数算法mfcc(x):
输入为采样语音数据x,输出为mfcc参数,接着HMM参数初始化inithmm(samples,M),最后之别主程序显示出识别结果。
针对第三问我们通过LPC分析,得出最小的
可表示成:
(6)
显然,误差越接近于零,线性预测的准确度在均方误差最小的意义上为最佳,由此可以计算出预测系数。
最后我们根据上述分析得出改进办法。
关键词:
MFCCHMMMATLAB双门限的算法端点检测
短时傅里叶
一·问题重现
生物认证是通过人体特征进行人物身份认证的重要手段,包括人脸识别、虹
膜识别、指纹识别、体态识别和声纹识别等方法,它们被广泛地应用于国防、军
事和民用等诸多领域,推动着信息产业的蓬勃发展。
声纹识别又称说话人识别,是通过分析说话人的语音的特点,利用计算机自
动识别说话人的身份。
声纹识别又分为文本相关和文本无关说话人的识别两大类。
文本无关是指说话人的说话内容不受限制,文本相关是指说话人的说话内容必须是指定的内容。
评价声纹识别方法或模型的最重要指标是识别准确率,准确率越高越宜于应
用于实际。
评价的另外一个重要指标就是识别所花的时间,即输入待识别的说话
人语音到识别结果的输出说话的时间,该时间越短约好。
试着利用采集到的说话人语音数据(文本相关和文本无关两类,见附录一),完成以下几点:
1)建立代表说话人身份的语音特征模型,通过编程从语音数据中提取说话
人特征;
2)利用说话人特征建立说话人模型或声纹识别模型;
3)利用语音数据评价你的说话人模型或声纹识别模型评价的好坏;
4)分析影响准确率的因素,采取措施进一步提高声纹识别的准确率。
二·问题分析
2.1问题一
问题一要求建立代表说话人身份的语音特征模型,通过编程从语音数据中提取说话人特征。
我们采用文本相关数据,在matlab环境中建立MFCC模型,首先使用wavread(file)函数读入,然后以帧长256,帧移80进行分帧。
接着由语句x=filter([1-0.9375],1,x)实现对高频的加重处理,滤除低频干扰,特别是50Hz到60Hz的工频干扰,对语音识别更为有用的高频部分进行频谱提升。
接着,为了保持语音信号的短时平稳性,利用汉明窗函数来减少由截断处理导致的Gibbs效应。
最后提取出声音信号中的采样值,频率和采样位数。
2.2问题二
问题二要求利用说话人特征建立说话人模型或声纹识别模型。
(1)端点检测vad(x):
采用双门限的算法。
输入为采样语音数据x,输出X1,X2是起始端点和结束端点的帧数,并将xi到x2帧的语音数据存sample(k).wave结构数组中。
(2)MFCC参数算法mfcc(x):
输入为采样语音数据x,输出为mfcc参数,取x1—2至x2—2帧的mfcc参数到sample(k).data结构数组中。
(3)HMM参数初始化inithmm(samples,M):
输入为samples和NX*1的数组M,N为状态数,M是每个状态包含的高斯混合个数。
(4)viterbit识别算法:
输入删模型和mfcc参数,回溯最佳状态路径,返回输出概率和状态路径。
(5)训练过程train(sample,M):
对一次迭代函数baum.m实施n次迭代(设置迭代次数)。
输出为训练后的HMM模型参数和总输出概率,将模型参数存入hmm{i}(hmm为一个cell数组)。
(6)识别主程序(recog):
对输入待识别的语音用函数vad进行端点检测,计算出MFCC参数之后,交由识别函数viterbi.m计算得到其对数形式的输出概率,最后显示出识别结果。
2.3问题三
问题三要求利用语音数据评价你的说话人模型或声纹识别模型评价的好坏。
通过LPC分析,由若干帧语音可以得到若干组LPC参数,每组参数形成一个描绘该帧语音特征的矢量,即LPC特征矢量。
由LPC特征矢量可以进一步得到很多种派生特征矢量,例如线性预测倒谱系数、线谱对特征、部分相关系数、对数面积比等等。
不同的特征矢量具有不同的特点,它们在语音编码和识别领域有着不同的应用价值。
LP分析为线性时不变因果稳定系统V(z)建立一个全极点模型,并利用均方误差准则,对已知的语音信号s(n)进行模型参数估计。
如果利用P个取样值来进行预测,则称为P阶线性预测。
假设用过去P个取样值
的加权之和来预测信号当前取样值
。
最小的
可表示成:
(6)
显然,误差越接近于零,线性预测的准确度在均方误差最小的意义上为最佳,由此可以计算出预测系数。
2.4问题四
问题四要求分析影响准确率的因素,采取措施进一步提高声纹识别的准确率。
MFCC的分析着眼于人耳的听觉特性,Mel频率尺度的值大体上对应于实际频率的对数分布关系,更符合人耳的听觉特性,MFCC参数突出优点是不依赖极点语言产生模型的假定,考虑了人耳的听觉感知特性,抗噪声和抗频谱失真能力较强,从而提高识别系统的性能。
三·模型假设
1、假设语音信号都在同一理想状态下录制,其声纹特征不受录音信道及环境噪音的干扰而波动。
2、假设从语音信号中提取出的多为与身份相关且比较稳定的特征信息
3、假设对说话人进行声纹识别时说话人的身体状况、说话的方式等与录入时无区别。
四·符号说明
:
短时能量;
:
信号当前取样值;
:
预测信号
:
加权系数;
:
预测误差;
:
平均预测误差;
:
最小平均预测误差;
Mel(f):
梅尔頻率;
fs:
声纹频率;
ccc:
mfcc参数;
dtm:
一阶差分参数;
五·模型建立与求解
5.1问题一
5.1.1语音读入
我们采用文本相关数据,在matlab环境中建立MFCC模型,首先使用wavread(file)函数读入,如图1所示为数字0的训练语音00.wav的信号波形图,第(I)幅图为完整的语音波形,第(II)、(III)幅图分别为语音的起始部分和结束部分的放大波形图。
图1语音001.wav的信号波形图
5.1.2分帧
语音信号是一种典型的非平稳信号,它的均值函数u(x)和自相关函数R(xl,x2)都随时间而发生较大的变化[5,9]。
但研究发现,语音信号在短时间内频谱特性保持平稳,即具有短时平稳特性。
因此,在实际处理时可以将语音信号分成很小的时间段(约10~30ms[5,7]),称之为“帧”,作为语音信号处理的最小单位,帧与帧的非重叠部分称为帧移,而将语音信号分成若干帧的过程称为分帧。
分帧小能清楚地描绘语音信号的时变特征但计算量大;分帧大能减少计算量但相邻帧间变化不大,容易丢失信号特征。
一般取帧长20ms,帧移为帧长的1/3~1/2。
在Matlab环境中的分帧最常用的方法是使用函数enframe(x,len,inc),其中x为语音信号,len为帧长,inc为帧移。
在本系统中帧长取256,帧移取80。
5.1.3高频加重处理
对于语音信号的频谱,通常是频率越高幅值越小,在语音信号的频率增加两倍时,其功率谱的幅度下降6dB。
因此必须对高频进行加重处理,一般是将语音信号通过一个一阶高通滤波器1-0.9375z-1,即为预加重滤波器。
其目的是滤除低频干扰,特别是50Hz到60Hz的工频干扰,将对语音识别更为有用的高频部分进行频谱提升。
在计算短时能量之前将语音信号通过预加重滤波器还可起到消除直流漂移、抑制随机噪声和提升清音部分能量的效果。
预加重滤波器在Matlab中可由语句x=filter([1-0.9375],1,x)实现。
5.1.4加窗
由于语音信号的能量随时间变化,清音和浊音之间的能量差别相当显著。
因此对语音的短时能量进行分析,可以描述语音的这种特征变化情况。
定义短时能量为:
,其中N为窗长
图2不同hamming窗长的短时能量函数
最后提取出声音信号中的采样值,频率和采样位数。
5.2问题二
5.2.1设计方案
语音识别属于模式识别范畴,它与人的认知过程一样,其过程分为训练和识别两个阶段。
在训练阶段,语音识别系统对输入的语音信号进行学习。
学习结束后,把学习内容组成语音模型库存储起来;在识别阶段,根据当前输入的待识别语音信号,在语音模型库中查找出相应的词义或语义。
语音识别系统与常规模式识别系统一样包括特征提取、模式匹配、模型库等3个基本单元,它的基本结构如图2所示
图3语音识别系统基本结构图
本次设计主要是基于HMM模型(隐马尔可夫模型)。
这是在20世纪80年代引入语音识别领域的一种语音识别算法。
该算法通过对大量语音数据进行数据统计,建立识别词条的统计模型,然后从待识别语音信号中提取特征,与这些模型进行匹配,通过比较匹配分数以获得识别结果。
通过大量的语音,就能够获得一个稳健的统计模型,能够适应实际语音中的各种突发情况。
并且,HMM算法具有良好的识别性能和抗噪性能。
5.2.2方案框图
图4HMM语音识别系统
5.2.3隐马尔可夫模型
HMM过程是一个双重随机过程:
一重用于描述非平稳信号的短时平稳段的统计特征(信号的瞬态特征);另一重随机过程描述了每个短时平稳段如何转变到下一个短时平稳段,即短时统计特征的动态特性(隐含在观察序列中)。
人的言语过程本质上也是一个双重随机过程,语音信号本身是一个可观测的时变列。
可见,HMM合理地模仿了这一过程,是一种较为理想的语音信号模型。
其初始状态概率向量π,状态转移概率矩阵向量A,以及概率输出向量B一起构成了HMM的3个特征参量。
HMM模型通常表示成λ={π,A,B}。
5.2.4HMM模型的三个基本问题
HMM模型的核心问题就是解决以下三个基本问题:
(1)识别问题:
在给定的观测序列O和模型λ=(A,B,π)的条件下,如何有效地计算λ产生观测序列O的条件概率P(O︱λ)最大。
常用的算法是前后向算法,它可以使其计算量降低到N2T次运算。
(2)最佳状态链的确定:
如何选择一个最佳状态序列Q=q1q2…qT,来解释观察序列O。
常用的算法是Viterbi算法。
(3)模型参数优化问题:
如何调整模型参数λ=(A,B,π),使P(O︱λ)最大:
这是三个问题中最难的一个,因为没有解析法可用来求解最大似然模型,所以只能使用迭代法(如Baum-Welch)或使用最佳梯度法。
5.2.5系统框图
图5系统整体结构框图
5.2.6实施方案
实施方法及具体过程如下:
(1)端点检测vad(x):
采用双门限的算法。
输入为采样语音数据x,输出X1,X2是起始端点和结束端点的帧数,并将xi到x2帧的语音数据存sample(k).wave结构数组中。
(2)MFCC参数算法mfcc(x):
输入为采样语音数据x,输出为mfcc参数,取x1—2至x2—2帧的mfcc参数到sample(k).data结构数组中。
(3)HMM参数初始化inithmm(samples,M):
输入为samples和NX*1的数组M,N为状态数,M是每个状态包含的高斯混合个数。
(4)viterbit识别算法:
输入删模型和mfcc参数,回溯最佳状态路径,返回输出概率和状态路径。
(5)训练过程train(sample,M):
对一次迭代函数baum.m实施n次迭代(设置迭代次数)。
输出为训练后的HMM模型参数和总输出概率,将模型参数存入hmm{i}(hmm为一个cell数组)。
(6)识别主程序(recog):
对输入待识别的语音用函数vad进行端点检测,计算出MFCC参数之后,交由识别函数viterbi.m计算得到其对数形式的输出概率,最后显示出识别结果。
5.3问题三
5.3.1LP分析基本原理
LP分析为线性时不变因果稳定系统V(z)建立一个全极点模型,并利用均方误差准则,对已知的语音信号s(n)进行模型参数估计。
如果利用P个取样值来进行预测,则称为P阶线性预测。
假设用过去P个取样值
的加权之和来预测信号当前取样值
,则预测信号
为:
(1)
其中加权系数用
表示,称为预测系数,则预测误差为:
(2)
要使预测最佳,则要使短时平均预测误差最小有:
(3)
(4)
令
(5)
最小的
可表示成:
(6)
显然,误差越接近于零,线性预测的准确度在均方误差最小的意义上为最佳,由此可以计算出预测系数。
通过LPC分析,由若干帧语音可以得到若干组LPC参数,每组参数形成一个描绘该帧语音特征的矢量,即LPC特征矢量。
由LPC特征矢量可以进一步得到很多种派生特征矢量,例如线性预测倒谱系数、线谱对特征、部分相关系数、对数面积比等等。
不同的特征矢量具有不同的特点,它们在语音编码和识别领域有着不同的应用价值。
5.4问题四
与普通实际频率倒谱分析不同,MFCC的分析着眼于人耳的听觉特性,Mel频率尺度的值大体上对应于实际频率的对数分布关系,更符合人耳的听觉特性,MFCC参数突出优点是不依赖极点语言产生模型的假定,考虑了人耳的听觉感知特性,抗噪声和抗频谱失真能力较强,从而提高识别系统的性能。
但是在系统实时处理上,与LPCC参数相比,MFCC参数计算有两个缺点:
一是计算量大,计算时间长,很难达到实时性;二是精度难以保证,由于MFCC参数的计算需要FFT变换和对数操作,影响了计算机的动态范围,要保证其在单片机或DSP平台上的运算速度,就只有牺牲参数精度。
目前声纹识别技术的识别率,T-NETIX公司的SpeakEZ达到94%-95%。
日本岩井公司在此基础上研制的同类产品据称其识别率以达到99.8%。
根据最近的报道,国内的北京得意音通技术有限责任公司开发的“得意”身份证开发工具据其自称辨认和确认准确度都可以到达接近100%。
六·附录
主程序:
clc,clear
disp('正在计算参考模板的参数...')
fori=1:
10
fname=sprintf('01w.wma',i-1);
x=wavread(fname);
[x1x2]=vad(x);
m=mfcc(x);
m=m(x1-2:
x2-4,:
);
ref(i).mfcc=m;
end
disp('正在分析语音信号...')
fori=1:
10
fname=sprintf('01w.wma',i-1);
[x,fs,bit]=wavread(fname,[2000,2512]);%采样%
%sound(x,fs);%播放语音信号
figure(i);
subplot(3,3,1);
plot(x(1:
256));%原始语音信号的时域图形%
title('原始信号')
subplot(3,3,2)
[h,w]=freqz(x);%原始语音信号的频率响应图
hr=abs(h);
plot(w,hr);
title('频率响应图');
xlabel('Frequencyinrad/sample')
ylabel('MagnitudeindB')
subplot(3,3,3)
hphase=angle(h);
hphase=unwrap(hphase);%求系统相频响应
plot(w,hphase);
title('频率响应图');
xlabel('Frequencyinrad/sample')
ylabel('Phaseindegrees')
y=fft(x,512);%傅立叶变换%
mag=abs(y);
mag1=10*log10(mag);
f=fs*(0:
255)/512;
subplot(3,3,4)
plot(f,mag(1:
256));%FFT频谱图%
title('fft变换后信号')
iff=ifft(y,512);%反傅立叶变换%
ifm=abs(iff);
subplot(3,3,5)
plot(f,ifm(1:
256))
title('ifft后信号')
%短时傅里叶变换
Ts=1/fs;
%N=T/Ts;
N=512;
Nw=20;%窗函数长
L=Nw/2;%窗函数每次移动的样点数
Tn=(N-Nw)/L+1;%计算把数据x共分成多少段
nfft=32;%FFT的长度
TF=zeros(Tn,nfft);%将存放三维谱图,先清零
fori=1:
Tn
xw=x((i-1)*10+1:
i*10+10);%取一段数据
temp=fft(xw,nfft);%FFT变换
temp=fftshift(temp);%频谱以0频为中心
forj=1:
nfft;
TF(i,j)=temp(j);%把谱图存放在TF中
end
end
subplot(3,3,6)
fnew=((1:
nfft)-nfft/2)*fs/nfft;
tnew=(1:
Tn)*L*Ts;
[F,T]=meshgrid(fnew,tnew);
mesh(F,T,abs(TF))
title('短时傅立叶变换时频图')
subplot(3,3,7)
contour(F,T,abs(TF))
title('等高线表示')
end
disp('正在计算测试模板的参数...')
fori=1:
10
fname=sprintf('01x.wma',i-1);
x=wavread(fname);
[x1x2]=vad(x);
m=mfcc(x);
m=m(x1-2:
x2-4,:
);
test(i).mfcc=m;
end
disp('正在进行模板匹配...')
dist=zeros(10,10);
fori=1:
10
forj=1:
10
dist(i,j)=dtw(test(i).mfcc,ref(j).mfcc);
end
end
disp('正在计算匹配结果...')
fori=1:
10
[d,j]=min(dist(i,:
));
fprintf('测试模板%d的识别结果为:
%d\n',i-1,j-1);
end
子程序:
Vad.m
function[x1,x2]=vad(x)
%幅度归一化到[-1,1]
x=double(x);
x=x/max(abs(x));
%常数设置
FrameLen=240;
FrameInc=80;
amp1=10;
amp2=2;
zcr1=10;
zcr2=5;
maxsilence=3;%3*10ms=30ms
minlen=15;%15*10ms=150ms
status=0;
count=0;
silence=0;
%计算过零率
tmp1=enframe(x(1:
length(x)-1),FrameLen,FrameInc);
tmp2=enframe(x(2:
length(x)),FrameLen,FrameInc);
signs=(tmp1.*tmp2)<0;
diffs=(tmp1-tmp2)>0.02;
zcr=sum(signs.*diffs,2);
%计算短时能量
amp=sum(abs(enframe(filter([1-0.9375],1,x),FrameLen,FrameInc)),2);
%调整能量门限
amp1=min(amp1,max(amp)/4);
amp2=min(amp2,max(amp)/8);
%开始端点检测
x1=0;
x2=0;
forn=1:
length(zcr)
goto=0;
switchstatus
case{0,1}%0=静音,1=可能开始
ifamp(n)>amp1%确信进入语音段
x1=max(n-count-1,1);
status=2;
silence=0;
count=count+1;
elseifamp(n)>amp2zcr(n)>zcr
(2)%可能处于语音段
status=1;
count=count+1;
else%静音状态
status=0;
count=0;
end
case2,%2=语音段
ifamp(n)>amp
(2)zcr(n)>zcr
(2)%保持在语音段
count=count+1;
else%语音将结束
silence=silence+1;
ifsilencecount=count+1;
elseifcountstatus=0;
silence=0;
count=0;
else%语音结束
status=3;
end
end
case3,
break;
end
end
count=count-silence/2;
x2=x1+count-1;
mfcc.m
functionccc=mfcc(x)
%设定mel滤波器系数
bank=melbankm(24,256,8000,0,0.5,'m');
bank=full(bank);
bank=bank/max(bank(:
));
%设定DCT系数
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,hamming(256),80);
%计算每帧的mfcc参数
fori=1:
size(xx,1)
y=xx(i,:
);
s=y'.*hamming(256);