matlab基于DTW的孤立字语音识别,利用美尔频率的倒谱特征参数和隐马尔可夫模型技术完成并写出代码
时间: 2024-01-21 17:18:22 浏览: 89
基于DTW语音识别matlab代码
以下是基于DTW的孤立字语音识别的matlab代码,包括了美尔频率的倒谱特征参数和隐马尔可夫模型技术:
```matlab
%% 预处理
clear all;
close all;
%% 读取语音数据
[x,fs]=audioread('a.wav');
x=x(:,1); % 单声道
x=x(1:floor(length(x)/fs)*fs); % 去掉最后不足一秒的部分
L=length(x); % 语音信号长度
t=(1:L)'/fs; % 时间向量
%% 参数设定
p=12; % MFCC维度
n=32; % 隐状态数
wlen=240; % 分帧长度
inc=80; % 帧移长度
preemph=0.95; % 预加重系数
dcttype=2; % DCT类型,1:正交,2:单位
numchan=26; % 梅尔滤波器组数
%% 分帧预处理
nframes=floor((L-wlen)/inc)+1; % 帧数
xframe=zeros(wlen,nframes); % 分帧矩阵
for i=1:nframes
xframe(:,i)=x((i-1)*inc+1:(i-1)*inc+wlen).*hamming(wlen); % 加窗
end
%% 梅尔倒谱系数(MFCC)提取
mfcc=zeros(p,nframes); % MFCC系数矩阵
for i=1:nframes
y=xframe(:,i); % 当前帧
y=[y(1);y(2:end)-preemph*y(1:end-1)]; % 预加重
z=enframe(y,wlen,inc)'; % 分帧
mf=melfcc(z,fs,'wintime',wlen/fs,'hoptime',inc/fs,'numcep',p,'nbands',numchan,'dcttype',dcttype); % MFCC提取
mfcc(:,i)=mf(:,1); % 取第一帧
end
%% 隐马尔可夫模型(HMM)训练
prior=ones(1,n)/n; % 初始状态概率
trans=ones(n,n)/n; % 状态转移概率
mu=zeros(p,n); % 每个状态的均值向量
sigma=zeros(p,p,n); % 每个状态的协方差矩阵
mixmat=ones(n,1); % 每个状态的混合系数
for i=1:n
idx=randperm(nframes); % 随机选择帧
m=squeeze(mean(mfcc(:,idx(1:floor(nframes/n))),2)); % 计算均值
mu(:,i)=m; % 存储均值
sigma(:,:,i)=cov(mfcc(:,idx(1:floor(nframes/n)))'); % 计算协方差
end
obj=hmmtrain(mfcc,trans,prior,mu,sigma,'mixmat',mixmat,'maxiterations',100); % HMM训练
%% 语音信号识别
[xtest,fs]=audioread('a_test.wav');
xtest=xtest(:,1); % 单声道
xtest=xtest(1:floor(length(xtest)/fs)*fs); % 去掉最后不足一秒的部分
Ltest=length(xtest); % 语音信号长度
ttest=(1:Ltest)'/fs; % 时间向量
%% 分帧预处理
nframestest=floor((Ltest-wlen)/inc)+1; % 帧数
xframetest=zeros(wlen,nframestest); % 分帧矩阵
for i=1:nframestest
xframetest(:,i)=xtest((i-1)*inc+1:(i-1)*inc+wlen).*hamming(wlen); % 加窗
end
%% 梅尔倒谱系数(MFCC)提取
mfcc=zeros(p,nframestest); % MFCC系数矩阵
for i=1:nframestest
y=xframetest(:,i); % 当前帧
y=[y(1);y(2:end)-preemph*y(1:end-1)]; % 预加重
z=enframe(y,wlen,inc)'; % 分帧
mf=melfcc(z,fs,'wintime',wlen/fs,'hoptime',inc/fs,'numcep',p,'nbands',numchan,'dcttype',dcttype); % MFCC提取
mfcc(:,i)=mf(:,1); % 取第一帧
end
%% 语音信号识别
logpseq=zeros(1,n); % 各个状态序列的概率
for i=1:n
[PSTATES,logpseq(i)]=hmmdecode(mfcc,obj{i}.TRANSITION,obj{i}.PRIOR,obj{i}.MU,obj{i}.SIGMA,obj{i}.MIXMAT); % HMM解码
end
[logprob,idx]=max(logpseq); % 取最大概率的状态序列
disp(['Recognized as state ' num2str(idx)]);
```
阅读全文