利用matlab实现小规模孤立词识别(学习记录)


前言

语音识别是人机接口设计的一项重要内容,其研究目标是利用数字语音信号处理技术实现计算机
对人类语音中词汇内容的理解,并且做出相应的反应。

一、录制个人的训练语音及测试语音 

在训练阶段, 用户将词汇表中每个词依次说一 遍,并且将其特征矢量时序作为模板存入模板库

代码如下:

fs = 16000; %采样频率
duration = 2; %时间长度
n = duration*fs;
t = (1:n)/fs;
recObj = audiorecorder(fs,16,1);
recordblocking(recObj, duration);
y = getaudiodata(recObj);
ymax = max(abs(y) ); %归一化
y = y/ymax;
audiowrite('x.wav',y,fs);  

录制输入语音

代码如下:

n = duration*fs;
t=(1:n)/fs;
recObj = audiorecorder(fs,16,1);
recordblocking(recObj,duration);
y = getaudiodata(recObj);
ymax = max(abs(y)); %归一化
y = y/ymax;
audiowrite('x1.wav',y,fs);%保存语音文件 

二、识别语音

1.提取特征参数mfcc

代码如下(示例):

bank = melbankm(24,256,16000,0,0.5,'m') ;
bank = full(bank) ;
bank = bank/max( bank(:));
for k = 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,frameSize,inc);
n2 = fix(frameSize/2)+1;
%计算每帧的 MFCC 参数
for i=1:size(xx,1)
    y=xx(i,:);
    s=y'.*hamming(512);
    t=abs(fft(s));
    t=t.^2;
    c1=dctcoef*log(bank*t(1:129));
    c2=c1.*w';
    m(i,:)=c2';
end
%差分系数
dtm = zeros(size(m));
for i = 3:size(m,1)-2
dtm(i,:) = -2*m(i-2,:)-m(i-1,:)+m(i+1,:)+2*m(i+2,:);
end
dtm = dtm/3;

2.使用动态时间规整(DTW)算法计算语音模板之间的距离

代码如下(示例):

for j=1:9
fname=sprintf('%d.wav',j);
x=fname;
[x,fs]=audioread(x);
m = mfcc(x,fs);
ref(j).mfcc = m;
end
i=1;
fname= sprintf('13.wav');
x=fname;
[x,fs]=audioread(x);
m = mfcc(x,fs);
test(i).mfcc =m;
dist = zeros(10,10);
for i=1
    for j=1:9
        dist(i,j) = dtw(test(i).mfcc,ref(j).mfcc);
    end
end
[d,i] = min([dist(i,1),dist(i,2),dist(i,3),dist(i,4),dist(i,5),
dist(i,6),dist(i,7),dist(i,8),dist(i,9)]);


总结

还在学习如何训练更大规模的语音识别中...........

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值