语音识别之衡量声音之间的距离-理解DTW

news2024/12/22 23:52:04

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/

❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我

语音识别之衡量声音之间的距离-理解DTW

  • 衡量声音之间的距离-理解DTW
    • 一、任务需求
    • 二、任务目标
          • 1、学习使用DTW计算一维数组之间的距离
          • 2、学习使用DTW计算二维数组之间的距离
          • 3、学习使用DTW计算一维字符串之间的距离
          • 4、学习使用DTW计算声音之间的距离
    • 三、任务环境
          • 1、jupyter开发环境
          • 2、python3.6
          • 3、tensorflow2.4
    • 四、任务实施过程
      • 1、一维数组之间的距离
      • 2、衡量二维数组之间的距离
      • 3、衡量一维字符串之间的距离
      • 4、衡量声音之间的距离
    • 五、任务小结
  • 说明

衡量声音之间的距离-理解DTW


一、任务需求

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

我们知道,声音是一组时序数据,正如点雨点之间存在距离一样,时序数据和时序数据之间同样存在距离,显然,不同的衡量标准,会带来不同的距离。

那么声音和声音之间的距离该如何度量呢?想象一下,我们发音"a",和发音"b"的距离,显然要大于和拉长声音说了一个"a~"的距离。

事实上,在声音距离里,我们希望发音"a",和发长音"a~"的距离为0,因为我们知道这是两个同样的音。

为了衡量声音(或其他一切可以定义距离的数据),人们发明了DTW的距离度量方法。DTW示意如下:

显然,对于声音来说,我们认为蓝红两个声音并没有什么不同,不过是有些音阶被拉长或缩短了一些,而DTW在计算距离的时候,会充分考虑发音的伸缩问题。

要求:学习使用DTW/动态时间扭曲方法度量多种数据之间的距离。

二、任务目标

1、学习使用DTW计算一维数组之间的距离
2、学习使用DTW计算二维数组之间的距离
3、学习使用DTW计算一维字符串之间的距离
4、学习使用DTW计算声音之间的距离

三、任务环境

1、jupyter开发环境
2、python3.6
3、tensorflow2.4

四、任务实施过程

加载工具包

import sys
sys.path.append('/home/jovyan/dependences/')
import numpy as np
from matplotlib import pyplot as plt
from dtw import dtw

自定义距离度量可视化工具函数

def plt_distance(dist, cost, acc, path):
    plt.imshow(cost.T, origin='lower', cmap=plt.cm.Reds, interpolation='nearest')
    plt.plot(path[0], path[1], '-o')
    plt.xticks(range(len(x)), x)
    plt.yticks(range(len(y)), y)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.axis('tight')
    plt.title('Minimum distance: {}'.format(dist))
    plt.show()

1、一维数组之间的距离

首先我们尝试观察两组完全一样的数组,DTW度量的距离。显然我们期望距离是0

from sklearn.metrics.pairwise import manhattan_distances
x = [0, 0, 1, 1, 2, 4, 2, 1, 2, 0]
y = [0, 0, 1, 1, 2, 4, 2, 1, 2, 0]
dist_fun = manhattan_distances

这是两个一维数组,因此我们可以使用曼哈顿距离进行度量,接下来计算数组之间的距离。

dist, cost, acc, path = dtw(x, y, dist_fun)
plt_distance(dist, cost, acc, path)

可以看到,数组中逐元素的距离都是0,整体数组之间的距离也是0,这和我们的预期一致。

接下来我们将尝试“拉长”数组y(想象一下,拉长发音"a"的样子)。

x = [0, 0, 1, 1, 2, 4, 2, 1, 2, 0]
y = [0, 0, 1, 1, 1, 2, 2, 4, 2, 1, 2, 0, 0]

在这里我们随机“拉长”了一些元素,来模拟拉长发音这个操作,注意,各元素的相对位置和数值并没有发生变化,只有数量发生了变化。

dist, cost, acc, path = dtw(x, y, dist_fun)
plt_distance(dist, cost, acc, path)

可以看到,尽管两个数组并不是完全相同,但其距离依然是0,这和我们预期一致。

接下来我们将使用两个完全不同的数组。

