gusucode.com > 用matlab仿真0到9十个数字的语音识别源码程序 > Speech-Recogenition/shibiesb.m

    function [num sbjg]=shibiesb(file)
%识别原始的语音文件
%filename='D:\work\语音\1107\语音文件\t222';
filename=file;
[qs,zz,num]=readlab([filename '.lab']);
[d,fp,dt,tc,t]=readhtk([filename '.wav']);
pd=zeros(4,3000);%定义一个临时的矩阵pd,用于存储4个语音波形序列,序列长度不超过3000
%通过.lab和.wav文件将语音文件中的声音信号读入pd中
for i=1:4
    qs1(i)=round(qs(i)/fp/10000000);
    zz1(i)=round(zz(i)/fp/10000000);
    cb(i)=zz1(i)-qs1(i)+1;
    pd(i,1)=cb(i);
    for j1=qs1(i):zz1(i)
        pd(i,j1-qs1(i)+2)=d(j1);
    end                
end
%分别对4个数字进行识别      
for sb=1:4
    [ceps,freqresp,fb,fbrecon,freqrecon] = 	mfcc(pd(sb,2:pd(sb,1)), 8000, 160); %计算每个数字的mfcc参数   
    [a1 a2]=size(ceps);
    if (a2>14)
        datacell(:,:,sb)=ceps(:,1:15);%截取前13*15部分
        
    %读取0到9十个数字的HMM特征参数,并计算概率
    for i=1:10
        fid = fopen(['d:\shuzi' char(i+47) '.mat'],'r');
        prior=fread(fid,6,'double');
        prior=reshape(prior,6,1);
        transmat=fread(fid,36,'double');
        transmat=reshape(transmat,6,6);
        mu=fread(fid,78,'double');
        mu=reshape(mu,13,6);
        Sigma=fread(fid,1014,'double');
        Sigma=reshape(Sigma,13,13,6);
        mixmat=fread(fid,6,'double');
        mixmat=reshape(mixmat,6,1);
        fclose(fid);
        loglik(i) = mhmm_logprob(datacell(:,:,sb), prior, transmat, mu, Sigma, mixmat);%计算概率
    end
    %比较概率的大小,求出概率最大者
    jieguo=loglik(1);
    jg=1;
    for i=1:10
        if loglik(i)>jieguo
            jieguo=loglik(i);
            jg=i;
        end
    end
    sbjg(sb)=jg-1;
    else
        sbjg(sb)=-1;
    end
    
end