第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 【语音识别】基于matlab动态时间规整(DTW)孤立字语音识别【含Matlab源码 573期】

【语音识别】基于matlab动态时间规整(DTW)孤立字语音识别【含Matlab源码 573期】

时间:2024-01-16 01:58:26

相关推荐

【语音识别】基于matlab动态时间规整(DTW)孤立字语音识别【含Matlab源码 573期】

一、DTW简介

一个应用DTW的说话人识别系统如图8-4所示。它是与文本有关的说话人确认系统。它采用的识别特征是BP FG(附听觉特征处理) , 匹配时采用DTW技术。其特点为:①在结构上基本沿用语音识别的系统。②利用使用过程中的数据修正原模板,即当在某次使用过程

中某说话人被正确确认时使用此时的输人特征对原模板作加权修改(一般用1/10加权)。

这样可使模板逐次趋于完善。

采样时间间隔为2.5ms,所存的字音模板数为15x16,即15个说话人各自的16个规定音。建立模板时,每个说话人对各字音各发音10次再经适当平均得到上述的各模板。在确认过程中,要求待确认者在他已知的116个字音中任选2~4个。先任选2个字,将2个字所得的“计分”(距离的倒数)相加,若已超过判决逻辑中所设定的阈值则予以肯定。否则,令待确认者另选16个字中其它字音并将计分加权累计,直到共发4个字音。若仍未达到阈值,则给以拒绝。

这里提供一个典型的实验结果:对于1732个真的待确认者,经此系统的错误拒绝率为

0.6%;对于630个假的待证实者,错误接受率为0.3%。当然,适当改变阈值可以调整这

两种比率。

二、部分源代码

function trimmed_X = my_vad(x)%端点检测;输入为录入语音,输出为有用信号Ini = 0.1;%初始静默时间Ts = 0.01;%窗的时长Tsh = 0.005; %帧移时长Fs = 16000; %采样频率counter1 = 0; %以下四个参数用来寻找起始点和结束点counter2 = 0;counter3 = 0;counter4 = 0;ZCRCountf = 0;%用于存储过零率检测结果ZCRCountb = 0;ZTh = 40; %过零阈值w_sam = fix(Ts*Fs); %窗口长度o_sam = fix(Tsh*Fs); %帧移长度lengthX = length(x);segs = fix((lengthX-w_sam)/o_sam)+1; %分帧数sil = fix((Ini-Ts)/Tsh)+1; %静默时间帧数win = hamming(w_sam);Limit = o_sam*(segs-1)+1; %最后一帧的起始位置FrmIndex = 1:o_sam:Limit; %每一帧的起始位置ZCR_Vector = zeros(1,segs); %记录每一帧的过零点数%短时过零点for t = 1:segsZCRCounter = 0; nextIndex = (t-1)*o_sam+1;for r = nextIndex+1:(nextIndex+w_sam-1)if (x(r) >= 0) && (x(r-1) >= 0)elseif (x(r) > 0) && (x(r-1) < 0)ZCRCounter = ZCRCounter + 1;elseif (x(r) < 0) && (x(r-1) < 0)elseif (x(r) < 0) && (x(r-1) > 0)ZCRCounter = ZCRCounter + 1;endendZCR_Vector(t) = ZCRCounter;end%短时平均幅度Erg_Vector = zeros(1,segs);for u = 1:segsnextIndex = (u-1)*o_sam+1;Energy = x(nextIndex:nextIndex+w_sam-1).*win;Erg_Vector(u) = sum(abs(Energy));endIMN = mean(Erg_Vector(1:sil)); %静默能量均值(噪声均值)IMX = max(Erg_Vector);%短时平均幅度的最大值I1 = 0.03 * (IMX-IMN) + IMN; %I1,I2为初始能量阈值I2 = 4 * IMN;ITL = 100*min(I1,I2); %能量阈值下限,前面系数根据实际情况更改得到合适结果ITU = 10* ITL; %能量阈值上限IZC = mean(ZCR_Vector(1:sil)); stdev = std(ZCR_Vector(1:sil)); %静默阶段过零率标准差IZCT = min(ZTh,IZC+2*stdev); %过零率阈值indexi = zeros(1,lengthX);indexj = indexi;indexk = indexi;indexl = indexi;%搜寻超过能量阈值上限的部分for i = 1:length(Erg_Vector)if (Erg_Vector(i) > ITU)counter1 = counter1 + 1;indexi(counter1) = i;endendITUs = indexi(1); %第一个能量超过阈值上限的帧%搜寻能量超过能量下限的部分for j = ITUs:-1:1if (Erg_Vector(j) < ITL)counter2 = counter2 + 1;indexj(counter2) = j;endendstart = indexj(1)+1; %第一级判决起始帧Erg_Vectorf = fliplr(Erg_Vector);%将能量矩阵关于中心左右对称,如果是一行向量相当于逆序 %重复上面过程相当于找结束帧for k = 1:length(Erg_Vectorf)if (Erg_Vectorf(k) > ITU)counter3 = counter3 + 1;indexk(counter3) = k;endend%初始化DTW判别矩阵Scores1 = zeros(1,N);Scores2 = zeros(1,N);Scores3 = zeros(1,N);%加载模板数据s1 = load('Vectors1.mat');fMatrixall1 = struct2cell(s1);s2 = load('Vectors2.mat');fMatrixall2 = struct2cell(s2);s3 = load('Vectors3.mat');fMatrixall3 = struct2cell(s3);%计算DTWfor i = 1:NfMatrix1 = fMatrixall1{i,1};fMatrix1 = CMN(fMatrix1);Scores1(i) = myDTW(fMatrix1,rMatrix);endfor j = 1:NfMatrix2 = fMatrixall2{j,1};fMatrix2 = CMN(fMatrix2);Scores2(j) = myDTW(fMatrix2,rMatrix);end

三、运行结果

四、matlab版本及参考文献

1 matlab版本

a

2 参考文献

[1]韩纪庆,张磊,郑铁然.语音信号处理(第3版)[M].清华大学出版社,.

[2]柳若边.深度学习:语音识别技术实践[M].清华大学出版社,.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。