用 TensorFlow 创建自己的 Speech Recognizer
参考资料 源码请点:https://github.com/llSourcell/tensorf...
语音识别无处不在,siri,google,讯飞输入法,讯飞语记,智能家居,车,etc。 每天都在用的,很好奇它是怎么实现的,今天来看看这么便利的东东到底是什么样子呢。
进化史
最开始的 speech recognizer 只能识别 0-9 这几个数字,说别的单词是识别不了滴。
后来有一个叫做 DARPA 的梦想家 team 孜孜不倦地研究。
他们用 15000 个节点代表可能的发音,然后用暴力搜索 brute force search 算法来找到节点对应的文字。
后来 IBM 用 Hidden Markov Model 来预测每个点最大概率可能表示的文字。
再后来人们尝试用 NN 神经网络来做这个任务,但是很长时间没太大进展,直到 深度学习之父 Geoffrey Hinton 研究出个 Deep Learning 模型,语音识别的效果显著提高。
Yours ~~
像 Siri,Google 一样,现在我们来看看怎样用 TensorFlow 创建自己的 Speech Recognizer ,来识别数字吧。
Steps:
- 导入库
- 定义参数
- 导入数据
- 建立模型
- 训练模型并预测
1. 导入库
需要用到 tflearn,这是建立在 TensorFlow 上的高级的库,可以很方便地建立网络。 还会用到辅助的类 speech_data,用来下载数据并且做一些预处理。
from __future__ import division, print_function, absolute_import
import tflearn
import speech_data
import tensorflow as tf
2. 定义参数
learning rate 是在更新权重的时候用,太高可以很快,但是loss大,太低较准但是很慢。
learning_rate = 0.0001
training_iters = 300000 # steps
batch_size = 64
width = 20 # mfcc features
height = 80 # (max) length of utterance
classes = 10 # digits
3. 导入数据
用 speech_data.mfcc_batch_generator 获取语音数据并处理成批次,然后创建 training 和 testing 数据。
batch = word_batch = speech_data.mfcc_batch_generator(batch_size)
X, Y = next(batch)
trainX, trainY = X, Y
testX, testY = X, Y #overfit for now
4. 建立模型
接下来,用什么模型呢? speech recognition 是个 many to many 的问题。
eg,speech recognition
eg,image classification
eg,image caption
eg,sentiment analysis
所以我们用 Recurrent NN 。
通常的 RNN ,它的输出结果是受整个网络的影响的。
而 LSTM 比 RNN 好的地方是,它能记住并且控制影响的点。所以这里我们用 LSTM。
每一层到底需要多少个神经元是没有规定的,太少了的话预测效果不好,太多了会 overfitting,这里我们取普遍的 128.
为了减轻过拟合的影响,我们用 dropout,它可以随机地关闭一些神经元,这样网络就被迫选择其他路径,进而生成想对 generalized 模型。
接下来建立一个 fully connected 的层,它可以使前一层的所有节点都连接过来,输出 10 类,因为数字是 0-9,激活函数用 softmax,它可以把数字变换成概率。
最后用个 regression 层来输出唯一的类别,用 adam 优化器来使 cross entropy 损失达到最小。
# Network building
net = tflearn.input_data([None, width, height])
net = tflearn.lstm(net, 128, dropout=0.8)
net = tflearn.fully_connected(net, classes, activation='softmax')
net = tflearn.regression(net, optimizer='adam', learning_rate=learning_rate, loss='categorical_crossentropy')
5. 训练模型并预测
然后用 tflearn.DNN 函数来初始化一下模型,接下来就可以训练并预测,最后再保存训练好的模型。
# Training
### add this "fix" for tensorflow version errors
col = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)
for x in col:
tf.add_to_collection(tf.GraphKeys.VARIABLES, x )
model = tflearn.DNN(net, tensorboard_verbose=0)
while 1: #training_iters
model.fit(trainX, trainY, n_epoch=10, validation_set=(testX, testY), show_metric=True,
batch_size=batch_size)
_y=model.predict(X)
model.save("tflearn.lstm.model")
print (_y)
print (y)
模型训练需要一段时间,一边碎觉一边等着模型出炉吧。? ? ? ?
- 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)
- 【专知中秋呈献-PyTorch手把手深度学习教程03】LSTM快速理解与PyTorch实现: 图文+代码
- BZOJ 3098: Hash Killer II(新生必做的水题)
- [接口测试 - 基础篇] 04 无法绕过的json解析
- 【专知-PyTorch手把手深度学习教程02】CNN快速理解与PyTorch实现: 图文+代码
- [接口测试 - 基础篇] 03 unittest测试框架了解多少才够?
- 关关的刷题日记09——Leetcode 80. Remove Duplicates from Sorted Array II
- [linux][kernel]dump kmsg到文件系统中
- [接口测试 - 基础篇] 12 还是要掌握python日志管理模块的
- Spring整合Quartz分布式调度
- [接口测试 - 基础篇] 11 掌握下python解析YAML格式也是需要的
- 如何用Python创建眼下火爆的区块链?这篇干货请收藏
- [接口测试 - 基础篇] 10 别啊,还有INI格式呢,别忘记我
- [接口测试 - 基础篇] 09 其实吧,读写csv格式也是要掌握的
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ViewPager打造轮播图Banner/引导页Guide
- Android 实现带字母索引的侧边栏功能
- Android实现简单底部导航栏 Android仿微信滑动切换效果
- Android中Handler与Message的简单实例
- Android 实现通知消息水平播放、无限循环效果
- 详解xamarin Android 实现ListView万能适配器
- android 设置wallpaper的操作方法
- R语言作图不显示中文解决办法,如何使用中文字体
- Android OKHTTP的单例和再封装的实例
- Android 自定义返回按钮的实例详解
- Android在layout xml中使用ViewStub完成动态加载问题
- Android编程中Intent实现页面跳转功能详解
- Android编程之桌面小部件AppWidgetProvider用法示例
- Android编程实现悬浮窗获取并显示当前内存使用量的方法
- Android ListView中动态添加RaidoButton的实例详解