
语音信号
-
2023年3月20日发(作者:u族大学贷)绪论
语言是人类交流信息的基本手段,在人们日益扩大的交流中占据着重要地
位。在如今高度发达的信息社会中用数字化的方法进行语音的传送、储存识别、
合成、增强等是整个数字化通信网中最重要、最基本的组成部分之一随着信息科
学技术的飞速发展,语音信号处理的研究也日益显示出它的要性,并取得了重大
进展。大体上说,语音信号处理技术可以分为以下四个面:即语音编码,语音合
成、说话人识别和语音识别等。语音压缩编码是压语音信号便于传输通信和保密;
语音合成系统是模仿和代替人口的发音功能语音识别系统则是模仿或代替人耳
的听觉功能,说话人识别系统属于生物识技术的一种,是一项根据语音波形中反
映说话人生理和行为特征的语音参数识别说话人身份的技术。与语音识别不同的
是,说话人识别利用的是语音信中的说话人信息,而不考虑语音中的字词意思,
它强调一说话人的个性;而音识别的目的是识别出语音信号中的言语内容,并不
考虑说话人是谁,它强共性。随着现代数字通讯、多媒体系统、信息高速公路等
技术的应用和发展己经越来越深入地影响并改变着我们每个人地生活和工作方
式,这同时也对音信号处理的研究工作提出了更高的要求,它在各方面的进展也
令人瞩目。
1.语音识别概述
语音识别是试图使机器能“听懂”人类语音的技术。语音识别的作用是将语
音转换成等价的书面信息,也就是让计算机听懂人说话。作为一门交叉学科,语
音识别又是以语音为研究对象,是语音信号处理的一个重要研究方向,是模式识
别的一个分支,涉及到计算机、信号处理、生理学、语言学、神经心理学、人工
智能等诸多领域,甚至还涉及到人的体态语言(如人在说话时的表情、手势等行
为动作可帮助对方理解),其最终目标是实现人与机器进行自然语言通信
1.1国外研究历史及现状
语音识别的研究工作可以追溯到20世纪50年代。1952年AT&T贝尔实验室的
Audry系统,是第一个可以识别十个英文数字的语音识别系统。20世纪60年代
末、70年代初出现了语音识别方面的几种基本思想,其中的重要成果是提出了
信号线性预测编码(LPC)技术和动态时间规整(DTW)技术,有效地解决了语音信
号的特征提取和不等长语音匹配问题;同时提出了矢量量化(VQ)和隐马尔可夫模
型(HMM)理论。20世80年代语音识别研究进一步走向深入:其显著特征是HMM
模型和人工神经网络(ANN)在语音识别中的成功应用。90年代,在计算机技术、
电信应用等领域飞速发展的带动下,迫切要求语音识别系统从实验室走向实用。
最具代表性的是IBM的ViaVoice和Dragon公司的DragonDictate系统。这些系
统具有说话人自适应能力,新用户不需要对全部词汇进行训练,便可在使用中不
断提高识别率。
1.2国内研究历史及现状
我国在语音识别研究上也投入了很大的精力,国内中科院的自动化所、声学所以
及清华大学等科研机构和高校都在从事语音识别领域的研究和开发。国家863
智能计算机专家组为语音识别技术研究专门立项,我国语音识别技术的研究水平
已经基本上与国外同步。
2.语音识别的流程
根据对输出观测值概率的不同描述,HMM(隐式马尔可夫链)可分为离散
HMM(DHMM)和连续HMM(CHMM),两者相似,不同的是CHMM使用连
续概率密度函数计算状态概率。而DHMM则使用的是离散的矢量量化(vector
quantization,VQ)计算状态概率。在基于DHMM的非特定人语音识别过程中
语音信号先被分成若干音框(帧),每个音框用一个特征向量参数表示,然后将
语音特征参数向量的时间序列矢量化,此时每一个音框的语音信号变成VQ码
本,用码本训练HMM,最后测试识别率。
3.语音信号分析方法分类时域特征
直接从时域信号计算得到,反应了语音信号时域波形的特征。如短时平均能
量、短时平均过零率、共振峰、基音周期等。
频域及倒谱域特征由时域信号进行频谱变换得到,反映语音信号的频域特性
包括傅里叶频谱、倒谱以及利用了语音信号的时序信息的时频谱。听觉特征指不
直接对声道模型进行研究,而是从人类听觉系统对语音的感知特性来刻画语音信
号的特征。
4.短时分析技术
语音信号是非平稳时变信号语音信号的特性是随时间而变化的幸运的是具
有短时平稳性短时间范围内其特性基本保持不变(缓慢变换),即短时相对平稳
——准平稳过程短时分析技术即在对语音信号进行分析时,将语音信号分为一段
一段,利用平稳信号的分析方法对每一分段进行处理每一分段成为一“帧”:一般
10~30ms为一帧短时分析的不足对语音识别,应采用HMM来分析,以处理语音信
号的瞬变和非平稳特性
5.基于Mel频率的倒谱MFCC
生理支持
根据人类听觉系统的特性,人耳分辨声音频率的过程犹如一种取对数的功
能,基于此,出现了Mel频率的倒谱系数(MFCC)MFCC:Mel-FrequencyCepstrum
Coefficients.
语音识别MFCC参数提取:
在语音识别(SpeechRecognition)和语者辨识(SpeakerRecognition)方
面,最常用到的语音特征就是[梅尔倒频谱系数](Mel-scaleFrequencyCepstral
Coefficients,简称MFCC),此参数考虑到人耳对不同频率的感受程度,因此特
别适合用在语音识别。下面简单的介绍一下求解MFCC的过程。
5.1音框化(Frameblocking)
先将N个取样点集合成一个观测单位,称为音框(Frame),通常N的值256
或512,涵盖的时间约为20~30ms左右。为了避免相邻两音框的变化过大,所
以我们会让两相邻因框之间有一段重迭区域,此重迭区域包含了M个取样点,
通常M的值约是N的一半或1/3。通常语音识别所用的音频的取样频率为8
KHz或16KHz,8KHz来说,若音框长度为256个取样点,则对应的时间长度
是256/8000*1000=32ms。
5.2汉明窗(Hammingwindow)
将每一个音框乘上汉明窗,以增加音框左端和右端的连续性(请见下一个步
骤的说明)。假设音框化的讯号为S(n),n=0,…N-1。那么乘上汉明窗后为S'(n)
=S(n)*W(n),此W(n)形式如下
5.3快速傅利叶转换(FastFourierTransform,orFFT)
由于讯号在时域(Timedomain)上的变化通常很难看出讯号的特性,所以
通常将它转换成频域(Frequencydomain)上的能量分布来观察,不同的能量
分布,就能代表不同语音的特性。所以在乘上汉明窗后,每个音框还必需再经过
FFT以得到在频谱上的能量分布。
乘上汉明窗的主要目的,是要加强音框左端和右端的连续性,这是因为在进行
FFT时,都是假设一个音框内的讯号是代表一个周期性讯号,如果这个周期性不
存在,FFT会为了要符合左右端不连续的变化,而产生一些不存在原讯号的能
量分布,造成分析上的误差。当然,如果我们在取音框时,能够使音框中的讯号
就已经包含基本周期的整数倍,这时候的音框左右端就会是连续的,那就可以不
需要乘上汉明窗了。但是在实作上,由于基本周期的计算会需要额外的时间,而
且也容易算错,因此我们都用汉明窗来达到类似的效果。
5.4三角带通滤波器组(TriangularBandpassFilters)
将能量频谱能量乘以一组20个三角带通滤波器,求得每一个滤波器输出的
对数能量(LogEnergy)。必须注意的是:这20个三角带通滤波器在梅尔频率(Mel
Frequency)上是平均分布的,而梅尔频率和一般频率f的关系式如下:
Mel(F)=2595*log)
700
1(
10
F
梅尔频率代表一般人耳对于频率的感受度,由此也可以看出人耳对于频率f
的感受是呈对数变化的:在低频部分,人耳感受是比较敏锐。在高频部分,人
耳的感受就会越来越粗糙。
三角带通滤波器有两个主要目的:
对频谱进行平滑化,并消除谐波的作用,突显原先语音的共振峰。因此一段
语音的音调或音高,是不会呈现在MFCC参数内,所以,用MFCC为特征的语
音识别系统,并不会受到输入语音的音调不同而有所影响。
将傅立叶转换结果经三角带通滤波器组进行滤波。
)(kB
m
表示第m
个频带的三角带通滤波器
kf
kkf
ff
kf
kkf
ff
fk
fk
kB
m
mm
mm
m
mm
mm
m
m
m
1
1
1
1
1
1
1
1
,0
,
,
,0
)(
Mm1
其中
m
f
是第
m
个频带的中心,这
M
个三角形带通滤波器在美尔
(Mel-frequency)上是平均分配的。
下面方程式求每一个滤波器输出的对数能量
)()(log)(2
1
kBkXmY
m
fkf
mm
5.5离散余弦转换(Discretecosinetransform,orDCT)
将滤波器输出的能量作离散余弦(DiscreteCosineTransform,DCT)计算梅
尔频率倒频谱系数(Mel-frequencyCepstralCoefficients,MFCC)
离散余弦计算公式:
Ln
M
mnmYnC
M
m
,...,1,])
2
1
(cos[)(][
1
其中
L
大致取12左右。
5.6对数能量(Logenergy)
一个音框的音量(即能量),也是语音的重要特征,而且非常容易计算。因
此我们通常再加上一个音框的对数能量(定义为一个音框内讯号的平方和,再取
以10为底的对数值,再乘以10),使得每一个音框基本的语音特征就有13
维,包含了1个对数能量和12个倒频谱参数。(若要加入其他语音特征以测
试辨识率,也可以在此阶段加入,这些常用的其他语音特征,包含音高、过零率、
共振峰等。)
5.7差量倒频谱参数(Deltacepstrum)
虽然已经求出13个特征参数,然而在实际应用于语音识别时,我们通常会
再加上差量倒频谱参数,以显示倒频谱参数对时间的变化。它的意义为倒频谱参
数相对于时间的斜率,也就是代表倒频谱参数在时间上的动态变化,公式如下:
Lm
tCtCtC
tC
M
M
mm
M
M
M
M
m
m
,...,2,1,
2
)(
1
2
1
2
这里M的值一般是取2,t代表音框的数目,cm(t)指第t框的倒谱参数。因
此,如果加上差量运算,就会产生26维的特征向量;如果再加上差差量运算,
就会产生39维的特征向量。一般我们在PC上进行的语音识别,就是使用39
维的特征向量。
6.矢量量化,矢量量化的关键问题是如何获取VQ码本,本文采用聚类算法
-LBG算法。
7.用MATLAB实时采集信号程序
首先将录音放到程序中的路径下,运行即可。运行结果如下:
语音库语者1与语者1匹配成功
语音库语者2与语者2匹配成功
语音库语者3与语者2匹配成功
语音库语者4与语者4匹配成功
语音库语者5与语者5匹配成功
语音库语者6与语者6匹配成功
语音库语者7与语者7匹配成功
语音库语者8与语者8匹配成功
语音库语者9与语者9匹配成功
8.结论:
运行结果表明该说话人识别系统的识别能力是比较理想的,识别率为88%,
语音库3识别不成功的原因主要有两个,一方面3的录音本身噪音相对大些,导
致系统很难识别,另一方面,识别系统的算法还不是很理想,导致识别准确率不
是100%。
程序如下:
functionspeaker_rec
%%%%
code=train('D:toolswork',9);
test('D:toolswork',9,code);
%***************************************************************
*********
functioncode=train(traindir,n)
%%训练语音库里的声音样本,为每个人建立一个VQ码本
%%code=train(train,n)
%%训练前,应将语音库中的语音文件用1:n的数字标记
%Input:
%traindir:样本语音库的路径
%n:样本语音库中语音文件的个数
%
%Output:
%code:trainedVQcodebooks,code{i}fori-thspeaker
k=16;%VQ算法的最大迭代次数
fori=1:n
file=sprintf('%s%',traindir,i);
[s,fs]=wavread(file);
s=s(1:30000,1);
index=find(s==0);%避免除0
s(index)=1e-17;
v=MFCC(s,fs);%ComputeMFCC's
code{i}=vqlbg(v,k);%TrainVQcodebook
end
%***************************************************************
**********
functiontest(testdir,n,code)
%用于对测试语音库中的文件进行测试
%建库的时候应该给语音文件按阿拉伯数字进行编码,以方便程序读取
%Input:
%testdir:测试语库的路径
%n:测试语音库中语音文件的个数
%code:codebooksofalltrainedspeakers
fork=1:n%读取测试库中的文件
file=sprintf('%s%',testdir,k);
[s,fs]=wavread(file);
s=s(30000:60000,1);%读取文件中的样本点,改变数值即可获
取语音资料中的不同段
index=find(s==0);%避免除0
s(index)=1e-17;
v=MFCC(s,fs);%ComputeMFCC's
distmin=inf;
k1=0;
forl=1:length(code)%eachtrainedcodebook,computedistortion
d=disteu(v,code{l});%测试语音与码本进行逐一匹配(计算欧氏
距离)
dist=sum(min(d,[],2))/size(d,1);
ifdist distmin=dist; k1=l; end end msg=sprintf('语音库语者%d与语者%d匹配成功',k,k1); disp(msg); end %*************************************************************** ********** functiond=disteu(x,y) %%计算两个矩阵列之间的欧氏距离 %DISTEUPairwiseEuclideandistancesbetweencolumnsoftwomatrices % %Input: %x,y:Twomatriceswhoseeachcolumnisanavectordata. % %Output: %d:Elementd(i,j)willbetheEuclideandistancebetweentwo %columnvectorsX(:,i)andY(:,j) % %Note: %TheEuclideandistanceDbetweentwovectorsXandYis: %D=sum((x-y).^2).^0.5 [M,N]=size(x); [M2,P]=size(y); if(M~=M2) error('Matrixdimensionsdonotmatch.') end d=zeros(N,P); if(N copies=zeros(1,P); forn=1:N d(n,:)=sum((x(:,n+copies)-y).^2,1); end else copies=zeros(1,N); forp=1:P d(:,p)=sum((x-y(:,p+copies)).^2,1)'; end end d=d.^0.5; %*************************************************************** ********** functionr=vqlbg(d,k) %%采用LBG算法获取VQ码本 %%该算法程序来源:程序员联合开发网 %VQLBGVectorquantizationusingtheLinde-Buzo-Grayalgorithme % %Inputs:dcontainstrainingdatavectors(onepercolumn) %k:算法最大的迭代次数 % %Output:rcontainstheresultVQcodebook(kcolumns,oneforeachcentroids) e=.01; r=mean(d,2); dpr=10000; fori=1:log2(k) r=[r*(1+e),r*(1-e)]; while(i==1) z=disteu(d,r); [m,ind]=min(z,[],2); t=0; forj=1:2^i r(:,j)=mean(d(:,find(ind==j)),2);%mean为MathWorks的库函数 x=disteu(d(:,find(ind==j)),r(:,j)); forq=1:length(x) t=t+x(q); end end if(((dpr-t)/t) break; else dpr=t; end end end %*************************************************************** *********** %MFCC.m %本文件用于计算MFCC倒谱系数(共可获得26维参数) %输入:s为用声卡采集的信号 %输出:C为计算出的倒谱系数 functionC=MFCC(s,FS) %*************************************************************** ********* %将信号先音框化后加汉明窗(n为音框宽m为音框距) m=100; n=256; l=length(s); nbFrame=floor((l-n)/m)+1; fori=1:n forj=1:nbFrame M(i,j)=s(((j-1)*m)+i); end end h=hamming(n); M2=diag(h)*M; fori=1:nbFrame frame(:,i)=fft(M2(:,i));%得各个音框的频谱 end %*************************************************************** *********** %%用在melf频带上均布的三角带通滤波器组对频谱能量进行滤波 %将HZ转换美尔坐标 melf=2595*log10(1+FS/2/700); melf_width=melf/21; i=[0:21]; tem_melf=melf_width*i; f_tem=(10.^(tem_melf/2595)-1)*700; %f_tem=round(f_tem);%划分频率段f_tem(2:21)即 为20个中心频率 fori=2:21 fm(i)=f_tem(i);%fm为第m个频带的中心 end fm(22)=FS/2; fm(1)=0; bm=zeros(20,n/2+1); j=1:n/2; k(2:n/2+1)=FS/2/(n/2)*j; fori=2:21 forj=1:n/2+1 ifk(j) bm1(j)=0; elseiffm(i-1)<=k(j)&k(j)<=fm(i) bm1(j)=(k(j)-fm(i-1))/(fm(i)-fm(i-1)); elseiffm(i) bm1(j)=(fm(i+1)-k(j))/(fm(i+1)-fm(i)); else bm1(j)=0; end end end end bm(i-1,:)=bm1; end n2=1+floor(n/2); z=bm*abs(frame(1:n2,:)).^2; c=dct(log(z));%c为倒谱系数 c=c(1:12,:);%取前12维倒谱系数 %*************************************************************** *********** %%计算音框的对数能量 tem_frame=frame(1:n2,:); fori=1:nbFrame tem_frame(:,i)=tem_frame(:,i).^2; sum_frame(i)=sum(tem_frame(:,i)); end c_energy=10*log10(sum_frame);%c_energy为第十三维参数 c13=zeros(12,nbFrame); c13(:,1:nbFrame)=c(:,1:nbFrame); c13(13,:)=c_energy;%c13为十三维参数 %*************************************************************** *********** %%计算差量倒谱系数 %%计算一阶差分 M=2; tao=1:M; tem=tao.^2; tem=sum(tem)*2; c26_tem=zeros(13,nbFrame+4); c26=zeros(26,nbFrame); tem1=zeros(13,2); tem2=zeros(13,nbFrame); c26_tem(:,3:nbFrame+2)=c13(:,1:nbFrame); fori=1:nbFrame forj=1:2 tem1(:,j)=(c26_tem(:,i+2+j)-c26_tem(:,i+2-j))*j/tem; end tem2(:,i)=tem1(:,1)+tem1(:,2); end c26(14:26,:)=tem2(1:13,:);%c26为一阶差分后的26维参数 c26(1:13,:)=c13(1:13,:); C=c26; %*************************************************************** ***********