当前位置: 首页 > news >正文

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

前言

动态时间规整算法,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) 就是最终的累计最短距离,也就是两个数据的差异度表示

相关文章:

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

前言 动态时间规整算法&#xff0c;Dynamic Time Wraping&#xff0c;缩写为DTW&#xff0c;是语音识别领域的一个基础算法。 算法的提出 DTW 的提出是为了解决或尽量解决在语音识别当中的孤立词识别不正确的问题。该问题简单描述为&#xff1a;在识别阶段&#xff0c;将输入…...

模型工作流:自动化的模型内部三角面剔除

1. 关于自动减面 1.1 自动减面的重要性及现状 三维模型是游戏、三维家居设计、数字孪生、VR/AR等几乎所有三维软件的核心资产&#xff0c;模型的质量和性能从根本上决定了三维软件的画面效果和渲染性能。其中&#xff0c;模型减面工作是同时关乎质量和性能这两个要素的重要工…...

解读一个新建的 Spring Boot 项目

解读一个新建的 Spring Boot 项目。 1. 创建 Spring Boot 2.5.6 项目 步骤 1: 使用 Spring Initializr 创建项目 可以使用 Spring Initializr&#xff08;https://start.spring.io/&#xff09;来快速生成一个 Spring Boot 项目。 在 Spring Initializr 中选择以下配置&…...

Vue多页面路由与模版解析

上篇文章中我们成功打包并输出了多页文件&#xff0c;而构建一个多页应用能够让我们进一步了解项目配置的可拓展性&#xff0c;可以对学习 Vue 和 webpack 起到强化训练的效果&#xff0c;本文将在此基础上主要针对多页路由及模板的配置进行系列的介绍。 本案例代码地址&#…...

Python爬虫(二)- Requests 高级使用教程

文章目录 前言一、Session 对象1. 简介2. 跨请求保持 Cookie3. 设置缺省数据4. 方法级别参数不被跨请求保持5. 会话作为上下文管理器6. 移除字典参数中的值 二、请求与响应1. 请求与响应对象1.1 获取响应头信息1.2 获取发送到服务器的请求头信息 三、SSL 证书验证1. 忽略 SSL 证…...

并联带阻滤波器带通滤波器对幅值和相位的影响(IIR)

一、背景 输入信号input分别经过bp(带通滤波器)和bs&#xff08;带阻滤波器&#xff09;处理后相加输出。分析输出信号的幅值和相位受到的影响。 根据上图公式推导可知&#xff0c;并联滤波器对输出的影响可以直接分析&#xff0c;带通滤波器与带阻滤波器在频域上的加和。 二、…...

攻防世界web新手第五题supersqli

这是题目&#xff0c;题目看起来像是sql注入的题&#xff0c;先试一下最常规的&#xff0c;输入1&#xff0c;回显正常 输入1‘&#xff0c;显示错误 尝试加上注释符号#或者–或者%23&#xff08;注释掉后面语句&#xff0c;使1后面的单引号与前面的单引号成功匹配就不会报错…...

vue3学习笔记(10)-$subscribe,store组合式写法

1.$subscribe订阅&#xff0c;监视vuex中数据得修改 2.localStorage里面穿的都是字符串&#xff0c;关掉浏览器数据还在 只能获取字符串&#xff0c;用ts语法写明&#xff0c;作为字符串使用 3.组合式写法...

操作系统论文导读(八):Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个

Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个关键性规范的零星任务的可调度性分析 目录 一、论文核心思想 二、基本定义 2.1 关键性指标 2.2 任务及相关参数定义 2.3 几个基础定义 三、可调度性分析 3.1 调度算法分…...

计算机网络与通信复习

因特网的核心部分&#xff08;电路交换与分组交换的不同点&#xff0c;分组交换的优点&#xff09; 核心部分&#xff1a;路由器、交换机 我们假如数据就是一个货物&#xff0c;比如说一千公斤的大米&#xff0c;电路交换要有专用通道&#xff0c;不管从起点到终点经过多少个…...

【Scala】图书项目系统代码演练3.1/BookService

package org.app package serviceimport models.{BookModel, BorrowRecordModel}import org.app.dao.{BookDAO, BorrowRecordDAO}import java.time.LocalDateTime import scala.collection.mutable.ListBuffer// 图书业务逻辑层 class BookService {private val bookDAO new B…...

人工智能基础软件-Jupyter Notebook

简介&#xff1a; Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。 Jupyter Notebook是以网页的形式打开&#xff0c;可以在网页页面中直接编写代码和运行代码&#xff0c;代码的运行结果也会直…...

C++ 设计模式:模板方法(Template Method)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 策略模式 链接&#xff1a;C 设计模式 - 观察者模式 模板方法&#xff08;Template Method&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。通过这…...

GDPU Vue前端框架开发 跨年大礼包

目录 选择题 填空题 简答题 记住&#xff0c;年底陪你跨年的不会仅是方便面跟你的闺蜜&#xff0c;还有孑的笔记。 选择题 1.下列选项用于设置Vue.js页面视图的元素是&#xff08;&#xff09;。 A. Template B. script C. style D. title 2.下列选项中能够定义Vuejs根…...

搭建一个高效且安全的APP分发平台

搭建一个高效且安全的APP分发平台需要经历一系列精心规划和实施的步骤。以下是一个详细的指南&#xff0c;涵盖从准备阶段到后续维护阶段的各个环节&#xff1a; 一、准备阶段 明确目标与需求 确定平台的目标用户群体&#xff0c;了解他们的需求和偏好。分析竞争对手的分发平台…...

Leetcode打卡:二叉树中的链表

执行结果&#xff1a;通过 题目 1367 二叉树中的链表 给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。 如果在二叉树中&#xff0c;存在一条一直向下的路径&#xff0c;且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值&#xff0c;那么请你返回 …...

大数据技术-Hadoop(四)Yarn的介绍与使用

目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler&#xff08;容量调度器&#xff09; 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…...

算法 class 004(选择,冒泡,插入)

选择排序&#xff1a; 刚进入 j 循环的样子 j 跳出循环后&#xff0c;b 指向最小值的坐标 然后交换 i 和 b 位置的 值 随后 i , b i , i j1; 开始新一轮的排序&#xff0c; void SelectAQort(int* arr,int size)//选择排序 {for (int i 0; i < size-1; i){ //i 的位置就是…...

linux---awk命令详细教程

awk是一种强大的编程语言&#xff0c;用于在Linux/Unix系统下对文本和数据进行处理。以下是对awk的详细教程&#xff1a; 一、awk简介 awk由Alfred Aho、Brian Kernighan和Peter Weinberger三人开发&#xff0c;其名称分别代表这三位作者姓氏的第一个字母。awk支持用户自定义…...

一个通用的居于 OAuth2的API集成方案

在现代 web 应用程序中&#xff0c;OAuth 协议是授权和认证的主流选择。为了与多个授权提供商进行无缝对接&#xff0c;我们需要一个易于扩展和维护的 OAuth 解决方案。本文将介绍如何构建一个灵活的、支持多提供商的 OAuth 系统&#xff0c;包括动态 API 调用、路径参数替换、…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

02-性能方案设计

需求分析与测试设计 根据具体的性能测试需求&#xff0c;确定测试类型&#xff0c;以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通&#xff0c;初步确定压测方案及具体的性能指标QA完成性能测试设计后&#xff0c;需产出测试方案文档发送邮件到项目组&…...

WinUI3开发_使用mica效果

简介 Mica(云母)是Windows10/11上的一种现代化效果&#xff0c;是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果&#xff0c;Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…...