语音识别基础算法——动态时间规整算法

前言

动态时间规整算法,Dynamic Time Wraping,缩写为DTW,是语音识别领域的一个基础算法。

算法的提出

DTW 的提出是为了解决或尽量解决在语音识别当中的孤立词识别不正确的问题。该问题简单描述为:在识别阶段,将输入语音的特征矢量时间序列依次与模板库中的每个模板进行相似度比较,最后将相似度最高者作为识别结果输出。但是,由于语音信号具有相当大的随机性,即使是同一个人在不同时刻所讲的同一句话、发的同一个音,也不可能具有完全相同的时间长度。而在进行模板匹配时,这些时间长度的变化会影响测度的估计,从而降低识别率。对此,日本学者 板仓(Itakura)将动态规划(DP)算法的概念用于解决孤立词识别时的说话速度不均匀的难题,提出了著名的动态时间规整算法或称动态时间伸缩算法(DTW)。

算法的内容

DTW 的目标是从不同时间跨度的两个数据求出它们之间的最小总累计距离,所以首先我们要找出输入矢量和参考矢量之间的对应关系,从而根据对应的矢量来求出模板之间的最小累计距离。在求累计距离的每一步中,需要满足以下条件的规整函数:

  • 边界条件

    w(1) = 1,w(N) = M (3-1)

    即规整函数起点为(1,1),终点为(N,M),

  • 连续条件

    w(n + 1) = w(n) + 0/1/2,如果 w(n) <> w(n - 1) 成立 (3-2)

w(n + 1) = w(n) + 1/2,如果 w(n) == w(n - 1) 成立 (3-3)

Tip:

  • 式(3-2)意思是 w() 的当前值和前一个 w() 值不相等,说明已经加过 1 或 2 ,则 w(n + 1) 的加上的值可为 0;式(3-3)则刚刚相反,w(n + 1) 的加上的值不能为 0,因为 w(n) 已经使用过 0;本质上,规整函数限制了最小累加距离的路径走向。0/1/2代表了路径走的步数,要么是当前矢量本身,要么是当前矢量的前一列的步数为 1和 2 的矢量(或点)。
  • n 的值与 N 相对应

使用规整函数的最小累计距离递推公式:

DTW(n,m) = d((n,m)) + min { DTW(n - 1, m) * g(n - 1, m),DTW(n - 1, m - 1), DTW(n - 1, m - 2)} (3-4)
其中:

g(n - 1,m) = 1,如果 w(n - 1) <> w(n - 2) (3-5)

g(n - 1,m) = ∞,如果w(n - 1) == w(n - 2) (3-6)

Tip:这里的只能取前一列的矢量(点)的数据
根据式(3-2)和式(3-3),文字解释为:当 DTW(n - 1, m) 不是来自 DTW(n - 2, m) 时,则去判断 DTW(n - 1, m) [本身,步数为 0 ],DTW(n - 1, m - 1) [步数为 1 ],DTW(n - 1, m - 2) [步数为 2 ]

优点和注意点

时间复杂度

DTW算法的优势在于:它解决了数据长度不同的两数据序列的差异度表示方式。从计算的角度来说,式(3-4)可看出,横轴每向前增加一步,仅参考前一列的累计距离,所以在计算时只保留前一列的累计距离即可,不必保留所有数据。这样可以降低算法的时间复杂度;其原理在于,一个参考数据只与其距离相近的数据会比较相似,距离过远的数据关系不大,所以就没必要计算参考数据与对比数据的所有距离,而DTW算法本身就是在矩阵中运算的,其一般的计算点关系如图:

距离指标选择

相邻矢量间距离指标的好坏绝对影响DTW算法的效果。在孤立词识别当中,先用矢量量化技术,然后再对各分量使用欧拉
距离来度量和计算;由于DTW算法可应用不同的领域,所以不同的领域距离指标是不一样的,甚至一般的统计距离:欧拉距离、Minkowski距离、Mahalanobis距离以及兰氏距离等用在所碰到的问题上,达不到想要的效果。所以,此时就需要根据实际数据的特征来构造距离(这里的距离已经不是一般意义上的长度等)指标,去衡量两个数据的相似程度

数据点约束

