动态时间规整-DTW算法

作者:桂。

时间:2017-05-31  16:17:29

链接:http://www.cnblogs.com/xingshansi/p/6924911.html 


前言

动态时间规整(Dynamic Time Warping,DTW)是孤立词识别的早期技术,梳理一下,主要包括:

  1)孤立词识别操作步骤;

  2)DTW原理;

内容基本就是两个博文的整合,最后一并给出链接。

一、孤立词识别操作步骤

基本原理:

基本操作是预加重、分帧,端点检测技术又叫有话帧检测(Voice activity detection, VAD)技术。特征提取参考之前的博文。例如:

检测语音→特征提取

多说一句,倒谱就是将乘性关系变为加性关系:xy→logx+logy,一般的谱分析我们都是采用频谱,或者小波这样与频谱的区别只是不同量度,这些都是解决加性噪声的滤波问题,倒谱是一种为了滤除乘性噪声的谱方法,简单的说就是对功率谱求log,再反傅里叶变换,公式如 。

特征提取之后就是特征的模板匹配,也就是DTW算法。

 

二、DTW算法思路

  A-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(in),R(im))表示T中第in帧特征与R中im帧特征之间的欧几里得距离。直接匹配是假设测试模板和参考模板长度相等,即in=im;线性时间规整技术假设说话速度是按不同说话单元的发音长度等比例分布的,即。这两种假设其实都不符合实际语音的发音情况,我们需要一种更加符合实际情况的非线性时间规整技术,也就是DTW算法。三种匹配模式的对比:

   B-DTW思路

  首先还是介绍下DTW的思想:假设现在有一个标准的参考模板R,是一个M维的向量,即R={R(1),R(2),……,R(m),……,R(M)},每个分量可以是一个数或者是一个更小的向量。现在有一个才测试的模板T,是一个N维向量,即T={T(1),T(2),……,T(n),……,T(N)}同样每个分量可以是一个数或者是一个更小的向量,注意M不一定等于N,但是每个分量的维数应该相同。

     由于M不一定等于N,现在要计算R和T的相似度,就不能用以前的欧式距离等类似的度量方法了。那用什么方法呢?DTW就是为了解决这个问题而产生的。

首先我们应该知道R中的一个分量R(m)和T中的一个分量T(n)的维数是相同的,它们之间可以计算相似度(即距离)。在运用DTW前,我们要首先计算R的每一个分量和T中的每一个分量之间的距离,形成一个M*N的矩阵。(为了方便,行数用将标准模板的维数M,列数为待测模板的维数N)。

然后下面的步骤该怎么计算呢?用个例子来看看。

这个例子中假设标准模板R为字母ABCDEF(6个),测试模板T为1234(4个)。R和T中各元素之间的距离已经给出。如下:

     既然是模板匹配,所以各分量的先后匹配顺序已经确定了,虽然不是一一对应的。现在题目的目的是要计算出测试模板T和标准模板R之间的距离。因为2个模板的长度不同,所以其对应匹配的关系有很多种,我们需要找出其中距离最短的那条匹配路径。现假设题目满足如下的约束:当从一个方格((i-1,j-1)或者(i-1,j)或者(i,j-1))中到下一个方格(i,j),如果是横着或者竖着的话其距离为d(i,j),如果是斜着对角线过来的则是2d(i,j).其约束条件如下图像所示:

     其中g(i,j)表示2个模板都从起始分量逐次匹配,已经到了M中的i分量和T中的j分量,并且匹配到此步是2个模板之间的距离。并且都是在前一次匹配的结果上加d(i,j)或者2d(i,j),然后取最小值。

     所以我们将所有的匹配步骤标注后如下:

     怎么得来的呢?比如说g(1,1)=4, 当然前提都假设是g(0,0)=0,就是说g(1,1)=g(0,0)+2d(1,1)=0+2*2=4.

     g(2,2)=9是一样的道理。首先如果从g(1,2)来算的话是g(2,2)=g(1,2)+d(2,2)=5+4=9,因为是竖着上去的。

     如果从g(2,1)来算的话是g(2,2)=g(2,1)+d(2,2)=7+4=11,因为是横着往右走的。

     如果从g(1,1)来算的话,g(2,2)=g(1,1)+2*d(2,2)=4+2*4=12.因为是斜着过去的。

     综上所述,取最小值为9. 所有g(2,2)=9.

     当然在这之前要计算出g(1,1),g(2,1),g(1,2).因此计算g(I,j)也是有一定顺序的。

其基本顺序可以体现在如下:

     计算了第一排,其中每一个红色的箭头表示最小值来源的那个方向。当计算了第二排后的结果如下:

     最后都算完了的结果如下:

     到此为止,我们已经得到了答案,即2个模板直接的距离为26. 我们还可以通过回溯找到最短距离的路径,通过箭头方向反推回去。如下所示:

     到这里,估计大家动手算一下就会明白了,其实这个就是动态规划的思路:

