语音识别--kNN语音指令识别

news2024/11/24 19:02:06

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

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

语音识别--kNN语音指令识别

  • kNN语音指令识别
    • 一、任务需求
    • 二、任务目标
          • 1、学习MFCC
          • 2、根据MFCC计算DTW
          • 3、根据DTW训练kNN分类器
    • 三、任务环境
          • 1、jupyter开发环境
          • 2、python3.6
          • 3、tensorflow2.4
    • 四、任务实施过程
      • 1、加载工具
      • 2、了解什么是MFCC
      • 3、根据MFCC计算DTW
      • 4、训练kNN分类器模型
    • 五、任务小结
  • 说明

kNN语音指令识别


一、任务需求

我们希望得到一个分类器,它可以识别简单的’a’/'b’两个命令。

kNN分类器使用样本之间的距离做为分类标准。

kNN分类器的训练数据,可以是特征和标签,也可以是样本间的距离矩阵和标签。

要求:创建一个能识别简单语音指令(字母’a’/‘b’)的kNN分类器。

二、任务目标

1、学习MFCC
2、根据MFCC计算DTW
3、根据DTW训练kNN分类器

三、任务环境

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

四、任务实施过程

1、加载工具

首先加载实验所需要用到的工具,首先将/home/jovyan/dependences/添加到环境变量中,该文件夹存放了我们自定义的,用于计算动态时间扭曲距离的工具。

import sys
sys.path.append('/home/jovyan/dependences/')
# 过滤警告信息
import warnings
warnings.filterwarnings('ignore')
import time # 时间相关
import librosa # 音频和音乐分析工具
from dtw import dtw # 自定义的动态时间扭曲距离函数,用于衡量声音之间的距离
import librosa.display # librosa的演示函数
import matplotlib.pyplot as plt
import numpy as np
import IPython.display as ipd

2、了解什么是MFCC

MFCC(Mel-frequency cepstral coefficients):梅尔频率倒谱系数。梅尔频率是基于人耳听觉特性提出来的, 它与Hz频率成非线性对应关系。梅尔频率倒谱系数(MFCC)则是利用它们之间的这种关系,计算得到的Hz频谱特征。主要用于语音数据特征提取和降低运算维度。

梅尔频率倒谱的频带划分是在梅尔刻度上等距划分的,它比用于正常的对数倒频谱中的线性间隔的频带更能近似人类的听觉系统。

接下来我们看看如何得到MFCC图。首先随意加载两个音频进来,方便我们观察学习MFCC。

# 命令“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')

首先观察音频命令“a”

# 演示播放“a”
ipd.Audio(y1, rate=sr1)
# 观察“a”的声波图
plt.figure(figsize=(15, 5))
librosa.display.waveplot(y1, sr1, alpha=0.8)

这是语音a对应的波形图

利用librosa可以很方便的提取音频对应的MFCC,提取方式如下

import matplotlib.pyplot as plt
import librosa.display 
%matplotlib inline

mfcc1 = librosa.feature.mfcc(y1, sr1)
librosa.display.specshow(mfcc1)

这是语音a对应的MFCC特征矩阵

接下来观察音频命令“b”

plt.figure(figsize=(15, 5))
librosa.display.waveplot(y2, sr2, alpha=0.8)
<matplotlib.collections.PolyCollection at 0x7f459ce44e80>

在这里插入图片描述

这是语音b对应的波形图

import matplotlib.pyplot as plt
import librosa.display
%matplotlib inline

mfcc2 = librosa.feature.mfcc(y2, sr2)
librosa.display.specshow(mfcc2)

<matplotlib.collections.QuadMesh at 0x7f459c762668>

在这里插入图片描述

这是语音b对应的MFCC特征矩阵

把“a”“b”的MFCC图放在一起比较

plt.subplot(1, 2, 1)
mfcc1 = librosa.feature.mfcc(y1, sr1)
librosa.display.specshow(mfcc1)
plt.title('a')