x = [0, 0, 1, 1, 2, 4, 2, 1, 2, 0]
y = [1, 1, 1, 2, 2, 2, 2, 3, 2, 0]
dist, cost, acc, path = dtw(x, y, dist_fun)
plt_distance(dist, cost, acc, path)

在这里插入图片描述
两个数组并不一致,其距离为0.2,符合我们的预期。

接下来我们尝试使用两个直觉上,差距更大的数组进行观察。

x = [0, 0, 1, 1, 2, 4, 2, 1, 2, 0]
y = [9, 9, -6, -8, 7, -3, 8, 1, 9, -9]
dist, cost, acc, path = dtw(x, y, dist_fun)

plt_distance(dist, cost, acc, path)

在这里插入图片描述

在这里,我们造了两个看起来完全不同的两个数组,它们之间的距离是3.25,远高于上一个距离0.2。这也符合我们的直观认知:

  • 完全相同的数组,距离为0
  • 有拉长或缩短的两个数组,距离为0
  • 完全不同的数组,距离大于0
  • 直觉上相差越大的数组,距离相差越大

接下来我们使用同样的方法,对二维数组之间的距离进行观察。

2、衡量二维数组之间的距离

首先,创造两个二维数组,二维数组对应了空间中的点,因此我们可以使用欧氏距离进行度量

from sklearn.metrics.pairwise import euclidean_distances
x = [[0, 0], [0, 1], [1, 1], [1, 2], [2, 2], [4, 3], [2, 3], [1, 1], [2, 2], [0, 1]]
y = [[1, 0], [1, 1], [1, 1], [2, 1], [4, 3], [4, 3], [2, 3], [3, 1], [1, 2], [1, 0]]
dist_fun = euclidean_distances

dist, cost, acc, path = dtw(x, y, dist_fun)
plt_distance(dist, cost, acc, path)

从以上示例可以看出,DTW可以用于计算两个二维数组之间的距离。如果你感兴趣,可以自己尝试变换数组,观察DTW计算的距离,是否符合我们刚刚总结出来的四条规律。

DTW不仅可以用于衡量一、二维数组,实际上,任何能够定义距离的数据,都可以使用DTW方法进行计算,例如字符串。

3、衡量一维字符串之间的距离

首先定义两个字符串,在这里,我们将使用字符串之间的距离度量方法edit_distance

from nltk.metrics.distance import edit_distance
x = ['i', 'soon', 'found', 'myself', 'muttering', 'to', 'the', 'walls']
y = ['see', 'drown', 'himself']
dist_fun = edit_distance

dist, cost, acc, path = dtw(x, y, dist_fun)
plt_distance(dist, cost, acc, path)

DTW成功计算了两个句子之间的距离是0.727,如果你感兴趣,可以尝试变换不同的词语。

4、衡量声音之间的距离

通常来说,我们并不会将声音读取数据直接用于计算距离,因为声音数据样本点较多,计算起来比较慢,同时影响因素也比较多,例如噪声等。

通常都是将声音数据进行特征提取,然后对提取的特征进行距离度量,接下来的实验中,我们将使提取两段声音的MFCC特征,然后使用DTW计算距离。

import librosa
# 命令“a”
y1, sr1 = librosa.load('/home/jovyan/datas/train/fcmc0-a1-t.wav')
# 命令“b”
y2, sr2 = librosa.load('/home/jovyan/datas/train/fcmc0-b1-t.wav')

为了确保我们正确加载了音频,接下来将播放这两个音频。

from IPython import display
display.Audio(y1,rate=sr1)
display.Audio(y2,rate=sr2)

然后提取两个音频的MFCC特征。

mfcc1 = librosa.feature.mfcc(y1, sr1)
mfcc2 = librosa.feature.mfcc(y2, sr2)

为了更好的理解MFCC,我们可以将其绘制出来,实际上,MFCC就是根据声音提取出来的一个矩阵,

from librosa import display
plt.subplot(1, 2, 1)
librosa.display.specshow(mfcc1)
plt.title('a')

plt.subplot(1, 2, 2)
display.specshow(mfcc2)
plt.title('b')

上图展示了根据声音计算的MFCC特征,本质其实就是一个声音的特征矩阵,因此绘制出来就是一个热力图的样子。

接下来我们使用DTW计算两个声音MFCC特征的距离