主要code:

from numpy import array, zeros, argmin, inf, equal, ndim
from scipy.spatial.distance import cdistdef dtw(x, y, dist):"""Computes Dynamic Time Warping (DTW) of two sequences.:param array x: N1*M array:param array y: N2*M array:param func dist: distance used as cost measureReturns the minimum distance, the cost matrix, the accumulated cost matrix, and the wrap path."""assert len(x)assert len(y)r, c = len(x), len(y)D0 = zeros((r + 1, c + 1))D0[0, 1:] = infD0[1:, 0] = infD1 = D0[1:, 1:] # viewfor i in range(r):for j in range(c):D1[i, j] = dist(x[i], y[j])C = D1.copy()for i in range(r):for j in range(c):D1[i, j] += min(D0[i, j], D0[i, j+1], D0[i+1, j])if len(x)==1:path = zeros(len(y)), range(len(y))elif len(y) == 1:path = range(len(x)), zeros(len(x))else:path = _traceback(D0)return D1[-1, -1] / sum(D1.shape), C, D1, pathdef _traceback(D):i, j = array(D.shape) - 2p, q = [i], [j]while ((i > 0) or (j > 0)):tb = argmin((D[i, j], D[i, j+1], D[i+1, j]))if (tb == 0):i -= 1j -= 1elif (tb == 1):i -= 1else: # (tb == 2):j -= 1p.insert(0, i)q.insert(0, j)return array(p), array(q)

放在音频里就是:模板/测试样本的STFT取幅度后,每一帧存在一个sum(dist)的距离dij,i为模板的第i帧,j表示测试样本的第j帧,这样就得出了路径,从而计算最短路径,完成识别:

三、其他

其实DTW是模板匹配的一般思路,这是理论层面。孤立词识别是它的一个应用,对于尺寸不同的匹配问题,DTW都应该有一定效果,比如数字识别.首先建立模板:

然后是测试样本:

测试样本有大有小,直接模板匹配是不合适的。实际应用中数字可能形状存在差异、且有倾斜,需要把字符切割出来,而不考虑白框。这里只是梳理思路,仅考虑最理想的情况。

例如利用DTW:将图片二值化im2bw→拉成向量img(:)→将测试数据利用DTW,分别与模板匹配,找出最短距离的最小值,即是对应的数字。

 

参考

  • http://www.cnblogs.com/ChengQH/p/2dc8272d6b045b9cee3a02d221662251.html
  • http://www.cnblogs.com/tornadomeet/archive/2012/03/23/2413363.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

到底逾期几次才会影响贷款申请?

大家都知道,申请贷款时,贷款机构会重点考察借款人的征信记录,那么,评估标准是什么呢?到底逾期几次才会影响到贷款的申请?在信贷行业,对逾期标准的评判一般是按“连三累六”的原则,简…

状态机与时钟分频

状态机与时钟分频 题目描述 使用状态机实现时钟分频,要求对时钟进行四分频,占空比为0.25 信号示意图 题目解读 首先考虑输入输出,作为分频电路,有一个时钟输入端,clk,输出端div3,再加一个复位端(这里不加也可)所以输入 clk,rst输出 clk_out再考虑状态转换的问题。4分…

candence 16.6 win8.1 x64 破解

测试机系统截图: 破解说明具体的步骤: 1、安装licensemanager,问license时,单击cancel,然后finish. 2、接下来安装cadence的product,即第二项,直到结束. 2.1 安装cadence16.6最新补丁Hotfix_SPB16.60.003_wint_1of1.ex…

常用有话帧检测技术(VAD)

作者:桂。 时间:2017-05-31 17:43:22 链接:http://www.cnblogs.com/xingshansi/p/6925355.html 前言 总结一下基本的有话帧检测(Voice activity detection, VAD)技术,基于神经网络的待后面梳理完神经网络…

矢量量化(VQ)

作者:桂。 时间:2017-05-31 21:14:56 链接:http://www.cnblogs.com/xingshansi/p/6925955.html 前言 VQ(Vector Quantization)是一个常用的压缩技术,本文主要回顾: 1)VQ原理 2&am…

超前进位加法器