plt.subplot(1, 2, 2)
mfcc2 = librosa.feature.mfcc(y2, sr2)
librosa.display.specshow(mfcc2)
plt.title('b')

从MFCC图中我们能看出来,两个音频命令确实存在差别,这种差别有多大呢?我们可以使用DTW来进行度量

3、根据MFCC计算DTW

如果你接触过机器学习,或sklearn工具包,你可能更习惯使用样本属性x和标签y训练模型,例如model.fit(x,y)。实际上,kNN分类器是基于距离度量的模型,我们可以使用样本点两两之间的距离组成的距离矩阵进行训练,即model.fit(distances,y)

因此,当我们可以度量两个声音之间的距离时,就可以训练kNN分类器。因此接下来我们将根据上一步计算的MFCC,使用“DTW(Dynamic Time Warping)”方法,计算声音之间的距离。

dist, cost, path, _ = dtw(mfcc1.T, mfcc2.T, dist=lambda x, y: np.linalg.norm(x - y, ord=1))
print('Normalized distance between the two sounds:', dist)   

Normalized distance between the two sounds: 25.370310163497926

通过DTW函数,我们可以计算声音之间的距离。考虑到kNN模型原理,接下来我们还需要得到训练集各样本点之间的距离。

首先获取训练集中的所有文件名:

import os
dirname = "/home/jovyan/datas/train"
files = [f for f in os.listdir(dirname) if not f.startswith('.')]
# 对文件名进行排序,避免不同系统平台对文件的排序方式不一样
files = list(sorted(files))

使用for循环计算训练集各音频样本点之间的距离,得到样本的距离矩阵distances和标签y

这一步可能消耗时间比较长,如果不想等待,你可以跳过这一步,直接加载计算好的距离矩阵。

'''
start = time.clock()
minval = 200
distances = np.ones((len(files), len(files)))
y = np.ones(len(files))

for i in range(len(files)):
    y1, sr1 = librosa.load(dirname+"/"+files[i])
    mfcc1 = librosa.feature.mfcc(y1, sr1)
    for j in range(len(files)):
        y2, sr2 = librosa.load(dirname+"/"+files[j])
        mfcc2 = librosa.feature.mfcc(y2, sr2)
        dist, _, _, _ = dtw(mfcc1.T, mfcc2.T, dist=lambda x, y: np.linalg.norm(x - y, ord=1))
        distances[i,j] = dist
    if i%2==0:
        y[i] = 0  #'a'
    else:
        y[i] = 1  #'b'
print("Time used: {}s".format(time.clock()-start))
np.save('/home/jovyan/datas/distances.npy',distances)
'''

# 加载计算好的距离矩阵
distances = np.load('/home/jovyan/datas/distances.npy')
# 定义标签
y = [0,1]*12
label = ['a','b']

4、训练kNN分类器模型

得到距离矩阵和标签以后,我们就可以使用距离矩阵标签训练kNN分类器了。

from sklearn.neighbors import KNeighborsClassifier
# 设置邻居数量为5,距离度量方式为欧氏距离
classifier = KNeighborsClassifier(n_neighbors=5,metric='euclidean')
classifier.fit(distances, y)
KNeighborsClassifier(metric='euclidean')

加载测试集样本,查看分类器效果

y, sr = librosa.load('/home/jovyan/datas/test/farw0-b1-t.wav')
# 为了确认是否真的是语音"b",我们将其播放出来听一听
ipd.Audio(y, rate=sr)

由于模型训练时,使用的是距离矩阵,因此预测时,使用的也应当是测试样本点到训练集各个样本点之间的距离。

因此我们需要依次计算测试集样本距离其他样本点的距离。

