DTW算法(语音识别)
DTW主要是应用在孤立词识别的算法,用来识别一些特定的指令比较好用,这个算法是基于DP(动态规划)的算法基础上发展而来的。这里介绍语音识别就先介绍下语音识别的框架,首先我们要有一个比对的模版声音,然后需要去截取其里面包含真正属于语音的部分,这个要采用一个叫做vad(voice activedetection)语音活动检测的算法,而在vad中间我们最常使用双门限端点检测这种方法,如图所示,我们采用vad判断语音的开始和结束,判断方法就是通过音量的大小做一个阈值判定,在时域上很简单就能判定。
图.speech(语音信号),Energy(短时能量),zcr(短时过零率值)
然后需要寻找一个特征矢量,在语音识别中很多采用MFCC,也就是梅尔倒谱这个参数作为特征矢量。一般的谱分析我们都是采用频谱,或者小波这样与频谱的区别只是不同量度,这些都是解决加性噪声的滤波问题,而还存在倒谱,阶次谱这样是为了特定的需求所构建的另外的谱方法,这些是在NI的探讨会上次说的。倒谱是一种为了滤除乘性噪声的谱方法,简单的说就是对功率谱求log,再反傅里叶变换,公式如
,这种方法用来做信号分离很有用,下面综合下matlab分析下DTW语音识别。
fname = sprintf( ‘%da.wav’ ,i);
x=fname;
[x,fs]=wavread(x);
[x1 x2] =vad(x);
m = mfcc(x);
m = m(x1-2:x2-2,:);
ref(i).mfcc = m;
首先这里是读取一段语音,通过wavread,然后通过vad函数获取语音的开始于结束部分,这里很多函数都是调用语音应用库voicebox的,获取x1,x2就是语音的两端时候,先对语音信号整体计算mfcc梅尔倒谱,然后截取其中语音部分的作为其函数值。
fname= sprintf( ‘%db.wav’ ,i);
x=fname;
[x,fs]=wavread(x);
[x1 x2] =vad(x);
m = mfcc(x);
m =m(x1-2:x2-2,:);
test(i).mfcc =m;
然后以同样的方法计算需要识别的语音文件其语音段的梅尔倒谱系数,然后对模版与识别文件进行“比对”,这里的比对方法就是DTW算法,我们经常把整个语音识别算法叫做DTW语音识别,但实际上,DTW主要是应用在比对两个梅尔倒谱的比对上,而且这也是一种基于距离的比对,也可以认为是一种基于有导师学习的聚类方法。不过在讲比对之前我们需要讲下匹配,之前图像匹配我们是采用谱分析的方法,而这里属于一维信号的匹配,故解释下相关模板匹配方法。语音识别的匹配需要解决的一个关键问题是说话人对同一个词的两次发音不可能完全相同,这些差异不仅包括音强的大小、频谱的偏移,更重要的是发音时音节的长短不可能完全相同,而且两次发音的音节往往不存在线性对应关系。设参考模板有M帧矢量{R(1),R(2),…R(m),…,R(M)},R(m)为第m帧的语音特征矢量,测试模板有N帧矢量{T(1),T(2),…T(n),…,T(N)},T(n)是第n帧的语音特征矢量。d(T(i n ),R(i m ))表示T中第i n 帧特征与R中i m 帧特征之间的欧几里得距离。直接匹配是假设测试模板和参考模板长度相等,即i n =i m ;线性时间规整技术假设说话速度是按不同说话单元的发音长度等比例分布的,即
。这两种假设其实都不符合实际语音的发音情况,我们需要一种更加符合实际情况的非线性时间规整技术,也就是DTW算法。
图.三种匹配模式的对比
DTW算法的原理图如图,把测试模板的各个帧号n=1~N在一个二维直角坐标系中的横轴上标出,把参考模板的各帧m=1~M在纵轴上标出,通过这些表示帧号的整数坐标画出一些纵横线即可形成一个网格,网格中的每一个交叉点(t i ,r j )表示测试模式中某一帧与训练模式中某一帧的交汇。DTW算法分两步进行,一是计算两个模式各帧之间的距离,即求出帧匹配距离矩阵,二是在帧匹配距离矩阵中找出一条最佳路径。搜索这条路径的过程可以描述如下:搜索从(1,1)点出发,对于局部路径约束如图,点(i n ,i m )可达到的前一个格点只可能是(i n -1,i m )、(i n -1,i m -l)和(i n -1,i m -2)。那么(i n ,i m )一定选择这三个距离中的最小者所对应的点作为其前续格点,这时此路径的累积距离为:
D(i n ,i m )=d(T(i n ),R(i m ))+min{D(i n -1,i m ),D(i n -1,i m -1),D(i n -1,i m -2)},这样从(l,1)点出发(令D(1,1)=0)搜索,反复递推,直到(N,M)就可以得到最优路径,而且D(N,M)就是最佳匹配路径所对应的匹配距离。在进行语音识别时,将测试模板与所有参考模板进行匹配,得到的最小匹配距离 D min (N,M)所对应语音即为识别结果。
图.DTW算法原理
图.局部约束路径
以下就是matlab对于DTW算法的具体实现:
function dist = dtw(t,r)
n = size(t,1);
m = size(r,1);
% 帧匹配距离矩阵
d = zeros(n,m);
for i = 1:n
for j = 1:m
d(i,j) = sum((t(i,:)-r(j,:)).^2);
end
end
% 累积距离矩阵
D = ones(n,m) * realmax;
D(1,1) = d(1,1);
% 动态规划
for i = 2:n
for j = 1:m
D1 = D(i-1,j);
if j>1
D2 = D(i-1,j-1);
else
D2 = realmax;
end
if j>2
D3 = D(i-1,j-2);
else
D3 = realmax;
end
D(i,j) = d(i,j) + min([D1,D2,D3]);
end
end
dist = D(n,m);
图.DTW语音识别算法测试结果
最终测试结果如图,我们可以完成特定孤立词的识别,其实这种局部优化的想法还有很多地方被使用到,如N皇后的解法上,我们可以采用的比较快速的方法中就有局部搜索法。在语音识别我们除了梅尔倒谱还可以采用LPC(Linear Prediction Coefficient,线性预测系数)推导出的LPCC(LinearPrediction Cepstrum Coefficient,线性预测倒谱系数),但是据说其对辅音结果差,对元音结果好,以上介绍的DTW算法实际上也是在英语的识别率上比较高,实际上英语的识别应该要比汉语简单,在话语识别技术上,我们还需要考虑语音合成技术等一系列如何组成一段语音的方法,才能够方便实现。
本文转载自:CSDN博客
欢迎加入我爱机器学习QQ14群:336582044
微信扫一扫,关注我爱机器学习公众号
DTW算法(语音识别)相关推荐
- 基于动态时间规整算法(DTW)的语音识别技术研究-含Matlab代码
⭕⭕ 目 录 ⭕⭕ ⏩ 一.引言 ⏩ 二.动态时间规整算法基本原理 ⏩ 三.语音识别实例分析 ⏩ 四.参考文献 ⏩ 五.Matlab代码获取 ⏩ 一.引言 在语音识别技术的发展过程中,动态时间规整算法 ...
- DTW 算法的实时语音识别——命令词识别(Python 实现)
介绍 这是我们计算机视听觉的第三个实验,也是本学期语音部分的最后一个实验,大概花了两天才写完.上个实验做的是语音编码问题,这个实验是语音识别的事,感觉处理语音还是比较有意思的. 附上实验代码地址:实验 ...
- 【语音识别】基于DTW算法实现0~9数字和汉字语音识别含Matlab源码
1 简介 在孤立词语音识别中,动态时间规整DTW算法是一种应用较为广泛的算法之一,有着较强的科学性,在立足于当前DTW语音识别算法应用的实际情况下,简略阐述了该课题的研究背景,并从预处理和特征参数提取 ...
- 基于DTW算法的语音识别原理与实现
[摘 要]以一个能识别数字0-9的语音识别系统的实现过程为例,阐述了基于DTW算法的特定人孤立词语音识别的基本原理和关键技术.其中包括对语音端点检测方法.特征参数计算方法和DTW算法实现的详细讨论,最 ...
- dtw算法 matlab,基于DTW的语音识别在MATLAB中的实现方法浅析
摘要:本文阐述了基于DTW的非特定人语音识别的基本原理与实现方法.该语音识别系统预先建立标准语音模板库与三名待测者的语音模板的方法,然后结合MATLAB中自带voicebox语音工具箱及相应语音处理函 ...
- 时序分析:DTW算法(基于模板)
对时序对象进行分析,使用KMP算法可以分析速率不变的模式,参考时序分析:欧式空间轨迹模式识别.使用基于模板匹配的方法,对于速率发生变化的模式,需要用新的对速率要求松散的方法,DTW方法为一种广泛使用的 ...
- 动态时间规整-DTW算法
作者:桂. 时间:2017-05-31 16:17:29 链接:http://www.cnblogs.com/xingshansi/p/6924911.html 前言 动态时间规整(Dynamic ...
- 从一个实例中学习DTW算法
基于动态时间规整算法(DTW)的相似度计算 Killer 发表于(2015-10-063) 本文标签:大数据 机器学习 算法 浏览量:193次 喜欢收藏 在孤立词语音识别中,最为简单有效的方法是 ...
- 帮我写一篇关于DTW算法的综述
动态时间规整(Dynamic Time Warping,DTW)算法是一种有效的时间序列对齐算法,它可以将两个不同长度的时间序列进行对齐和比较.它的原理是在两个时间序列之间找到一个最短路径,以使它们的 ...
最新文章
- 《包容的智慧》读后感-包容有多少,拥有就有多少
- ORACLE TEXT LEXER PREFERENCE(一)
- node --- 实现session认证.
- windows系统下的云服务器部署tomcat
- java 比特币私钥生成_如何生成自己的比特币私钥
- mysql 主键外键sql_SQL外键VS主键说明了MySQL语法示例
- iphone-common-codes-ccteam源代码 CCUINavigationBar.h
- png免扣半透素材,让你轻松设计出漂亮的海报!
- 创建一对多表结构实例 /操作的三种方式
- 差速驱动机器人轮间距校准实验
- caffe利用shell创建train.txt和val.txt做数据输入
- BGP线路机柜值得你考虑的几点因素-新乡BGP机柜
- 全局快门和卷帘快门的区别
- 什么是自然语言理解?自然语言理解的准则是什么?
- 神技 破解EXCEL工作表保护密码
- adb shell get/setprop, setenforce...
- Java 替换中文括号小括号,或者英文括号
- 开源为改进服务器、网络、存储及加速技术提供了行之有效的新途径
- 面试经验|2月最新映客直播一面+二面
- SPSS(十二)SPSS对应分析(图文+数据集)