超前进位加法器 题目描述 求两个四位的数据编写一个四位的超前进位加法器,建议使用子模块 提示:超前进位加法器的位公式如下 这里‘+’ ‘’符号不是‘加’和‘乘’,是‘或’和 ‘与’ 题目解析 题目要求 4级可以表示为如下,这里P和G是传播信号和生成信号: `timesc…

Python3.x和Python2.x的区别

这个星期开始学习Python了,因为看的书都是基于Python2.x,而且我安装的是Python3.1,所以书上写的地方好多都不适用于Python3.1,特意在Google上search了一下3.x和2.x的区别。特此在自己的空间中记录一下,以备以后查找方便…

哪些职业申请贷款比较难?

贷款一般会重点考核借款人的收入,信用,资产, 工作等基本信息,有时候明明借款人有着较高的收入,信用也良好,可是最后还是被拒绝了。这其中有很大一部分是跟借款人的职业有一定的关系。那到底哪些职业的人贷款…

乘法与位运算

乘法与位运算 题目描述 进行一个运算单元的电路设计,A[7:0]*11111011,尽量用最少的资源实现,写出对应的 RTL 代码。 题目解析 首先,考虑11111011是什么,其值为251,在乘法运算中可以将其分解为256 -4 -1&…

VC中的cl.exe

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin>cl.exe用于 x86 的 Microsoft (R) C/C 优化编译器 18.00.21005.1 版版权所有(C) MicrosoftCorporation。 保留所有权利。用法: cl [ 选项... ] 文件名... [ /link 链接选项... ]C:\Program Files (x86)\Micros…

常用音频软件:Wavesufer

作者:桂。 时间:2017-06-02 10:23:39 链接:http://www.cnblogs.com/xingshansi/p/6932408.html 前言 只列举两个自己用过的(wavesufer和praat),如果有其他更好的软件,还希望各位留下链接。 本…

等额本息和等额本金,哪个还款方式更划算?

贷款还款方式有很多种,其中等额本息和等额本金最常见的两种还款方式。但是有很多朋友对这两种还款方式没有概念,甚至分不清这两者到底有什么区别,所以今天我们就跟大家来详细解说下,什么是等额本金,什么是等额本息&…

全 加 器

全加器 题目描述 请用题目提供的半加器实现全加器电路 timescale 1ns/1nsmodule add_half(input A ,input B ,output wire S ,output wire C );assign S A ^ B; assign C A & B; endmodule/*****************…

找出那个数字出现3次的数字

找出那个数字出现3次的数字&#xff0c;简单的C #include <stdio.h> #define COUNT 3 #define ARRAY_SIZE(_) (sizeof (_) / sizeof (*_))int _tmain(int argc, _TCHAR* argv[]) {// 找出那个数字出现3次的数字// x[1 2 3 1 2 5 1 2]int x[] {1, 2, 3, 1, 2, 5, 1, 2}…

HTTP API领域在围绕OAS进行整合

MuleSoft业已成为OAI的成员&#xff0c;并发布了能够同时理解RAML和 OAS的API模型框架。Restlet Studio如今已经支持RAML。\u0026#xD;\n\u0026#xD;\n目前&#xff0c;有三个主要的HTTP API规范在竞争&#xff1a;Open API Initiative&#xff08;OAI&#xff09;基于Swagger所提…

申请表怎么填才能提高信用卡额度?

对于大多数朋友来说&#xff0c;申请信用卡都希望下卡的额度能高一些&#xff0c;但是对于很多人来说&#xff0c;最终下卡的额度一般在5000-2万之间比较多。其实信用卡的额度和申请人的综合评分有很大的关系&#xff0c;综合评分越高额度可能会越大&#xff0c;而综合评分与申…

串行进位加法器

串行进位加法器 题目描述 ② 请用全加器电路①实现串行进位的4位全加器电路 题目解读 可将4个全加器串行相连,实现四位数串行进位加法器。原理图如下: `timescale 1ns/1nsmodule add_half(input A ,input B ,output wire S ,…

ARM Neon Intrinsics各函数介绍

ARM NEON Optimization. An Example [cpp]view plaincopy#ifndef __ARM_NEON__ #error You must enable NEON instructions (e.g. -mfloat-abisoftfp -mfpuneon) to use arm_neon.h #endif /*(1)、正常指令&#xff1a;生成大小相同且类型通常与操作数向量相同的结果向…

个人贷款5级分类,来看看你是哪一级

第一类&#xff08;特优客户&#xff09;年龄&#xff1a;30周岁——50周岁之间。婚姻&#xff1a;已婚且家庭关系稳定。职业&#xff1a;副处级以公务员、事业单位正式编制人员&#xff0c;副团级以上军干部&#xff0c;学校领导人员&#xff0c;二甲以上医院副主治级以上正式…

异步复位同步释放

异步复位同步释放 题目描述 请使用异步复位同步释放来将输入数据a存储到寄存器中,并画图说明异步复位同步释放的机制原理 信号示意图 题目解读 复位可以在任何时候发生,表面上看跟时钟没有关系,但真实情况是异步复位也需考虑时钟跳变沿,因为时钟沿变化和异步复位都可以引…