第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 基于Python的语音识别系统(孤立词)

基于Python的语音识别系统(孤立词)

时间:2023-09-17 18:55:52

相关推荐

基于Python的语音识别系统(孤立词)

目录

1 任务介绍 1

2 项目实现 1

2.1 预处理 2

2.2 特征提取 3

2.2.1 归一化 3

2.2.2 预加重 3

2.2.3 分帧 3

2.3 加窗 4

2.3.1 端点检测 6

2.3.2 快速傅里叶变换 8

2.3.3 梅尔频率域特征 10

2.4 识别模型 12

2.4.2 数据加载 13

2.4.3 模型训练 13

2.5 识别交互 14

2.5.1 前端界面 14

2.5.2 服务器端 15

3 总结 15

1任务介绍

语音识别是通往真正的人工智能的不可缺少的技术。尽管能真正听懂人类说话的智能机器任然在未来不可捉摸的迷 雾之中,但我们必须先解决如何识别出人类语音中包含的自然语言信息的问题。而数字信号处理技术将为这一任务 赋能。在本课程项目的任务之中,我们面对的是一个简化的语音识别场景——即孤立词识别。

我们针对 20 个关键词,采集了所有参与课程的同学朗读每个词 20 遍的语音。我将以此为数据集来构建一个能正

确识别这 20 个关键词的孤立词识别系统。

2项目实现

基于一学期跟随老师学习到的关于信号处理与语音识别技术的知识,我额外查阅多方资料,最终呈现出了我的语音 识别系统与报告。

我实现的语音识别系统的亮点有以下几个方面:

说话人无关的孤立词识别是语音识别技术发展中一个里程碑。从现代的观点来看,如果将语言信号视作时间 序列,那么孤立词识别就是一个模式识别中的分类问题。模式识别问题的解决一般分为特征提取与模型构建 两个部分。我们将这两个部分分开处理,使得代码的实现更加具有结构性和层次性。报告也将这两部分的处 理分开叙述

我在整个系统的实现中,除了利用了数值处理函数包 numpy 和自动求导工具包 pytorch之外的所有核心代码

都是单纯使用 python 实现。即真正锻炼了代码实现能力,也加深了对语音识别技术的理解。在报告中我也强调了各个方法和过程的代码实现,并将关键代码添加到附录之中以方便检阅

特别地,我基于课堂上所学的蝶形变换方法,实现了以 2 为基的快速傅里叶变换,并运用到了频域特征的分析之中。这让我更加领略到该算法的优美

根据我自行实现的快速傅里叶变换,实现了梅尔频率域的倒谱系数的计算,并根据通过梅尔滤波器之后得到 梅尔频谱特征设计了基于卷积神经网络的识别算法

我将计算出的频谱特征视为图片,因而可以使用近年来在大规模图片分类任务上大放异彩的卷积神经网络来 进行分类识别。我采用了 年在 ImageNet 的比赛上获胜的VGG Net 作为我们的识别模型,并使用了批归一化和 Dropout 手段来避免过拟合,提高模型的泛化能力

2.1预处理

首先我对数据进行了清洗。

各个同学上交的文件结构并不一致,有的是一个压缩包下包含所有文件,有的是一个压缩包中还有以自己的学号命 名的文件夹,此外还有一些同学提交的压缩包是在 MacOS 上进行打包的,因此还有一个额外的缓存文件夹。这样的结构不利于我们对数据进行批量的读入。

因此我编写了程序先解压所有压缩包,然后进行深度优先搜索来遍历所有文件夹,根据文件的命名规则把所有文件 提取出来,按照 data/学号/文件名.wav 的格式统一存储。同时因为需要大规模地进行复制提取,为了效率的考

量,我使用多线程的方式完成了这一任务。

此外有几个文件显示已损坏而无法读取,以及一个文件录音长度大于两秒。为了数据的一致性,必须去除掉异常数 据,但仅仅删除数据将导致样本不均衡的问题。为此我采用随机替换的方式,本文转载自http://www.biyezuopin.vip/onews.asp?id=13404用同一个同学在同一个词下的另一个 语音文件进行替换。这样就可以缓解数据缺失带来的样本不均衡的问题。

同时,考虑到最终测试时是采用集外测试的方法,理论上讲应剔除女生的数据。

import argparseimport flaskimport osfrom flask import Flask, request, send_from_directoryfrom cnn_melspec import build_model, infermodel_path = "/home/zfhu/playground/DSP/project/save/checkpoint.ptr""""使用chrome进行测试时,如果服务端不是host在localhost上,会导致getUserMedia不可用(懒得搞https),所以要在信赖模式下启动chrome"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --unsafely-treat-insecure-origin-as-secure="http://10.141.208.102" --user-data-dir="temp""C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --unsafely-treat-insecure-origin-as-secure="http://10.141.208.102:22339" --user-data-dir="temp2""""if __name__ == "__main__":argparser = argparse.ArgumentParser()args = argparser.parse_args()app = flask.Flask(__name__, static_folder='interface')app.debug = Truemodel, __ = build_model(model_path)@app.route('/', methods=['POST', 'GET'])def home():return send_from_directory('interface', 'index.html')@app.route('/save-record', methods=['POST'])def save_record():file = flask.request.files['file']app.logger.debug(file.filename)os.makedirs("upload", exist_ok=True)save_to = "upload/{}".format(file.filename)file.save(save_to)return infer(model, save_to)@app.route('/js/<path:path>')def send_js(path):return send_from_directory('interface/js', path)app.run(host="0.0.0.0", port=22339)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。