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

一、简介

Dynamic Time Warping(DTW)诞生有一定的历史了(日本学者Itakura提出),它出现的目的也比较单纯,是一种衡量两个长度不同的时间序列的相似度的方法。应用也比较广,主要是在模板匹配中,比如说用在孤立词语音识别(识别两段语音是否表示同一个单词),手势识别,数据挖掘和信息检索等中。

1 概述

在大部分的学科中,时间序列是数据的一种常见表示形式。对于时间序列处理来说,一个普遍的任务就是比较两个序列的相似性。
在时间序列中,需要比较相似性的两段时间序列的长度可能并不相等,在语音识别领域表现为不同人的语速不同。因为语音信号具有相当大的随机性,即使同一个人在不同时刻发同一个音,也不可能具有完全的时间长度。而且同一个单词内的不同音素的发音速度也不同,比如有的人会把“A”这个音拖得很长,或者把“i”发的很短。在这些复杂情况下,使用传统的欧几里得距离无法有效地求的两个时间序列之间的距离(或者相似性)。
2 DTW方法原理

在时间序列中,需要比较相似性的两段时间序列的长度可能并不相等,在语音识别领域表现为不同人的语速不同。而且同一个单词内的不同音素的发音速度也不同,比如有的人会把“A”这个音拖得很长,或者把“i”发的很短。另外,不同时间序列可能仅仅存在时间轴上的位移,亦即在还原位移的情况下,两个时间序列是一致的。在这些复杂情况下,使用传统的欧几里得距离无法有效地求的两个时间序列之间的距离(或者相似性)。

DTW通过把时间序列进行延伸和缩短,来计算两个时间序列性之间的相似性:
在这里插入图片描述
如上图所示,上下两条实线代表两个时间序列,时间序列之间的虚线代表两个时间序列之间的相似的点。DTW使用所有这些相似点之间的距离的和,称之为归整路径距离(Warp Path Distance)来衡量两个时间序列之间的相似性。

2 DTW计算方法:

令要计算相似度的两个时间序列为X和Y,长度分别为|X|和|Y|。
归整路径(Warp Path)
归整路径的形式为W=w1,w2,…,wK,其中Max(|X|,|Y|)<=K<=|X|+|Y|。
wk的形式为(i,j),其中i表示的是X中的i坐标,j表示的是Y中的j坐标。
归整路径W必须从w1=(1,1)开始,到wK=(|X|,|Y|)结尾,以保证X和Y中的每个坐标都在W中出现。
另外,W中w(i,j)的i和j必须是单调增加的,以保证图1中的虚线不会相交,所谓单调增加是指:
在这里插入图片描述
在这里插入图片描述
上图为代价矩阵(Cost Matrix) D,D(i,j)表示长度为i和j的两个时间序列之间的归整路径距离。

二、源代码

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:segs
    ZCRCounter = 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;
        end
    end
    ZCR_Vector(t) = ZCRCounter;
end

%短时平均幅度
Erg_Vector = zeros(1,segs);
for u = 1:segs
    nextIndex = (u-1)*o_sam+1;
    Energy = x(nextIndex:nextIndex+w_sam-1).*win;
    Erg_Vector(u) = sum(abs(Energy));
end

IMN = 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;
    end
end
ITUs = indexi(1);        %第一个能量超过阈值上限的帧

%搜寻能量超过能量下限的部分
for j = ITUs:-1:1
    if (Erg_Vector(j) < ITL)
        counter2 = counter2 + 1;
        indexj(counter2) = j;
    end
end
start = 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;
    end
end
%初始化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);


%计算DTW
for i = 1:N
    fMatrix1 = fMatrixall1{
    
    i,1};
    fMatrix1 = CMN(fMatrix1);
    Scores1(i) = myDTW(fMatrix1,rMatrix);
end

