如今,语音服务(例如 Apple Siri,Amazon Alexa,Google Assistant 和 Google Translate)已变得越来越流行,因为语音是我们在某些情况下查找信息或完成任务的最自然和有效的方法。 这些语音服务中的许多服务都是基于云的,因为用户语音可能会很长而且很自由,并且**自动语音识别**(**ASR**)非常复杂,并且需要大量的计算能力。 实际上,得益于深度学习的突破,仅在最近几年,在自然和嘈杂的环境中 ASR 才变得可行。
但是在某些情况下,能够离线识别设备上的简单语音命令是有意义的。 例如,要控制 Raspberry-Pi 驱动的机器人的运动,您不需要复杂的语音命令,不仅设备上的 ASR 比基于云的解决方案还快,而且即使在没有网络访问的环境。 设备上的简单语音命令识别还可以通过仅在发出某些明确的用户命令时才向服务器发送复杂的用户语音来节省网络带宽。
但是在某些情况下,能够离线识别设备上的简单语音命令是有意义的。 例如,要控制 Raspberry-Pi 驱动的机器人的运动,您不需要复杂的语音命令,不仅设备上的 ASR 比基于云的解决方案还快,而且即使在没有网络访问的环境。 设备上的简单语音命令识别还可以通过仅在发出某些明确的用户命令时才向服务器发送复杂的用户语音来节省网络带宽。
在本章中,我们将首先概述 ASR 技术,涵盖基于最新的深度学习系统和顶级开源项目。 然后,我们将讨论如何训练和重新训练 TensorFlow 模型,以识别简单的语音命令,例如`"left", "right", "up", "down", "stop", "go"`。 接下来,我们将使用训练有素的模型来构建一个简单的 Android 应用程序,然后再构建两个完整的 iOS 应用程序,一个由 Objective-C 实现,另一个由 Swift 实现。 在前两章中我们没有介绍使用 TensorFlow 模型的基于 Swift 的 iOS 应用,而本章是回顾和加强我们对构建基于 Swift 的 TensorFlow iOS 应用的理解的好地方。
@@ -547,7 +547,7 @@ No OpKernel was registered to support Op 'FIFOQueueV2' with these attrs. Registe
图 9.3:显示 GAN 模型选择和生成的手写数字结果
这些数字看起来很像真实的人类手写数字,都是在训练了基本 GAN 模型之后完成的。 如果您返回并查看进行训练的代码,并且停下来思考一下 GAN 的工作原理,一般来说,则生成器和判别器如何相互竞争,以及尝试达到稳定的纳什均衡状态,在这种状态下,生成器可以生成区分器无法分辨出真实还是伪造的真实假数据,您可能会更欣赏 GAN 的魅力。
这些数字看起来很像真实的人类手写数字,都是在训练了基本 GAN 模型之后完成的。 如果您返回并查看进行训练的代码,并且停下来思考一下 GAN 的工作原理,一般来说,则生成器和判别器如何相互竞争,以及尝试达到稳定的纳什均衡状态,在这种状态下,生成器可以生成区分器无法分辨出真实还是伪造的真实假数据,您可能会更欣赏 GAN 的魅力。
`download_models.sh` will download a zip file that contains the `mobilenet_quant_v1_224.tflite` model file and `labels.txt` label file, then copy them to the simple/data and camera/data directories. Notice that somehow this script is not included in the official TensorFlow 1.5.0 and 1.6.0 releases. You'll need to do `git clone https://github.com/tensorflow/tensorflow` and clone the latest source (as of March 2018) to get it.
但是至少到目前为止,对于使用 TensorFlow 或 Keras 构建的自定义复杂模型,很可能您将无法成功进行 TensorFlow Lite 转换,因此您应该继续使用 TensorFlow Mobile,如前几章所述现在,除非您致力于使它们与 TensorFlow Lite 一起使用,并且不介意帮助添加更多由 TensorFlow Lite 支持的操作-毕竟 TensorFlow 是一个开源项目。
但是至少到目前为止,对于使用 TensorFlow 或 Keras 构建的自定义复杂模型,很可能您将无法成功进行 TensorFlow Lite 转换,因此您应该继续使用 TensorFlow Mobile,如前几章所述。现在,除非您致力于使它们与 TensorFlow Lite 一起使用,并且不介意帮助添加更多由 TensorFlow Lite 支持的操作-毕竟 TensorFlow 是一个开源项目。
在完成 TensorFlow Lite 的介绍之前,我们将看一下如何在 Android 中使用 TensorFlow Lite。
1. 创建一个新的 Android Studio 项目,并将应用命名为`HelloTFLite`。 将最低 SDK 设置为 API 15:Android 4.0.3,并接受所有其他默认设置。
2. 创建一个新的`assets`文件夹,从演示应用程序`tensorflow/contrib/lite/java/demo/app/src/main/assets`文件夹中拖放`mobilenet_quant_v1_224.tflite` TensorFlow Lite 文件和`labels.txt`文件,以及测试图像到 HelloTFLite 应用程序的`assets`文件夹中。
2. 创建一个新的`assets`文件夹,从演示应用程序`tensorflow/contrib/lite/java/demo/app/src/main/assets`文件夹中拖放`mobilenet_quant_v1_224.tflite` TensorFlow Lite 文件和`labels.txt`文件,以及测试图像到 HelloTFLite 应用程序的`assets`文件夹中。
3. 将`ImageClassifier.java`文件从`tensorflow/contrib/lite/java/demo/app/src/main/java/com/example/android/tflitecamerademo`文件夹拖放到 Android Studio 中的 HelloTFLite 应用。 `ImageClassifier.java`包含使用 TensorFlow Lite Java API 加载和运行 TensorFlow Lite 模型的所有代码,我们将在稍后详细介绍。
*[16GB MicroSD 和适配器](https://www.amazon.com/gp/product/B00TDBLTWK),价格约为 10 美元,用于存储 Raspbian(Raspberry Pi 的官方操作系统)的安装文件,并用作安装后的硬盘驱动器。
*[16GB MicroSD 和适配器](https://www.amazon.com/gp/product/B00TDBLTWK),价格约为 10 美元,用于存储 Raspbian(Raspberry Pi 的官方操作系统)的安装文件,并用作安装后的硬盘驱动器。
* 一个 USB 磁盘,例如 [SanDisk 32GB USB Drive](https://www.amazon.com/gp/product/B008AF380Q),售价 9 美元,将用作交换分区(有关详细信息,请参阅下一节) 因此我们可以手动构建 TensorFlow 库,这是构建和运行 TensorFlow C++ 代码所必需的。
* 售价 110 美元的 [GoPiGo 机器人基础套件](https://www.amazon.com/gp/product/B00NYB3J0A)或[官方网站](https://www.dexterindustries.com/shop),将 Raspberry Pi 板变成可以移动的机器人。
...
...
@@ -58,7 +58,7 @@
1. 为 Windows 或 Mac 下载并安装 [SD 格式化程序](https://www.sdcard.org/downloads/formatter_4/index.html)。
2. 使用 SD 格式化程序格式化 MicroSD 卡。
3. 在[这个页面](https://www.raspberrypi.org/downloads/noobs)上下载 Raspbian 的官方简易安装程序 New Out Of Box Software(NOOBS)的离线 ZIP 版本,将其解压缩,然后拖动并 将提取的`NOOBS`文件夹中的所有文件拖放到格式化的 MicroSD 卡中。
3. 在[这个页面](https://www.raspberrypi.org/downloads/noobs)上下载 Raspbian 的官方简易安装程序 New Out Of Box Software(NOOBS)的离线 ZIP 版本,将其解压缩,然后将提取的`NOOBS`文件夹中的所有文件拖放到格式化的 MicroSD 卡中。
现在弹出 MicroSD 卡并将其插入 Raspberry Pi 板上。 将显示器的 HDMI 电缆以及 USB 键盘和鼠标连接到开发板上。 用电源为开发板供电,然后按照屏幕上的步骤完成 Raspbian 的安装,包括设置 Wifi 网络。 整个安装过程不到一个小时即可完成。 完成后,您可以打开一个终端并输入`ifconfig`来查找电路板的 IP 地址,然后从您的计算中使用`ssh pi@<board_ip_address>`来访问它,正如我们稍后将要看到的,这确实很方便并且需要 在移动中测试控制 Raspberry Pi 机器人-当移动时,您不想或不能将键盘,鼠标和显示器与板子一起使用。
在之前的章节中,我们主要使用 Python 训练和测试 TensorFlow 模型,然后再使用本机 TensorFlow C++ 库的 Java 接口代码在使用 C++ 或 Android 的 iOS 中运行模型。 在 Raspberry Pi 上,您可以选择直接使用 TensorFlow Python API 或 C++ API 在 Pi 上运行 TensorFlow 模型,尽管通常仍会在功能更强大的模型上进行训练 电脑。 有关完整的 TensorFlow Python API 文档,请参见[这里](https://www.tensorflow.org/api_docs/python)。
在之前的章节中,我们主要使用 Python 训练和测试 TensorFlow 模型,然后再使用本机 TensorFlow C++ 库的 Java 接口代码在使用 C++ 或 Android 的 iOS 中运行模型。 在 Raspberry Pi 上,您可以选择直接使用 TensorFlow Python API 或 C++ API 在 Pi 上运行 TensorFlow 模型,尽管通常仍会在功能更强大的电脑上训练模型。 有关完整的 TensorFlow Python API 文档,请参见[这里](https://www.tensorflow.org/api_docs/python)。
要使用 GoPiGo Python API 使机器人根据您的语音命令移动,请首先在`listen.py`中添加以下两行:
请注意,`kernel`只是权重的另一个名称,`(4, 4)`,`(4, )`,`(4, 1)`和`(1, )`是权重的形状和对第一个(输入到隐藏)和第二层(隐藏到输出)。 如果您从 iPython 多次运行脚本,则`tf`对象的默认图形将包含先前运行的可训练变量,因此,除非调用`tf.reset_default_graph()`,否则需要使用`gvs = [(g, v) for g, v in gvs if g != None]`删除那些过时的训练变量, 将返回 None 渐变(有关`computer_gradients`的更多信息,请参见[这里](https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer#compute_gradients))。
请注意,`kernel`只是权重的另一个名称,`(4, 4)`,`(4, )`,`(4, 1)`和`(1, )`是权重的形状和对第一个(输入到隐藏)和第二层(隐藏到输出)。 如果您从 iPython 多次运行脚本,则`tf`对象的默认图形将包含先前运行的可训练变量,因此,除非调用`tf.reset_default_graph()`,否则需要使用`gvs = [(g, v) for g, v in gvs if g != None]`删除那些过时的训练变量, 将返回 None 渐变(有关`computer_gradients`的更多信息,请参见[这里](https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer#compute_gradients))。