# 基于Python实现的孤立词语音识别系统
# 1 任务介绍
语音识别是通往真正的人工智能的不可缺少的技术。尽管能真正听懂人类说话的智能机器任然在未来不可捉摸的迷雾之中,但我们必须先解决如何识别出人类语音中包含的自然语言信息的问题。而数字信号处理技术将为这一任务赋能。在本课程项目的任务之中,我们面对的是一个简化的语音识别场景——即孤立词识别。
我们针对 20 个关键词,采集了所有参与课程的同学朗读每个词 20 遍的语音。我将以此为数据集来构建一个能正确识别这 20 个关键词的孤立词识别系统。
# 2 项目实现
基于一学期跟随老师学习到的关于信号处理与语音识别技术的知识,我额外查阅多方资料,最终呈现出了我的语音识别系统与报告。
我实现的语音识别系统的亮点有以下几个方面:
- 说话人无关的孤立词识别是语音识别技术发展中一个里程碑。从现代的观点来看,如果将语言信号视作时间序列,那么孤立词识别就是一个模式识别中的分类问题。模式识别问题的解决一般分为特征提取与模型构建两个部分。我们将这两个部分分开处理,使得代码的实现更加具有结构性和层次性。报告也将这两部分的处理分开叙述
- 我在整个系统的实现中,除了利用了数值处理函数包 numpy 和自动求导工具包 pytorch之外的所有核心代码都是单纯使用 python 实现。即真正锻炼了代码实现能力,也加深了对语音识别技术的理解。在报告中我也强调了各个方法和过程的代码实现,并将关键代码添加到附录之中以方便检阅
- 特别地,我基于课堂上所学的蝶形变换方法,实现了以 2 为基的快速傅里叶变换,并运用到了频域特征的分析之中。这让我更加领略到该算法的优美
- 根据我自行实现的快速傅里叶变换,实现了梅尔频率域的倒谱系数的计算,并根据通过梅尔滤波器之后得到梅尔频谱特征设计了基于卷积神经网络的识别算法
- 我将计算出的频谱特征视为图片,因而可以使用近年来在大规模图片分类任务上大放异彩的卷积神经网络来进行分类识别。我采用了 2014 年在 ImageNet 的比赛上获胜的VGG Net 作为我们的识别模型,并使用了批归一化和 Dropout 手段来避免过拟合,提高模型的泛化能力
## 2.1 预处理
首先我对数据进行了清洗。
各个同学上交的文件结构并不一致,有的是一个压缩包下包含所有文件,有的是一个压缩包中还有以自己的学号命名的文件夹,此外还有一些同学提交的压缩包是在 MacOS 上进行打包的,因此还有一个额外的缓存文件夹。这样的结构不利于我们对数据进行批量的读入。
因此我编写了程序先解压所有压缩包,然后进行深度优先搜索来遍历所有文件夹,根据文件的命名规则把所有文件提取出来,按照 data/学号/文件名.wav 的格式统一存储。同时因为需要大规模地进行复制提取,为了效率的考量,我使用多线程的方式完成了这一任务。
此外有几个文件显示已损坏而无法读取,以及一个文件录音长度大于两秒。为了数据的一致性,必须去除掉异常数据,但仅仅删除数据将导致样本不均衡的问题。为此我采用随机替换的方式,用同一个同学在同一个词下的另一个语音文件进行替换。这样就可以缓解数据缺失带来的样本不均衡的问题。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/f36bf9f10d1b8cf0a1a109db79248e89.writebug)
同时,考虑到最终测试时是采用集外测试的方法,理论上讲应剔除女生的数据。
在接下来的报告中,如无特殊声明,用 y0, y1 · · · , yt, · · · 来表示离散的信号构成的序列,用 sr
来表示采样率。
## 2.2 特征提取
### 2.2.1 归一化
因为数据在采集的时候声音强度并不一致,为了消除影响,我对每一段音频数据进行归一化。这里只需要对 y 使用 numpy.normailize 方法即可。
### 2.2.2 预加重
对读入的数据,我首先通过预加重的方法来补偿由于唇和空气导致的声音在产生和传播中高频部分的损失。预加重通常采用一个一阶的线性高通滤波器
![](http://www.writebug.com/myres/static/uploads/2021/10/19/f1647ff743fe9d5cf2e9e29e68ae062b.writebug)
来实现,其中 α = 0.97。在代码实现上,只需要对数组进行加权差分即可。
### 2.2.3 分帧
一般情况下,语音信号是一种典型的非平稳信号,但是可以认为人说话的语调变换并不是是突然的,因此可假定语音信号在短时间 (10-30ms) 内是平稳的;故而在对语音信号进行分析时,我们可以将语音信号以 10-30ms 的间隔将连续的音频信号截取成一段一段来进行分析。
用 y[i : j] 来表示 yi, yi+1, · · · , yj−1,为一帧包含为 j − i 个采样点的语音信号,其时长为( j−i)/sr。
因此,当音频信号采样率为 48kHz 的时候,想要得到时长为 10-30ms 的信号帧,其应该包含480-1500 个采样点。
另外,从分帧后信号的连续性考量,一般在分帧的时候会让相邻的两帧有 30%-50% 的重叠。分帧的实现是简单的,只需要使用 python 支持的数组切片 (slice) 方法即可方便地取出一帧对应的采样点。
## 2.3 加窗
对于每一帧数据,我们应当强调该帧数据内中间部分的数据,并将边缘的数据进行弱化。我将使用汉明窗
![](http://www.writebug.com/myres/static/uploads/2021/10/19/0ec8402fb328fc88216e039993ffcc53.writebug)
作为窗函数。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/3d13574fdb07bebc299a3eb313186297.writebug)
而所谓的加窗操作也就是用窗函数与一帧内的采样数据相乘
![](http://www.writebug.com/myres/static/uploads/2021/10/19/f56cac9d96a0c401f715f1f85194dec2.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/d876d934f77e9595cfdf11c956df4672.writebug)
考虑之后要进行短时傅里叶变换,对每一帧数据进行加窗的理由将更加充分。观察图 2中的一帧余弦信号,可以看到其开始和结束的位置是断开的。而我们在做离散时间傅里叶变换的时候是将该帧数据在时域上无限延拓成周期信号,这将导致延拓之后的信号在帧的开始与结束会发生跳变。直接进行离散傅里叶变换将导致信号泄露的现象。如图 3所示,左边是取出开始和结束连续的一帧信号的离散傅里叶变换的结果,而中间则没有加窗直接进行变换,右边是加了汉明窗再进行变换的结果。可以观察到中间的结果在信号的主要频率周围有明显的泄露现象,导致在原始数据中不存在的频率成分出现在频率域。而增加了汉明窗后,频率泄露的现象有了明显的改善。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/2e9703a4540bfe096b21a10d94b64ced.writebug)
### 2.3.1 端点检测
为了减少非语音的信号对识别的影响,我首先通过信号的时域特征来检测出语音的端点。可以使用短时平均过零率和短时能量来进行端点的检测。
想要检测出语音信号的端点,最简单的想法就是通过信号的强度来判断,因为包含语音的信号强度会明显高于背景噪声。而短时能量就是刻画信号强度的一个有效的指标。对信号进行分帧之后,y[i : j] 的短时能量定义为
![](http://www.writebug.com/myres/static/uploads/2021/10/19/52050ccf9ce0ad273a3c5f088b269e31.writebug)
即帧内信号的平方和。但如果仅仅采用短时能量作为端点检测的指标,我们将很难检测出�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
任务介绍 语音识别是通往真正的人工智能的不可缺少的技术。尽管能真正听懂人类说话的智能机器任然在未来不可捉摸的迷雾之中,但我们必须先解决如何识别出人类语音中包含的自然语言信息的问题。而数字信号处理技术将为这一任务赋能。在本课程项目的任务之中,我们面对的是一个简化的语音识别场景——即孤立词识别。 我们针对 20 个关键词,采集了所有参与课程的同学朗读每个词 20 遍的语音。我将以此为数据集来构建一个能正确识别这 20 个关键词的孤立词识别系统。 2 项目实现 基于一学期跟随老师学习到的关于信号处理与语音识别技术的知识,我额外查阅多方资料,最终呈现出了我的语音识别系统与报告。 我实现的语音识别系统的亮点有以下几个方面: 说话人无关的孤立词识别是语音识别技术发展中一个里程碑。从现代的观点来看,如果将语言信号视作时间序列,那么孤立词识别就是一个模式识别中的分类问题。模式识别问题的解决一般分为特征提取与模型构建两个部分。我们将这两个部分分开处理,使得代码的实现更加具有结构性和层次性。报告也将这两部分的处理分开叙述 我在整个系统的实现中,除了利用了数值处理函数包 numpy 和自动求导工具
资源推荐
资源详情
资源评论
收起资源包目录
毕业设计 代码+报告.rar (130个子文件)
events.out.tfevents.1529821450.DESKTOP-AQDP069 25B
events.out.tfevents.1529826805.fnlp-102 58KB
events.out.tfevents.1529821788.fnlp-102 58KB
events.out.tfevents.1529822508.fnlp-102 30KB
events.out.tfevents.1529823295.fnlp-102 12KB
events.out.tfevents.1529822669.fnlp-102 12KB
events.out.tfevents.1529826066.fnlp-102 4KB
events.out.tfevents.1529827502.fnlp-102 2KB
events.out.tfevents.1529916841.fnlp-102 1KB
events.out.tfevents.1529846748.fnlp-102 245B
events.out.tfevents.1529826702.fnlp-102 161B
events.out.tfevents.1531324707.fnlp-102 110B
events.out.tfevents.1529825812.fnlp-102 97B
events.out.tfevents.1529825656.fnlp-102 97B
events.out.tfevents.1529826422.fnlp-102 97B
events.out.tfevents.1529825929.fnlp-102 97B
events.out.tfevents.1529826589.fnlp-102 97B
events.out.tfevents.1529826634.fnlp-102 65B
events.out.tfevents.1529826168.fnlp-102 65B
events.out.tfevents.1529825781.fnlp-102 65B
events.out.tfevents.1529826277.fnlp-102 65B
events.out.tfevents.1529847390.fnlp-102 65B
events.out.tfevents.1529823952.fnlp-102 65B
events.out.tfevents.1529823777.fnlp-102 65B
events.out.tfevents.1529826062.fnlp-102 65B
events.out.tfevents.1529827493.fnlp-102 25B
events.out.tfevents.1529826413.fnlp-102 25B
events.out.tfevents.1529823768.fnlp-102 25B
events.out.tfevents.1529825915.fnlp-102 25B
events.out.tfevents.1529826574.fnlp-102 25B
events.out.tfevents.1529826693.fnlp-102 25B
events.out.tfevents.1531324688.fnlp-102 25B
events.out.tfevents.1529826401.fnlp-102 25B
events.out.tfevents.1529825647.fnlp-102 25B
events.out.tfevents.1529825921.fnlp-102 25B
events.out.tfevents.1531324665.fnlp-102 25B
events.out.tfevents.1529916833.fnlp-102 25B
events.out.tfevents.1529823944.fnlp-102 25B
events.out.tfevents.1529821778.fnlp-102 25B
events.out.tfevents.1529826580.fnlp-102 25B
events.out.tfevents.1529825804.fnlp-102 25B
events.out.tfevents.1529826690.fnlp-102 25B
.gitignore 7B
index.html 5KB
index0.html 3KB
time_domain.ipynb 1KB
vue.js 283KB
main.js 6KB
recorder.js 5KB
recorderWorker.js 4KB
audiodisplay.js 564B
test.json 2B
README.md 16KB
README.md 4KB
README.md 989B
基于Python实现的孤立词语音识别系统.pdf 831KB
1531326818208.png 93KB
mic128.png 14KB
checkpointer.ptr 47B
utils.py 13KB
conv.py 6KB
cnn_melspec.py 3KB
dataset.py 3KB
audio_server.py 1KB
feature_extraction.py 1KB
tensorboard_demo.py 841B
config.py 48B
__init__.py 33B
__init__.py 0B
play.py 0B
conv.cpython-36.pyc 6KB
dataset.cpython-36.pyc 4KB
cnn_melspec.cpython-36.pyc 3KB
feature_extraction.cpython-36.pyc 1KB
__init__.cpython-36.pyc 174B
save.svg 26KB
0000-2018-06-26-11-02-08.wav 384KB
0000-2018-06-24-20-26-04.wav 384KB
0000-2018-06-26-17-11-33.wav 384KB
0000-2018-06-26-11-02-02.wav 384KB
0000-06-02.wav 384KB
0000-2018-06-24-21-35-56.wav 384KB
0000-2018-06-24-20-39-40.wav 384KB
0000-2018-06-24-21-34-12.wav 384KB
0000-2018-06-24-20-55-39.wav 384KB
0000-2018-06-24-20-53-49.wav 384KB
0000-2018-06-26-11-01-51.wav 384KB
0000-2018-06-26-17-10-33.wav 384KB
0000-2018-06-24-20-53-59.wav 384KB
0000-2018-06-24-20-55-12.wav 384KB
0000-2018-06-28-13-06-40.wav 384KB
0000-2018-06-26-17-11-45.wav 384KB
0000-2018-06-24-20-25-53.wav 384KB
0000-2018-06-28-13-06-30.wav 384KB
0000-2018-06-24-20-55-55.wav 384KB
0000-2018-07-11-23-59-41.wav 384KB
0000-2018-06-26-11-02-18.wav 384KB
0000-2018-06-28-13-06-18.wav 384KB
0000-2018-06-24-20-55-29.wav 384KB
0000-2018-06-26-11-02-12.wav 368KB
共 130 条
- 1
- 2
资源评论
计算机毕设论文
- 粉丝: 1w+
- 资源: 394
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 【全年行事历】团建活动计划表.xlsx
- 【全年行事历】团建行程安排表-xx山.xlsx
- 【全年行事历】团建活动策划方案.docx
- 【全年行事历】团建开销费用分析.xlsx
- 【全年行事历】团建活动物料清单.xlsx
- 【全年行事历】团建文化衫尺码统计表.xlsx
- 【全年行事历】团建医药箱常备药清单.docx
- 【全年行事历】小型公司活动全年活动行事历.xlsx
- 【全年行事历】员工野外拓展活动方案.docx
- 四足机器人机械结构设计PDF
- 06-公司团建活动申请表.docx
- 03-团建活动策划方案.docx
- 07-团建活动采购预算清单.xlsx
- 08-团建日程计划表.xlsx
- 09-财务公司月度团建支出表.xlsx
- T-SQL查询高级SQLServer索引中的碎片和填充因子word文档doc格式最新版本
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功