dist_fun=lambda m, n: np.linalg.norm(m - n, ord=1)
dist, cost, acc, path = dtw(mfcc1.T, mfcc2.T, dist_fun)
dist

25.370310163497926

可以看出,通过提取声音的MFCC特征,DTW可以用于度量两个声音的距离。

五、任务小结

本实验完成绘制热力图对不同类型数据之间的距离计算方法进行展示。通过本实验我们学习到了动态时间扭曲算法的相关知识,需要掌握以下知识点:

  • 一维数组之间的距离
  • 二维数组之间的距离
  • 字符串之间的距离
  • 声音之间的距离

经过实验,我们发现,对于类似发音正常和拖长的情况下,DTW算法能够很好的适应,并给出合理的距离。

–end–

说明

本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我

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

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

相关文章

2024年学浪课程提取工具blog

2024年,如果你还在为提取学浪课程而烦恼,快来了解我们全新推出的学浪课程提取工具!这是一款高效实用的工具,能一键提取并保存课程视频、音频和文档,让学习变得更加轻松愉快!从此告别繁琐的下载和整理过程&a…

Tensor Cores 解密:解锁深度学习新篇章

Tensor Cores 使用介绍 概要介绍 TensorCore是英伟达GPU自Volta架构起支持的特性,允许CUDA开发者利用混合精度来显著提升吞吐量,且不影响精度。TensorCore在Tensorflow、PyTorch、MXNet和Caffe2等深度学习框架中得到广泛支持,用于深度学习训…

VBA在Excel中注册登录界面的应用

Excel工作表也可以做一个小程序,登录注册后可以访问或修改。为了简便,没有做复杂的控件,能说明问题就行。可以根据需要添加更多的判断条件,控制注册和访问人数。本次操作对注册没有任何限制,只要注册后就可以根据注册的账号和密码进行访问和修改。注册登录界面截图: 操作…

Anatomical-Aware Point-Voxel Network for Couinaud Segmentation in Liver CT

文章目录 Anatomical-Aware Point-Voxel Network for Couinaud Segmentation in Liver CT摘要方法实验结果 Anatomical-Aware Point-Voxel Network for Couinaud Segmentation in Liver CT 摘要 在 CT 成像中,将肝脏准确分割为解剖片段对于手术规划和病变监测至关…

web前端学习笔记7-iconfont使用

7. iconfont的使用流程 字体图标使用较多的是阿里巴巴iconfont图标库,它是阿里巴巴体验团队推出的图标库和图标管理平台,提供了大量免费和可定制的矢量图标,以满足网页设计、平面设计、UI设计、应用程序开发和其他创意项目的需求。 官方网站:https://www.iconfont.cn/ 使用…

【Git管理工具】使用Docker+浪浪云服务器部署GitLab服务器

一、什么是GitLab 1.1.GitLab简介 GitLab 是一个开源的 DevOps 平台,它基于 Git 版本控制系统提供了从项目规划、源代码管理到持续集成、持续部署、监控和安全的完整生命周期管理。GitLab 是一个为开发者提供协作工作的工具,它使得团队能够高效地在同一…

海洋行业工业气体检测传感器的重要性

海洋行业是一个广阔而复杂的领域,涉及多个分支和应用,包括浮式生产、储存和卸载(FPSO)装置、渡轮和潜艇等。这些船舶和设施在执行任务时,都可能遇到各种潜在的气体危害。因此,对于海洋行业来说,…

Redis系列之key过期策略介绍

为什么要有过期策略&#xff1f; Redis是一个内存型的数据库&#xff0c;数据是放在内存里的&#xff0c;但是内存也是有大小的&#xff0c;所以&#xff0c;需要配置redis占用的最大内存&#xff0c;主要通过maxmemory配置 maxmomory <bytes> # redis占用的最大内存官…

python中一些莫名其妙的异常

目录 一、字符串中空格\xa0二、文件写入为空问题三、Counter对NAN空值的统计问题 一、字符串中空格\xa0 对于文本中的一些空格&#xff0c;原始状态时显示为普通“空格”&#xff08;其实是latin1编码字符&#xff09;&#xff0c;但是经过split()操作后&#xff0c;这些latin…

如何用道氏理论进行炒现货白银的技术分析?