for j = 1:N
    fMatrix2 = fMatrixall2{
    
    j,1};
    fMatrix2 = CMN(fMatrix2);
    Scores2(j) = myDTW(fMatrix2,rMatrix);
end

三、运行结果

在这里插入图片描述

四、备注

完整代码或者代写添加QQ 1564658423
往期回顾>>>>>>
【特征提取】基于matlab小波变换的音频水印嵌入提取【含Matlab源码 053期】
【语音处理】基于matlab GUI语音信号处理【含Matlab源码 290期】
【语音采集】基于matlab GUI语音信号采集【含Matlab源码 291期】
【语音调制】基于matlab GUI语音幅度调制【含Matlab源码 292期】
【语音合成】基于matlab GUI语音合成【含Matlab源码 293期】
【语音加密】基于matlab GUI语音信号加密解密【含Matlab源码 295期】
【语音增强】基于matlab小波变换的语音增强【含Matlab源码 296期】
【语音识别】基于matlab GUI语音基频识别【含Matlab源码 294期】
【语音增强】基于matlab GUI维纳滤波之语音增强【含Matlab源码 298期】
【语音处理】基于matlab GUI语音信号处理【含Matlab源码 299期】
【信号处理】基于matlab的语音信号频谱分析仪【含Matlab源码 325期】
【调制信号】基于matlab GUI数字调制信号仿真【含Matlab源码 336期】
【情感识别】基于matlab BP神经网络的语音情感识别【含Matlab源码 349期】
【语音隐写】基于matlab小波变换的量化音频数字水印【含Matlab源码 351期】
【特征提取】基于matlab音频水印嵌入与提取【含Matlab源码 350期】
【语音去噪】基于matlab低通和自适应滤波去噪【含Matlab源码 352期】
【情感识别】基于matlab GUI语音情感分类识别【含Matlab源码 354期】
【基础处理】基于matlab语音信号的预处理【含Matlab源码 364期】
【语音识别】基于matlab 傅立叶变换0-9的数字语音识别【含Matlab源码 384期】
【语音识别】基于matlab GUI DTW的0-9数字语音识别【含Matlab源码 385期】
【语音播放】基于matlab GUI MP3设计【含Matlab源码 425期】
【语音处理】基于人耳掩蔽效应的语音增强算法信噪比计算【含Matlab源码 428期】
【语音去噪】基于matlab谱减法去噪【含Matlab源码 429期】
【语音识别】基于matlab带动量项的BP神经网络语音识别【含Matlab源码 430期】
【语音隐写】基于matlab LSB语音隐藏【含Matlab源码 431期】
【语音识别】基于matlab男女声识别【含Matlab源码 452期】
【语音处理】基于matlab语音加噪和降噪处理【含Matlab源码 473期】
【语音去噪】基于matlab最小二乘法(LMS)自适应滤波器【含Matlab源码 481期】
【语音增强】基于matlab谱减法、最小均方和维纳滤波语音增强【含Matlab源码 482期】
【通信】基于matlab GUI数字频带(ASK、PSK、QAM)调制仿真 【含Matlab源码 483期】
【信号处理】基于matlab心电信号ECG滤波处理【含Matlab源码 484期】
【语音播报】基于matlab语音播报【含Matlab源码 507期】
【信号处理】基于matlab小波变换脑电信号特征提取【含Matlab源码 511期】
【语音处理】基于matlab GUI双音多频(DTMF)信号检测【含Matlab源码 512期】
【语音隐写】基于matlab LSB实现语音信号的数字水印【含Matlab源码 513期】
【语音增强】基于matlab匹配滤波器的语音识别【含Matlab源码 514期】
【语音处理】基于matlab GUI语音时域频域频谱图分析【含Matlab源码 527期】
【语音去噪】基于matlab LMS、RLS算法语音去噪【含Matlab源码 528期】
【语音去噪】基于matlab LMS谱减法语音去噪【含Matlab源码 529期】
【语音去噪】基于matlab 软阈值、硬阈值、折中阈值语音去噪【含Matlab源码 530期】
【语音识别】基于matlab特定人的语音识别分辨【含Matlab源码 534期】
【语音去噪】基于matlab小波软阈值语音降噪【含Matlab源码 531期】
【语音去噪】基于matlab小波硬阈值语音降噪【含Matlab源码 532期】
【语音识别】基于matlab MFCC和SVM的特定人性别识别【含Matlab源码 533期】
【语音识别】基于MFCC的GMM语音识别【含Matlab源码 535期】
【语音识别】基于matlab VQ特定人孤立词语音识别【含Matlab源码 536期】
【语音识别】基于matlab GUI声纹识别【含Matlab源码 537期】
【采集读写】基于matlab语音采集与读写【含Matlab源码 538期】
【语音编辑】基于matlab语音编辑【含Matlab源码 539期】
【语音模型】基于matlab语音信号数学模型【含Matlab源码 540期】
【语音响度】基于matlab语音声强与响度【含Matlab源码 541期】
【情感识别】基于matlab K近邻分类算法的语音情感识别【含Matlab源码 542期】
【情感识别】基于matlab支持向量机(SVM)的语音情感识别【含Matlab源码 543期】
【情感识别】基于神经网络的语音情感识别【含Matlab源码 544期】
【声源定位】基于matlab不同空间谱估计的声源定位算法比较【含Matlab源码 545期】
【声源定位】基于matlab不同信噪比下的麦克风接收信号【含Matlab源码 546期】
【声源定位】基于matlab单声源双麦克风的房间冲激响应【含Matlab源码 547期】
【声源定位】基于matlab广义互相关的声源定位【含Matlab源码 548期】
【声源定位】基于matlab阵列流形矩阵的信号显示【含Matlab源码 549期】
【特征提取】基于matlab共振峰估计【含Matlab源码 550期】
【特征提取】基于matlab基音周期估计【含Matlab源码 551期】
【特征提取】基于matlab语音端点检测【含Matlab源码 552期】
【语音编码】基于matlab ADPCM编解码【含Matlab源码 553期】
【语音编码】基于matlab LPC编解码【含Matlab源码 554期】
【语音编码】基于matlab PCM编解码【含Matlab源码 555期】
【语音分析】基于matlab倒谱分析与MFCC系数计算【含Matlab源码 556期】
【语音分析】基于matlab线性预测系数对比 【含Matlab源码 557期】
【语音分析】基于matlab语音短时频域分析【含Matlab源码 558期】
【语音分析】基于matlab语音短时时域分析【含Matlab源码 559期】
【语音分析】基于matlab语音线谱对转换【含Matlab源码 560期】
【语音合成】基于matlab比例重叠相加法的信号分帧与还原【含Matlab源码 561期】
【语音合成】基于matlab线性预测共振峰检测和基音参数的语音合成【含Matlab源码 562期】
【语音合成】基于matlab线性预测系数和基音参数的语音合成【含Matlab源码 563期】
【语音合成】基于matlab线性预测系数和预测误差的语音合成【含Matlab源码 564期】
【语音合成】基于matlab语音信号变速【含Matlab源码 565期】
【语音合成】基于matlab语音信号的变调【含Matlab源码 566期】
【语音合成】基于matlab重叠存储法的信号分帧与还原【含Matlab源码 567期】
【语音合成】基于matlab重叠相加法的信号分帧与还原【含Matlab源码 568期】
【语音去噪】基于matlab 改进谱减法语音去噪【含Matlab源码 569期】
【语音去噪】基于matlab基本维纳滤波算法语音去噪【含Matlab源码 570期】
【语音去噪】基于matlab谱减法语音去噪【含Matlab源码 571期】
【语音去噪】基于matlab先验信噪比的维纳滤波算法语音去噪【含Matlab源码 572期】

猜你喜欢

转载自blog.csdn.net/TIQCmatlab/article/details/115003346