虽说根据规整函数可以使计算复杂度降低,但是从递推公式可知,要想知道终点的累计最短距离,还是要不断计算前面的累计距离,那么如何才能更进一步的降低计算时间复杂度呢?答案就是对计算数据的范围进行约束,下图是平行四边形约束

也就是说,计算的数据点坐标必须落在平行四边形内部,否则就不用计算,至于平行四边形的形状可以根据实际数据来调试,一般不会相差很大,主要取决于平行四边形邻边的角度,即斜率

计算例子

最后,给出一个简单的例子,讲下DTW的计算过程。
时间序列为:
d1 = {1,3,3,5,2},d2 = {0,2,3,6,4,1}
第一列:
DTW(1,1) = 1 + 0 = 1;
DTW(1,2) = 1 + min {DTW(0,2), DTW(0,1), DTW(0,0)} = 1 + 0 = 1;
DTW(1,3) = 2 + min {DTW(0,3), DTW(0,2), DTW(0,1)} = 2 + 0 = 2;
DTW(1,4) = 5 + min {DTW(0,4), DTW(0,3), DTW(0,2)} = 5 + 0 = 5;
DTW(1,5) = 3 + min {DTW(0,5), DTW(0,4), DTW(0,3)} = 3 + 0 = 3;
DTW(1,6) = 0 + min {DTW(0,6), DTW(0,5), DTW(0,4)} = 0 + 0 = 0;
第二列:
DTW(2,1) = 3 + min {DTW(1,1), DTW(1,0), DTW(1,-1)} = 3 + 1 = 4;
DTW(2,2) = 1 + min {DTW(1,2), DTW(1,1), DTW(1,0)} = 1 + 1 = 2;
DTW(2,3) = 0 + min {DTW(1,3), DTW(1,2), DTW(1,1)} = 0 + 1 = 1;
DTW(2,4) = 3 + min {DTW(1,4), DTW(1,3), DTW(1,2)} = 3 + 1 = 4;
DTW(2,5) = 1 + min {DTW(1,5), DTW(1,4), DTW(1,3)} = 1 + 2 = 3;
DTW(2,6) = 2 + min {DTW(1,6), DTW(1,5), DTW(1,4)} = 2 + 0 = 2;(这列符合w(n-1) == w(n-2))
第三列:
DTW(3,1) = 3 + min {DTW(2,1), DTW(2,0), DTW(2,-1)} = 3 + 4 = 7;
DTW(3,2) = 1 + min {DTW(2,2), DTW(2,1), DTW(2,0)} = 1 + 2 = 3;
DTW(3,3) = 0 + min {DTW(2,3), DTW(2,2), DTW(2,1)} = 0 + 1 = 1;(这列符合w(n-1) == w(n-2))
DTW(3,4) = 3 + min {DTW(2,4), DTW(2,3), DTW(2,2)} = 3 + 1 = 4;
DTW(3,5) = 1 + min {DTW(2,5), DTW(2,4), DTW(2,3)} = 1 + 1 = 2;
DTW(3,6) = 2 + min {DTW(2,6)_∞, DTW(2,5), DTW(2,4)} = 2 + 3 = 5;
第四列:
DTW(4,1) = 5 + min {DTW(3,1), DTW(3,0), DTW(3,-1)} = 5 + 7 = 12;(这列符合w(n-1) == w(n-2))
DTW(4,2) = 3 + min {DTW(3,2), DTW(3,1), DTW(3,0)} = 3 + 3 = 6;(这列符合w(n-1) == w(n-2))
DTW(4,3) = 2 + min {DTW(3,3)_∞, DTW(3,2), DTW(3,1)} = 2 + 3 = 5;
DTW(4,4) = 1 + min {DTW(3,4), DTW(3,3), DTW(3,2)} = 1 + 1 = 2;
DTW(4,5) = 1 + min {DTW(3,5), DTW(3,4), DTW(3,3)} = 1 + 1 = 2;
DTW(4,6) = 4 + min {DTW(3,6), DTW(3,5), DTW(3,4)} = 4 + 2 = 6;
第五列:
DTW(5,1) = 2 + min {DTW(4,1), DTW(4,0), DTW(4,-1)} = 2 + ∞ = ∞ ;
DTW(5,2) = 0 + min {DTW(4,2), DTW(4,1), DTW(4,0)} = 0 + 12 = 12;
DTW(5,3) = 1 + min {DTW(4,3), DTW(4,2), DTW(4,1)} = 1 + 5 = 6;
DTW(5,4) = 4 + min {DTW(4,4), DTW(4,3), DTW(4,2)} = 4 + 2 = 6;(这列符合w(n-1) == w(n-2))
DTW(5,5) = 2 + min {DTW(4,5), DTW(4,4), DTW(4,3)} = 2 + 2 = 4;(这列符合w(n-1) == w(n-2))
DTW(5,6) = 1 + min {DTW(4,6), DTW(4,5), DTW(4,4)} = 1 + 2 = 3;
最终以表格形式给出计算结果:

DTW(5,6) 就是最终的累计最短距离,也就是两个数据的差异度表示

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Word论文交叉引用一键上标

Word论文交叉引用一键上标 1.进入Microsoft word使用CtrlH快捷键或单击替换按钮 2.在查找内容中输入[^#] 3.鼠标点击&#xff0c;标签为“替换为&#xff1a;”的文本框&#xff0c;注意光标一定要打在图红色方框圈中的文本框中&#xff01; 4.点击格式选择字体 5.勾选上标…

BLIP论文笔记

论文地址 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 论文思想 其实Clip就相当于只用了ITC

适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成

适用于项目经理的跨团队协作实践&#xff1a;Atlassian Jira与Confluence集成 现代项目经理的核心职责是提供可视性、保持团队一致&#xff0c;并确保团队拥有交付出色工作所需的资源。在过去几年中&#xff0c;由于分布式团队的需求不断增加&#xff0c;项目经理这一角色已迅速…

【交叉编译】sysstat 离线编译

1、下载源码 首先从下载&#xff1a; https://github.com/sysstat/sysstat/tags &#xff0c;我直接下载最新的 2、配置交叉编译链 快速的方法就是把整个编译包全部放在Linux &#xff0c;然后编辑~/.zshrc或者~/.bashrc,在最后加入&#xff1a; export PATH$PATH:/opt/arm-so…

算法题(20):买卖股票的最佳时机

审题&#xff1a; 需要返回最大利润值 思路&#xff1a; 首先我们需要看看股票走势图 我们看到股票走势图是把数据图像化了&#xff0c;那么我们观察这个股票图的时候发现他在某一段区间呈大体上升&#xff0c;而大体上升的前提就是没有出现比最低点更低的数据值。 根据这一点我…

IDEA XML 文件 SQL 提示

首先连接到对应的数据库。Database 里面要填写对应的数据库名称 配置当前项目的 SQL 方言&#xff0c;例如我这里是 MySQL 数据库管理系统&#xff0c;那么就选择 MySQL 此时就有 SQL 语法、表名、字段名等提示信息了

【STM32项目】基于STM32单片机温湿度PM2.5粉尘甲醛环境质量监测系统wifi【完整工程资料源码】

演示视频&#xff1a; 基于STM32单片机温湿度PM2.5粉尘甲醛环境质量监测系统 目录 演示视频&#xff1a; 一、项目简介&#xff1a; 1.1 功能介绍&#xff1a; 1.2 设计背景&#xff1a; 1.3 设计意义&#xff1a; 1.4 设计目的 二、硬件设计&#xff1a; 2.1 整体原理图设计&…

优化站群SEO:使用苹果CMS泛目录插件实现泛目录页面刷新不变

优化站群SEO&#xff1a;使用苹果CMS泛目录插件实现泛目录页面刷新不变 在当今数字营销环境中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是提升网站流量和可见性的关键策略。苹果CMS作为一款灵活的内容管理系统&#xff0c;提供了丰富的插件功能&#xff0c;尤其是…

SAP PP bom历史导出 ALV 及XLSX 带ECN号

bom总数 104W PS超过XLSX上限 &#xff0c;那就分文件 *&---------------------------------------------------------------------* *& Report ZRPT_PP_BOM_HIS_ECN *&---------------------------------------------------------------------* *& tcode:zpp0…

HAL 库句柄

一、命名方式&#xff1a;句柄是h为首字母&#xff0c;后面接协议名称 比如&#xff1a;huart、hadc、hi2c等 二、句柄类型&#xff1a; 这里拿huart举例&#xff0c;它的类型是UART_HandleTypeDef 进去stm32f1xx_hal_uart.h之后发现句柄的结构定义有部分是灰色的 灰色的当U…

JVM 性能监控工具之命令行篇

在 Java 开发过程中&#xff0c;性能监控和问题排查是开发者经常面临的任务。JDK 提供了一系列命令行工具&#xff0c;帮助开发者监控 JVM 运行状态、诊断内存泄漏、线程死锁等问题。本文将详细介绍这些工具的使用方法及其应用场景。 1 JDK性能监控工具 1.1 jps&#xff1a;查…

使用IDEA远程debug服务器上的jar包

仅用于测试环境调试&#xff0c;debug会阻塞 如生产jar包叫 test.jar &#xff0c;部署的IP为10.184.136.18&#xff0c;端口为9999&#xff0c;idea的项目为local-network&#xff0c;照如下配置即可&#xff0c;仅红色部分需替换 弄完之后&#xff0c;打开debug&#xff0c;…

【SQL Server】教材数据库(3)

接着教材数据库&#xff08;1&#xff09;的内容&#xff0c;完成下列查询。 1 查询订购高等教育出版社教材的学生姓名 2 查询比所有高等教育出版社的图书都贵的图书信息 3 列出每位学生姓名、订购教材书名、价格。 1、嵌套查询&#xff1a;use jiaocai select student.nam…

你有哪些Deep Learning(RNN、CNN)调参的经验?

在深度学习的实践中&#xff0c;调参是一项既艺术又科学的工作。它不仅需要理论知识的支撑&#xff0c;还需要大量的实践经验。以下是一些在RNN和CNN模型调参中积累的经验&#xff0c;希望对正在这个领域摸索的朋友们有所帮助。 1. 从成熟的开源项目开始 对于初学者来说&…

Unity3D仿星露谷物语开发11之添加Scenary Fader

1、目标 当角色移动到草/树的后面时&#xff0c;因为草/树层级优先级大于等于角色&#xff0c;导致角色无法全部展示。 如下图所示&#xff0c;草遮挡了一半的角色&#xff0c;而树则遮挡了全部的角色。 我们希望当角色走到草/树的后面时&#xff0c;草/树能够改变透明度&…

021-spring-springmvc

比较重要的部分 比较重要的部分 比较重要的部分 关于组件的部分 这里以 RequestMappingHandlerMapping 为例子 默认的3个组件是&#xff1a; org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping org.springframework.web.servlet.mvc.method.annotation.Requ…

关于 PCB线路板细节锣槽问题 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144783817 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

无人机快速巡检、森林、电力、水利大大节省人力成本,降低风险事故

无人机在快速巡检、森林、电力、水利等领域的应用&#xff0c;确实大大节省了人力成本&#xff0c;并有效降低了风险事故。以下是对这些应用的详细分析&#xff1a; 一、无人机快速巡检 无人机快速巡检技术以其高效性、安全性和精准性&#xff0c;在众多领域展现出了巨大的应…

生态碳汇涡度相关监测与通量数据分析实践技术应用

基于MATLAB语言、以实践案例为主&#xff0c;提供所有代码、原理与操作结合 1、以涡度通量塔的高频观测数据为例&#xff0c;基于MATLAB开展上机操作&#xff1a; 2、涡度通量观测基本概况&#xff1a;观测技术方法、数据获取与预处理等 3、涡度通量数据质量控制&#xff1a…

【Lua之·Lua与C/C++交互·Lua CAPI访问栈操作】

系列文章目录 文章目录 前言一、概述1.1 Lua堆栈 二、栈操作2.1 基本的栈操作2.2 入栈操作函数2.3 出栈操作函数2.4 既入栈又出栈的操作函数2.5 栈检查与类型转换函数2.5 获取表数据 三、实例演示总结 前言 Lua是一种轻量级的、高性能的脚本语言&#xff0c;经常被用于游戏开发…