mfcc = librosa.feature.mfcc(y, sr)
distanceTest = []
for i in range(len(files)):
    y1, sr1 = librosa.load(dirname+"/"+files[i])
    mfcc1 = librosa.feature.mfcc(y1, sr1)
    dist, _, _, _ = dtw(mfcc.T, mfcc1.T, dist=lambda x, y: np.linalg.norm(x - y, ord=1))
    distanceTest.append(dist)
pre = classifier.predict([distanceTest])[0]
print(pre,label[int(pre)])

1 b

从结果上看,我们成功的预测该样本标签为1,即声音“b”。

五、任务小结

本实验完成kNN分类器实现简单的语音识别,主要应用MFCC和DTW等方法。通过本实验我们学习到了KNN和语音距离计算以及MFCC的相关知识,需要掌握以下知识点:

  • 提取语音特征(与其他语音的动态时间扭曲距离)
  • 根据距离,使用kNN分类器识别语音

–end–

说明

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

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

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

相关文章

【LAMMPS学习】八、基础知识(5.8)LAMMPS 中热化 Drude 振荡器教程

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

TriCore TC162 Archievture Volume 笔记

说明 本文是 英飞凌 架构文档 TriCore TC162P core archiecture Volume 1 of 2 (infineon.com) 的文笔&#xff0c;稍作整理方便查阅&#xff0c;错误之处&#xff0c;还请指正&#xff0c;谢谢 :) 1. Architecture 2. General Purpose & System Register 名词列表&#…

gin-vue-blog 前后端分离项目(已经部署)

gin-vue-blog 前台&#xff1a; 后台&#xff1a; 1.数据库设计&#xff1a;https://blog.csdn.net/m0_73337964/article/details/138137629?spm1001.2014.3001.5501 2.RESTFUL API路由实现&#xff1a;https://blog.csdn.net/m0_73337964/article/details/138321631?spm1…

基于Spring Boot的家具网站设计与实现

基于Spring Boot的家具网站设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统前台主界面图&#xff0c;用户可进入家具网站可查看…

9.4.k8s的控制器资源(job控制器,cronjob控制器)

目录 一、job控制器 二、cronjob控制器 一、job控制器 job控制器就是一次性任务的pod控制器&#xff0c;pod完成作业后不会重启&#xff0c;其重启策略是&#xff1a;Never&#xff1b; 简单案例 启动一个pod&#xff0c;执行完成一个事件&#xff0c;然后pod关闭&#xff1b;…

抖音小店个人店和个体店有什么不同?区别问题,新手必须了解!

哈喽~我是电商月月 新手开抖音小店入驻时会发现&#xff0c;选择入驻形式时有三个选择&#xff0c;个人店&#xff0c;个体店和企业店 其中&#xff0c;个人店和个体店只差了一个字&#xff0c;但个人店不需要营业执照&#xff0c;是不是入驻时选择个人店会更好一点呢&#x…

PXE高效批量装机

一、PXE的概述 PXE是由Inter 公司开发的网络引导技术&#xff0c;工作在Client / Server 模式。允许客户机通过网络从远程服务器下载引导镜像&#xff0c;并加载安装文件或者整个操作系统。 1.1PXE优点 规模化&#xff1a;同时装配多台服务器 自动化&#xff1a;安装系统&am…

使用DependencyCheck工具检测JAR依赖包的安全漏洞

引言 Dependency-Check 是一个开源工具,用于检测软件项目中使用的第三方库和组件是否存在已知的安全漏洞。它可以帮助开发团队及时发现和解决项目中的潜在安全风险,从而提高软件的安全性。 该工具通过分析项目的依赖关系,识别其中使用的第三方库和组件,并与已知的漏洞数据…

【牛客】Tokitsukaze and Average of Substring

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 前缀和。 开一个int类型的前缀和数组pre[30][N]&#xff08;pre[i][j]表示某字符转成的数字 i 在一段区间的前缀个数。因为字母表有‘a’~z…

PE文件(四)FileBuffer-ImageBuffer

