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

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计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.mfbz.cn/a/600455.html

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

相关文章

硬盘惊魂!文件夹无法访问怎么办?

在数字时代&#xff0c;数据的重要性不言而喻。然而&#xff0c;有时我们会遇到一个令人头疼的问题——文件夹提示无法访问。当你急需某个文件夹中的文件时&#xff0c;却被告知无法打开&#xff0c;这种感受真是难以言表。今天&#xff0c;我们就来深入探讨这个问题&#xff0…

第六代移动通信介绍、无线网络类型、白皮书

关于6G 即第六代移动通信的介绍&#xff0c; 图解通信原理与案例分析-30&#xff1a;6G-天地互联、陆海空一体、全空间覆盖的超宽带移动通信系统_6g原理-CSDN博客文章浏览阅读1.7w次&#xff0c;点赞34次&#xff0c;收藏165次。6G 即第六代移动通信&#xff0c;6G 将在5G 的基…

VTK —— 三、简单操作 - 示例3 - 将点投影到平面上(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功&#xff0c;若无VTK库则请先参考如下链接编译vtk源码&#xff1a; VTK —— 一、Windows10下编译VTK源码&#xff0c;并用Vs2017代码测试&#xff08;附编译流程、附编译好的库、vtk测试源码&#xff09; 教程描述 本…

Day 63:单调栈 LeedCode 84.柱状图中最大的矩形

84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&a…

MySQL表的增删改查

在进行表操作之前,一定要use选中数据库 注释&#xff1a;在SQL中可以使用 --空格描述 来表示注释说明 CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母。 文章目录 数据库约束约束类型NOT NULL约束UNIQUE&#xff1a;唯一约束DEFAULT&…

【计算机科学速成课】笔记三

文章目录 17.集成电路真空管时代晶体管时代集成电路时代印刷电路板时代光刻时代 17.集成电路 Over the past six episodes, we delved into software, 过去 6 集我们聊了软件 \N 从早期编程方式到现代软件工程 from early programming efforts to modern software engineerin…

synchronized与volatile关键字

1.synchronized的特性 1.1互斥 synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized 中时, 其他线程如果也执行到 同一个对象 synchronized 就会阻塞等待. 进入 synchronized 修饰的代码块, 相当于 加锁 退出 synchronized 修饰的代码块, 相当于 解锁 syn…

游戏辅助 -- 实战找人物对象基址

本节课在线学习视频&#xff1a; https://pan.quark.cn/s/3e83f4568031 一、打开CE工具&#xff0c;加载游戏进程 二、搜索人物血量144&#xff0c;选择首次扫描 三、进入游戏&#xff0c;让人物血量发生变化&#xff0c;搜索减少的数值 四、发现绿色的数值&#xff0c;一般绿…

Jsoncpp介绍

1.简介 Jsoncpp 是一个 C 库&#xff0c;用于解析和生成 JSON 数据。它提供了一个易于使用的 DOM&#xff08;Document Object Model&#xff09;风格的 API&#xff0c;允许开发者以树形结构的方式操作 JSON 数据。 Jsoncpp 是一个C库&#xff0c;允许操作JSON值&#xff0c;…

246 基于matlab的交流电机动态方程

基于matlab的交流电机动态方程&#xff0c;用于交流电机动态分析。输入电机的额定功率(kW)、电机的额定转速(r/min)、转子外径(m)、铁心长(m)转子槽数、电机极对数 等参数&#xff0c;输出转速变化、力矩变化等结果。程序已调通&#xff0c;可直接运行。 246 交流电机动态 转速…

安卓开发(二)Android开发基础知识

了解Android Android大致可以分为4层架构&#xff1a;Linux内核层、系统运行库层、应用框架层和应用层。 内核层&#xff1a;Android系统是基于Linux内核的&#xff0c;这一层为Android设备的各种硬件提供了底层的驱动&#xff0c;如显示驱动、音频驱动、照相机驱动、蓝牙驱动…

深入浅出(五)JsonCpp库

JsonCpp库 1. JsonCpp 库1.1 JsonCpp库下载 2. JsonCpp库编译与部署3. C示例 1. JsonCpp 库 JsonCpp 是一个开源的 C 库&#xff0c;用于解析、生成和操作 JSON 数据。它提供了简单易用的 API&#xff0c;使得在 C 程序中处理 JSON 数据变得方便和高效。以下是 JsonCpp 库的一…

Dell EMC Storage Unity: Remove/Install Memory Module

SP A 一个内存故障 点击system view -> Enclosures->Top查看 再次查看Alert&#xff0c; 确认内存出现问题 进入Service &#xff0c; 将SP A置为service状态 移出SP A &#xff0c;进行内存更换 更换完内存后&#xff0c;将SP A插入设备&#xff0c;并进行线缆连接 进入…

了解 Postman:这个 API 工具的功能和用途是什么?

在软件开发中&#xff0c;经常听到 Postman 这个软件名。但其实很多新手开发者只知道这是软件开发常用的软件&#xff0c;并不知道实际是一个什么样工具&#xff0c;不知道具体的作用是什么。那今天就跟大家好好唠唠 Postman 这个软件。想要学习更多关于 Postman 的知识&#x…

洛谷 P3391:文艺平衡树 ← Splay树模板题

【题目来源】https://www.luogu.com.cn/problem/P3391【题目描述】 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一个有序数列。 其中需要提供以下操作&#xff1a;翻转一个区间&#xff0c;例如原有序序列是 5 4 3 2 1&#xff0c;翻转区间…

分布式任务调度工具 XXL-JOB

默认的账号密码是&#xff1a;admin/123456 一&#xff0c;部署docker容器 docker run \ -e PARAMS"--spring.datasource.urljdbc:mysql://192.168.150.101:3306/xxl_job?Unicodetrue&characterEncodingUTF-8 \ --spring.datasource.usernameroot \ --spring.dataso…

【刷题篇】双指针(一)

文章目录 1、移动零2、复写零3、快乐数4、盛最多水的容器 1、移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 class Solution { pub…

区间预测——conformal tights

conformal tights 是一个python包 特征&#xff1a; sklearn元估计器&#xff1a;向任何scikit-learn回归器添加分位数和区间的共形预测 darts预测&#xff1a;向任何scikit-learn回归器添加共形校准的概率预测 保形校准&#xff1a;准确的分位数和可靠的覆盖的区间 相干分…

开源go实现的iot物联网新基建平台

软件介绍 Magistrala IoT平台是由Abstract Machines公司开发的创新基础设施解决方案&#xff0c;旨在帮助组织和开发者构建安全、可扩展和创新的物联网应用程序。曾经被称为Mainflux的平台&#xff0c;现在已经开源&#xff0c;并在国际物联网领域受到广泛关注。 功能描述 多协…

数据结构——链表专题3

文章目录 一、判断链表是否有环二、返回入环的第一个节点三、随机链表的复制 一、判断链表是否有环 原题链接&#xff1a;判断链表是否有环 这道题可以使用快慢指针&#xff0c;fast一次走两步&#xff0c;slow一次走一步&#xff0c;如果有环&#xff0c;它们在环里面必定会…
最新文章