论文部分内容阅读
摘要:TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,而本文将介绍其衍生的js版本即TensorFlow.js框架,并且基于这个框架和浏览器环境加载一个预训练模型来实现语音识别简单孤立的英文单词的功能。通过对预训练模型的使用与优化研究,为进一步使用TensorFlow.js实现更加复杂的商业化功能做了前期探索。
关键词:预训练模型;TensorFlow.js;语音识别
1 概述
简单的语音识别实际上也是属于分类问题,而声音在计算机中是被当成声谱图,既然是图片类的,那么就可以使用卷积神经网络来构建训练模型[1]。实际上很多成熟的语音识别模型也是基于卷积神经网络构建的,本文也将采用Tfjs-model这个官方模型库里面的speech-commands这个预训练好的语音命令模型,该模型可以获取一秒的音频片段,十分适合用来实现一个简单的语音识别功能。
相对于绑定完成并且支持版本兼容运行的语言为C和Python的TensorFlow机器学习库,TensorFlow.js则是一个javascript库,用于在浏览器和Node.js上訓练和部署模型,既可以从头到尾的自己重新训练一个模型,也可以直接运行现有的模型。可以说,它的出现让市场流行的传统的前端界面、App有了更多的机遇,可以通过嵌入各种各样的机器学习模型,让界面产生更多的智能化的交互[2]。
2 TensorFlow.js框架
2.1 TensorFlow.js特性
TensorFlow.js是一个用javascript实现的机器学习库,使开发者可以直接在node.js和浏览器中使用机器学习技术,而且该库繁荣的生态系统还提供了一系列的工作流程,方便使用javascript开发和训练模型,并在多个平台上部署模型,具有较好的兼容性和强大的支持[3]。目前TsensorFlow.js已经被应用到多个计算机相关领域如语音识别、图片识别、自然语言处理等[4]。
需要说明的是TensorFlow.js使用的是Tensor,也称为张量,有别于一般数组,它是向量和矩阵向更高维度的拓展,也可以近似的看成一个多维数组。而神经网络具有多个神经元和层,每一层都需要存储N维的数据[5],这些数据往往需要进行N层的遍历循环计算等,导致其数据结构比较复杂,因此就需要张量这样一个高维的数据结构来存储这些数据。
下文中的模型特指人工神经网络模型,主要由TensorFlow.js框架的sequential方法初始化并根据需求逐步添加输入层、隐藏层和输出层。每个神经网络模型里面都包含一个输入层、最少一个隐藏层、一个输出层,每个层由任意个(至少为1个)神经元构成。每个神经元都会包含若干权重、偏置和一个激活函数。
2.2 TensorFlow.js开发环境搭建
所谓“工欲善其事必先利其器”,第一步首先是如何安装TensorFlow.js。安装的话其实分为在浏览器安装和在node安装,考虑到浏览器的便捷性和容易上手的特性,所以介绍相对比较简单的浏览器安装。
完成上述TensorFlow.js库的安装后就可以在浏览器上运行机器学习模型或者加载预训练模型。
3 预训练模型的使用
3.1 预训练模型
所谓预训练模型就是已经事先训练好的模型,无须再训练即可预测计算。这些模型大部分都是托管在NPM和unpkg上的,因此它们可以被用于任何开箱即用的项目[6]。它们可以直接使用,也可以在TensorFlow.js的传输学习环境中使用。这里使用的预训练模型是语言命令识别器,它是一个javascript模块,可以从一个很小的词汇表中识别出简单的、孤立的英文单词口语命令。默认词汇表会存在一个数组里(外面有一个对象包裹),而该数组的第一个元素是代表背景噪音,第二个元素是未知单词,我们将会在之后的模型预测中将这两个元素剔除,只留下有具体意义的单词。如以下具体的数据:
3.2 预训练模型实现
由于是预训练模型,故需要从官方仓库那里下载语音识别模型文件,保存到本地文件夹中,然后就可以在本地开启静态文件服务器(http-server或者nginx皆可,这里启动的地址默认为:http://127.0.0.1:8080)并且能通过静态服务器访问到这个文件,下载这个模型文件后还需要安装对应的依赖,可以在终端命令行运行npm i @tensorflow-models/speech-commands,然后在编写业务逻辑的地方引入即可完成准备工作,接下来将新建一个script.js文件来书写具体的训练逻辑,步骤如下:
语音命令识别器的定义(在线流媒体识别方式):利用导入的模型文件里面自带的create方法建立一个识别器实例,这个识别器可以用来加载我们的预训练模型。该识别器需要传入四个参数(第一个必选,其余为可选的识别参数),这里传入了浏览器傅里叶转换、null为默认识别单词(由于已经给出模型地址故应该给null或者undefined)、预训练模型的地址、预训练模型的源文件信息(地址和信息来源于刚刚安装的语言识别依赖):
模型包含的可识别单词:通过识别器的wordLabels方法可以得知目前可以识别的单词同时我们通过javascript自带的slice方法截取掉前面无意义的两个单词,并且把剩下可以识别的单词作为标签即输出。
3.3模型预测
经过上面的步骤之后就已经完成了加载预训练模型,同时获得了模型的标签,接下来就可以通过监听用户麦克风的输入即特征来进行语音识别了。
监听用户麦克风:这个可以通过H5实现,但是识别器通过了listen方法也可以让开发者监听。需要获得用户输入对应词汇表中每个单词对应的符合程度,并且获取其中符合程度最高的单词,这个单词就是根据用户输入的语音识别得到的,将这个单词打印并显示到页面: 识别频率和准确度:由于上述方法实现的语音识别过于频繁且正确率较低,而listen方法不仅可以传入一个回调函数为参数,还可以传入一个配置对象,所以可在它的后面加一个配置对象。该对象包括overlapFactor负责控制识别器对光谱图进行预测的频率,值越大则识别的频率越快(默认为0.5);probabilityThreshold通过定义一个阀值,根据是否超过阀值决定是否调用回调函数来负责控制识别的准确度,值越大则越能减少杂音的干扰但是同时对发音要求也会提高:
通过设置配置对象即调整超参数[7]后准确率有了较大提升,基本上可以符合使用的要求,但是偶尔也会出现识别错误的情况,这个是有多个原因造成的,例如用户麦克风输入时的杂音、用户发音不准等。那么到这里就已经完成了这个语音识别模型的使用。
4 预训练模型的引入与测评
4.1 模型引入
目前已经完成了模型逻辑的编写,接下来还需要在页面中引入该模型,由于整个预训练模型的使用已经整合成一个javascript文件,所以可以新建一个html文件引入它,并且利用css对样式做出一定的美化(空白的单词卡片):
另外在逻辑文件夹中也需要先获取页面的DOM将数据文件中的每一个数据通过遍历置换为一个个div标签并在页面中展示。
整体的静态页面效果如下:
4.2 模型优化
接下来需要对监听用户麦克风并且获取到的对应单词的提示进行优化,修改该部分的代码,获取对应单词的索引然后遍历数据找到对应的单词修改其背景色(变为蓝色单词卡片):
4.3 模型效果测评
接下来在浏览器上对该模型进行测试,效果如下:
累计语音输入为100次;
正确且及时识别次数为83次;
超前识别次数为7次;
错误识别次数为6次;
无法识别次数为4次;
正确识别率为83%;
通过以上测试数据可知,语音识别的正确率较高但是仍然存在识别不出和无语音输入却提前识别的情况。
关于语音识别不出的情况,笔者测试的环境较为封闭,但是仍然存在一些杂音,导致有特征输入而无标签输出,可以通过调整前文提及的probabilityThreshold超参数,这里修改为0.9。
关于超前识别的情况,无特征输入却有标签输出,且与上次特征输入的间隔较小,故可以判断是模型识别语音过于频繁,可以调整overlapFactor属性改善,这里修改为0.3后继续测试。
优化后重新测试的结果如下:
累计语音输入为100次;
正确且及时识别次数为97次;
超前识别次数为0次;
错误识别次数为1次;
无法识别次数为2次;
正确识别率为97%;
通过以上的测试数据可知,正确率已经得到了较大的提升,只存在因为特殊情况导致无法识别和识别错误,基本沒有出现超前识别的情况。
至此就完成了模型在页面的引入和使用,以及通过调整参数进行一定程度的优化来提高准确率。
5 结语
综上可得,基于预训练模型可以很容易的进行引入和使用,可以更快的投入到实际的生产使用,但需要程序员熟练的掌握优化思路与技巧。
TensorFlow.js的功能非常强大,本文仅介绍了它其中的一个在英文语音识别的应用方面,对如何利用预训练模型解决更加复杂的问题有一定的参考意义。更多的应用如迁移学习、过拟合与欠拟合、Python与javascript之间模型的转换等等[8]限于篇幅并没有提及,后续将继续探索TensorFlow.js在各方面应用的途径。
参考文献:
[1] 袁文翠,孔雪.基于TensorFlow深度学习框架的卷积神经网络研究[J].微型电脑应用,2018,34(2):29-32.
[2] 李康化,姜姗.机器学习与文化生产变革——基于AI技术发展视角[J].湘潭大学学报(哲学社会科学版),2020,44(1):74-79.
[3] Google TensorFlow 机器学习框架介绍和使用[EB/OL].(2015-12-15) [2016-11-25]http://blog.csdn.net/sinat_31628525/article/details/50320817.
[4] 张俊,李鑫.TensorFlow平台下的手写字符识别[J].电脑知识与技术,2016,12(16):199-201.
[5] 章敏敏,徐和平,王晓洁,等.谷歌TensorFlow机器学习框架及应用[J].微型机与应用,2017,36(10):58-60.
[6] 纪守领,李进锋,杜天宇,等.机器学习模型可解释性方法、应用与安全研究综述[J].计算机研究与发展,2019,56(10):2071-2096.
[7] Daniel Smilkov,Nikhil,等.TensorFlow.js: Machine Learning for the Web and Beyond[J].Mathematical Software,2019(2):1.
[8] 周志华.机器学习[M].北京:清华大学出版社,2016.
【通联编辑:梁书】
关键词:预训练模型;TensorFlow.js;语音识别
1 概述
简单的语音识别实际上也是属于分类问题,而声音在计算机中是被当成声谱图,既然是图片类的,那么就可以使用卷积神经网络来构建训练模型[1]。实际上很多成熟的语音识别模型也是基于卷积神经网络构建的,本文也将采用Tfjs-model这个官方模型库里面的speech-commands这个预训练好的语音命令模型,该模型可以获取一秒的音频片段,十分适合用来实现一个简单的语音识别功能。
相对于绑定完成并且支持版本兼容运行的语言为C和Python的TensorFlow机器学习库,TensorFlow.js则是一个javascript库,用于在浏览器和Node.js上訓练和部署模型,既可以从头到尾的自己重新训练一个模型,也可以直接运行现有的模型。可以说,它的出现让市场流行的传统的前端界面、App有了更多的机遇,可以通过嵌入各种各样的机器学习模型,让界面产生更多的智能化的交互[2]。
2 TensorFlow.js框架
2.1 TensorFlow.js特性
TensorFlow.js是一个用javascript实现的机器学习库,使开发者可以直接在node.js和浏览器中使用机器学习技术,而且该库繁荣的生态系统还提供了一系列的工作流程,方便使用javascript开发和训练模型,并在多个平台上部署模型,具有较好的兼容性和强大的支持[3]。目前TsensorFlow.js已经被应用到多个计算机相关领域如语音识别、图片识别、自然语言处理等[4]。
需要说明的是TensorFlow.js使用的是Tensor,也称为张量,有别于一般数组,它是向量和矩阵向更高维度的拓展,也可以近似的看成一个多维数组。而神经网络具有多个神经元和层,每一层都需要存储N维的数据[5],这些数据往往需要进行N层的遍历循环计算等,导致其数据结构比较复杂,因此就需要张量这样一个高维的数据结构来存储这些数据。
下文中的模型特指人工神经网络模型,主要由TensorFlow.js框架的sequential方法初始化并根据需求逐步添加输入层、隐藏层和输出层。每个神经网络模型里面都包含一个输入层、最少一个隐藏层、一个输出层,每个层由任意个(至少为1个)神经元构成。每个神经元都会包含若干权重、偏置和一个激活函数。
2.2 TensorFlow.js开发环境搭建
所谓“工欲善其事必先利其器”,第一步首先是如何安装TensorFlow.js。安装的话其实分为在浏览器安装和在node安装,考虑到浏览器的便捷性和容易上手的特性,所以介绍相对比较简单的浏览器安装。
完成上述TensorFlow.js库的安装后就可以在浏览器上运行机器学习模型或者加载预训练模型。
3 预训练模型的使用
3.1 预训练模型
所谓预训练模型就是已经事先训练好的模型,无须再训练即可预测计算。这些模型大部分都是托管在NPM和unpkg上的,因此它们可以被用于任何开箱即用的项目[6]。它们可以直接使用,也可以在TensorFlow.js的传输学习环境中使用。这里使用的预训练模型是语言命令识别器,它是一个javascript模块,可以从一个很小的词汇表中识别出简单的、孤立的英文单词口语命令。默认词汇表会存在一个数组里(外面有一个对象包裹),而该数组的第一个元素是代表背景噪音,第二个元素是未知单词,我们将会在之后的模型预测中将这两个元素剔除,只留下有具体意义的单词。如以下具体的数据:
3.2 预训练模型实现
由于是预训练模型,故需要从官方仓库那里下载语音识别模型文件,保存到本地文件夹中,然后就可以在本地开启静态文件服务器(http-server或者nginx皆可,这里启动的地址默认为:http://127.0.0.1:8080)并且能通过静态服务器访问到这个文件,下载这个模型文件后还需要安装对应的依赖,可以在终端命令行运行npm i @tensorflow-models/speech-commands,然后在编写业务逻辑的地方引入即可完成准备工作,接下来将新建一个script.js文件来书写具体的训练逻辑,步骤如下:
语音命令识别器的定义(在线流媒体识别方式):利用导入的模型文件里面自带的create方法建立一个识别器实例,这个识别器可以用来加载我们的预训练模型。该识别器需要传入四个参数(第一个必选,其余为可选的识别参数),这里传入了浏览器傅里叶转换、null为默认识别单词(由于已经给出模型地址故应该给null或者undefined)、预训练模型的地址、预训练模型的源文件信息(地址和信息来源于刚刚安装的语言识别依赖):
模型包含的可识别单词:通过识别器的wordLabels方法可以得知目前可以识别的单词同时我们通过javascript自带的slice方法截取掉前面无意义的两个单词,并且把剩下可以识别的单词作为标签即输出。
3.3模型预测
经过上面的步骤之后就已经完成了加载预训练模型,同时获得了模型的标签,接下来就可以通过监听用户麦克风的输入即特征来进行语音识别了。
监听用户麦克风:这个可以通过H5实现,但是识别器通过了listen方法也可以让开发者监听。需要获得用户输入对应词汇表中每个单词对应的符合程度,并且获取其中符合程度最高的单词,这个单词就是根据用户输入的语音识别得到的,将这个单词打印并显示到页面: 识别频率和准确度:由于上述方法实现的语音识别过于频繁且正确率较低,而listen方法不仅可以传入一个回调函数为参数,还可以传入一个配置对象,所以可在它的后面加一个配置对象。该对象包括overlapFactor负责控制识别器对光谱图进行预测的频率,值越大则识别的频率越快(默认为0.5);probabilityThreshold通过定义一个阀值,根据是否超过阀值决定是否调用回调函数来负责控制识别的准确度,值越大则越能减少杂音的干扰但是同时对发音要求也会提高:
通过设置配置对象即调整超参数[7]后准确率有了较大提升,基本上可以符合使用的要求,但是偶尔也会出现识别错误的情况,这个是有多个原因造成的,例如用户麦克风输入时的杂音、用户发音不准等。那么到这里就已经完成了这个语音识别模型的使用。
4 预训练模型的引入与测评
4.1 模型引入
目前已经完成了模型逻辑的编写,接下来还需要在页面中引入该模型,由于整个预训练模型的使用已经整合成一个javascript文件,所以可以新建一个html文件引入它,并且利用css对样式做出一定的美化(空白的单词卡片):
另外在逻辑文件夹中也需要先获取页面的DOM将数据文件中的每一个数据通过遍历置换为一个个div标签并在页面中展示。
整体的静态页面效果如下:
4.2 模型优化
接下来需要对监听用户麦克风并且获取到的对应单词的提示进行优化,修改该部分的代码,获取对应单词的索引然后遍历数据找到对应的单词修改其背景色(变为蓝色单词卡片):
4.3 模型效果测评
接下来在浏览器上对该模型进行测试,效果如下:
累计语音输入为100次;
正确且及时识别次数为83次;
超前识别次数为7次;
错误识别次数为6次;
无法识别次数为4次;
正确识别率为83%;
通过以上测试数据可知,语音识别的正确率较高但是仍然存在识别不出和无语音输入却提前识别的情况。
关于语音识别不出的情况,笔者测试的环境较为封闭,但是仍然存在一些杂音,导致有特征输入而无标签输出,可以通过调整前文提及的probabilityThreshold超参数,这里修改为0.9。
关于超前识别的情况,无特征输入却有标签输出,且与上次特征输入的间隔较小,故可以判断是模型识别语音过于频繁,可以调整overlapFactor属性改善,这里修改为0.3后继续测试。
优化后重新测试的结果如下:
累计语音输入为100次;
正确且及时识别次数为97次;
超前识别次数为0次;
错误识别次数为1次;
无法识别次数为2次;
正确识别率为97%;
通过以上的测试数据可知,正确率已经得到了较大的提升,只存在因为特殊情况导致无法识别和识别错误,基本沒有出现超前识别的情况。
至此就完成了模型在页面的引入和使用,以及通过调整参数进行一定程度的优化来提高准确率。
5 结语
综上可得,基于预训练模型可以很容易的进行引入和使用,可以更快的投入到实际的生产使用,但需要程序员熟练的掌握优化思路与技巧。
TensorFlow.js的功能非常强大,本文仅介绍了它其中的一个在英文语音识别的应用方面,对如何利用预训练模型解决更加复杂的问题有一定的参考意义。更多的应用如迁移学习、过拟合与欠拟合、Python与javascript之间模型的转换等等[8]限于篇幅并没有提及,后续将继续探索TensorFlow.js在各方面应用的途径。
参考文献:
[1] 袁文翠,孔雪.基于TensorFlow深度学习框架的卷积神经网络研究[J].微型电脑应用,2018,34(2):29-32.
[2] 李康化,姜姗.机器学习与文化生产变革——基于AI技术发展视角[J].湘潭大学学报(哲学社会科学版),2020,44(1):74-79.
[3] Google TensorFlow 机器学习框架介绍和使用[EB/OL].(2015-12-15) [2016-11-25]http://blog.csdn.net/sinat_31628525/article/details/50320817.
[4] 张俊,李鑫.TensorFlow平台下的手写字符识别[J].电脑知识与技术,2016,12(16):199-201.
[5] 章敏敏,徐和平,王晓洁,等.谷歌TensorFlow机器学习框架及应用[J].微型机与应用,2017,36(10):58-60.
[6] 纪守领,李进锋,杜天宇,等.机器学习模型可解释性方法、应用与安全研究综述[J].计算机研究与发展,2019,56(10):2071-2096.
[7] Daniel Smilkov,Nikhil,等.TensorFlow.js: Machine Learning for the Web and Beyond[J].Mathematical Software,2019(2):1.
[8] 周志华.机器学习[M].北京:清华大学出版社,2016.
【通联编辑:梁书】