文件执行的总过程 当文件从硬盘中读入虚拟内存&#xff08;FileBuffer&#xff09;中时&#xff0c;文件数据会被原封不动的复制一份到虚拟内存中&#xff0c;然后进行拉伸对齐。此时虚拟内存中文件数据叫做文件印象或者内存印象&#xff0c;即ImageBuffer。此时ImageBuffer中…

KDTree空间搜索算法学习

目录 KDTree&#xff08;K-Dimensional Tree&#xff09;原理步骤空间索引建立例子[^1] 相关包案例[^2]数据KDTree 识别轨道衔接出行轨道衔接单车骑行范围分析结果保存 KDTree&#xff08;K-Dimensional Tree&#xff09;原理 将需要匹配的 K 维空间点建立 K 维树空间索引&…

FSC森林认证是什么?

FSC森林认证&#xff0c;又称木材认证&#xff0c;是一种运用市场机制来促进森林可持续经营&#xff0c;实现生态、社会和经济目标的工具。FSC森林认证包括森林经营认证&#xff08;Forest Management, FM&#xff09;和产销监管链认证&#xff08;Chain of Custody, COC&#…

Compose 状态管理

文章目录 Compose 状态管理概述使用MutableStaterememberStatelessComposable & StatefulComposable状态提升rememberSaveable支持parceable不支持parceable 使用ViewModelViewModelProvider.Factory 使用Flow Compose 状态管理 概述 当应用程序的状态发生变化时&#xf…

2024.5.7

槽函数声明 private slots:void on_ed_textChanged();void on_pushButton_clicked(); }; 槽函数定义 void Widget::on_ed_textChanged()//文本框 {if(ui->ed1->text().length()>5&&ui->ed2->text().length()>5){ui->pushButton->setStyleSh…

纯血鸿蒙APP实战开发——手写绘制及保存图片

介绍 本示例使用drawing库的Pen和Path结合NodeContainer组件实现手写绘制功能。手写板上完成绘制后&#xff0c;通过调用image库的packToFile和packing接口将手写板的绘制内容保存为图片&#xff0c;并将图片文件保存在应用沙箱路径中。 效果图预览 使用说明 在虚线区域手写…

二进制转为HEX数组小工具

在使用RA8889时&#xff0c;JPG的解码只能从FLASH的DMA通道获取&#xff0c;那么如果要从远端、或者SD卡等处读取JPG图片出来显示怎么办&#xff1f; RA8889支持JPG图片硬解码&#xff0c;但数据流是从FLASH进行DMA读取的&#xff0c;然后再进行解码。因此这种情况下&#xff…

音频数字信号I2S一些知识理解

(1)I2S单向基本传输需要几根线传输音频信号? 3根线 LRCK SCLK(也叫BLK) DATA(单向) (2)如何理解I2S MASTER或者SLAVE的模式&#xff1f; codec的i2s作为slave mode,LRCK和SCLK来自于soc主控端,codec端自动检测MCLK和LRCK codec的i2s作为master mode,codec通过MCLK LRCLKDIV…

使用Simulink Test进行单元测试

本文摘要&#xff1a;主要介绍如何利用Simulink Test工具箱&#xff0c;对模型进行单元测试。内容包括&#xff0c;如何创建Test Harness模型&#xff0c;如何自动生成excel格式的测试用例模板来创建测试用例&#xff0c;如何手动填写excel格式的测试用例模板来手动创建测试用例…

springboot模块以及非springboot模块构成的多模块maven项目最佳构建方式

文章目录 背景一般的实现使用spring-boot-dependencies 更优雅的实现. 背景 有时候构建一个多模块maven项目其中某一个模块是web-service需要使用spring boot,其他模块跟spring boot 完全无关,本文总结一下在这个场景下maven项目最佳构建方式. 一般的实现 网上应该也看到过很…

notepad++安装 hex-editor插件

打开notepad 点击插件 搜索 hex-editor,点击右侧 安装install 安装成功后&#xff0c;在已安装插件中就有显示了