要炒现货白银&#xff0c;就要对白银价格进行技术分析。进行炒白银的技术分析&#xff0c;目的是让投资者通过对白银价格图表的分析&#xff0c;判断白银市场趋势&#xff0c;进而寻找入场交易的机会。 道氏理论不光是一种技术分析的理论&#xff0c;它还被称为技术分析的鼻祖。…

【XR806开发板试用】阻塞式串口发送与接收教程

本文基于wsl2搭建的ubuntu18.04 vscode编辑器 很奇怪啊&#xff0c;找了半天居然没人发串口的教程&#xff0c;于是只能自己试一试了&#xff0c;在此发一个阻塞式的串口发送与接收的教程。并且&#xff0c;感谢.ACE彭洪权大佬在我配置环境遇到几十个报错的时候帮我远程搭建环…

H3C Private VLAN实验

Private VLAN 实验1 实验需求 按照图示配置 IP 地址 在 SW1 上配置 Private VLAN&#xff0c;Primary VLAN 为 Vlan30&#xff0c;Secondary VLAN 为 Vlan10 和 Vlan20 SW2 通过 Vlan100 下行连接 SW1&#xff0c;要求 PC3 和 PC4 都能以 Vlan100 访问 PC5 在 SW1 上配置 …

给网站网页PHP页面设置密码访问代码

将MkEncrypt.php文件上传至你网站根目录下或者同级目录下。 MkEncrypt.php里面添加代码&#xff0c;再将调用代码添加到你需要加密的页进行调用 MkEncrypt(‘123456’);括号里面123456修改成你需要设置的密码。 密码正确才能进去页面&#xff0c;进入后会存下cookies值&…

java接受入参是xml格式参数demo

java接受入参是xml格式参数demo 依赖demo1. xml入参定义2.接口定义3. postman请求4. 结果 注解说明 依赖 pom依赖 jackson-dataformat-xml <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</…

RCLAMP0854P.TCT ESD抑制器 静电和浪涌保护 应用领域

RCLAMP0854P.TCT 是一款电路保护器件&#xff0c;属于Transient Voltage Suppressor (TVS) 系列产品。它是一种低电容TVS阵列&#xff0c;具有 RailClamp 标志性技术&#xff0c;旨在为电子设备提供高效防护&#xff0c;免受高电压瞬变和静电放电&#xff08;ESD&#xff09;的…

uni-app 超详细教程( 附送250套精选项目源码)

一&#xff0c;uniapp 介绍 &#xff1a; 官方网页 uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/…

信息泄露中的目录遍历,phpinfo,备份文件下载

一、目录遍历漏洞 1.什么是目录遍历漏洞 指的是在没有授权的情况下读取文件&#xff0c;某些情况下还可对服务器里的文件任意写入 2.目录遍历漏洞成因 网站配置存在缺陷&#xff0c;对输入目录缺少验证&#xff0c;没过滤../之类的目录跳转符&#xff0c;可通过提交目录跳转…

速卖通新卖家测评攻略:从入门到精通

在电商行业中&#xff0c;测评被广泛认为是提升产品转化率和销量的有效手段。对于速卖通的卖家而言&#xff0c;测评的必要性更是显而易见。测评&#xff0c;本质上与国内电商的补单行为相似&#xff0c;是一种通过增加销量来提升产品权重的方法。 特别是在竞争激烈的类目中&a…

【触摸案例-手势解锁案例-按钮高亮 Objective-C语言】

一、我们来说这个self.btns,这个问题啊,为什么不用_btns, 1.我们说,在懒加载里边儿,经常是写下划线啊,_btns,为什么不写,首先啊,这个layoutSubviews:我们第一次,肯定会去执行这个layoutSubviews: 然后呢,去懒加载这个数组, 然后呢,接下来啊,走这一句话, 第一次…

使用 Gitea 进行私有 Git 仓库管理

在本文中&#xff0c;我们将介绍如何使用 Gitea 搭建并管理私有 Git 仓库。Gitea 是一个轻量级的 Git 服务&#xff0c;提供了类似于 GitHub 的功能&#xff0c;适合个人和小团队使用。我们将通过以下步骤来完成搭建和配置 Gitea 服务器。 步骤一&#xff1a;安装 Gitea 首先…