PC
首先要确认已经安装好TensorFlow。 鉴于脚本需要下载超过1GB的训练数据,你要保证处于满格的WIFI环境(土豪4G流量请随意,不过土豪有来学程序的吗?),计算机清理出足够的空间。整个训练过程需要花费几个小时,所以最好有个妹子陪着,聊聊人类被AI统治之后的爱情。
开始训练,在TensorFlow的source tree下运行: python tensorflow/examples/speech_commands/train.py 脚本首先下载 Speech Commands dataset由65000个WAVE语音音频文件组成,包括30个词条。数据是由Google采集并发布的,受 CC BY license保护,你也可以帮助补充这个数据集,通过 contributing five minutes of your own voice. 目录超过1GB,下载需要花点时间,你能够看到过程提醒,完成之后,以后就不用再执行这个步骤。下载完成,你可以看到如下的信息提示:I0730 16:53:44.766740 55030 train.py:176] Training from step: 1 I0730 16:53:47.289 train.py:217] Step #1: rate 0.001000, accuracy 7.0%, cross entropy 2.611571表示初始化过程完成,训练循环开始。你可以看到每一步训练的输出信息。在此说明: Step #1 表明处于训练循环的第一步。在本案例中,总共有18,000步,所以你可以通过Step的数字了解到离完成还有多远。 rate 0.001000表示学习率,用来控制网络模型权重的更新速度。开始的时候学习率是一个比较高的值(0.01),在后面的训练周期大约下降10倍,到0.0001。
安卓应用中运行模型想要了解模型是如何在一个真实的应用中运行,最快捷的办法是去下载the prebuilt Android demo applications并在手机上安装。你可以看到“TF Speech”出现在应用列表,打开它,可以看到模型中训练过的词条列表,从“yes”和“no”开始。授权麦克使用权限之后,你可以尝试读出词条,UI中会对应高亮该词,说明模型进行了识别。用户也可以构建自己的应用,开源代码在available as part of the TensorFlow repository on github. 默认情况下,从tensorflow.org下载一个未训练的模型a pretrained model from tensorflow.org,,然后可以轻松地替换成你自己训练好的模型,这么做之前,要确认 the main SpeechActivity Java source file中 SAMPLE_RATE 和 SAMPLE_DURATION此类常量与你训练时所做改动相匹配。还提供一个类似C++的Java版本的模型如果之前调整了参数,你也可以在SpeechActivity 中更新以得到同样的测试结果。拷贝标签文本文件到固定的graph中,Demo应用自动更新UI列表。这样可以轻松的尝试不同的模型而无需更改代码。若改变路径,你需要更新LABEL_FILENAME 和 MODEL_FILENAME 指定你添加的文件。
模型如何工作本教程中的架构基于论文Convolutional Neural Networks for Small-footprint Keyword Spotting不代表当前最新最高的技术水准,好处在于相对简单,训练速度快,易于理解。有很多方法构建一个语音识别的神经网络,比如recurrent networks和dilated (atrous) convolutions 本教程基于卷积神经网络,有过图像识别研究的人对此会非常熟悉。然而语音数据本质上是连续的一维信号,而不是2维空间的问题,采用卷积神经网络看起来不合情理。解决这个问题,我们定义一个时间窗,将时间窗内的语音信号转换为一个图像。具体办法是把若干输入音频采样组合成几秒长度的短片段,计算带宽范围内的强度和频率。每个片段的频率、强度被看做数字向量,这些向量再被组织成2维矩阵。矩阵的值也就是频谱,可以被看做是单色图像。要了解音频采样如何被组织成图片,可以运行 wav_to_spectrogram 工具: bazel run tensorflow/examples/wav_to_spectrogram:wav_to_spectrogram -- \ --input_wav=/tmp/speech_dataset/happy/ab00c4b2_nohash_0.wav \ --output_png=/tmp/spectrogram.png
识别命令流准确率工具采用一个small C++类中包含的简单解码器RecognizeCommands,这个类实时提供TensorFlow模型运行的输出, 它平均信号,在有足够证据表明发现一个被识别的词条时提供标签信息。这个实现非常小,只需要跟踪最新的几个预测并且取平均,所以很容易和其他平台以及语言接口对接。举个例子,很多时候在用java在安卓上或者Python在Raspberry上开发一些彼此类似的工作。只要他们的实现的部分使用同样的逻辑,你就可以调节参数用控制流测试工具控制均值,然后转换到你的应用以得到相似的结果。
如果看不懂,请教专业人员。