CEVA 如何使用 TensorFlow Lite 在边缘实现始终开启的语音识别
2020 年 10 月 16 日

由 CEVA 的 Ido Gus 撰写的一篇客座文章

CEVA 是无线连接和智能传感技术的领先授权商。我们的产品帮助 OEM 设计适用于各种终端市场的节能、智能和互联设备,包括移动、消费、汽车、机器人、工业和物联网。

在本文中,我们将介绍我们如何使用 面向微控制器的 TensorFlow Lite (TFLM) 来部署一个名为 WhisPro 的语音识别引擎和前端,它运行在基于我们 CEVA-BX DSP 核心 的裸机开发板上。WhisPro 在设备上高效地检测始终开启的 唤醒词 和语音命令。

图 1 CEVA 多麦克风 DSP 开发板

关于 WhisPro

WhisPro 是一款语音识别引擎和前端,面向低功耗、资源受限的边缘设备运行。它旨在处理从处理音频样本到检测的整个数据流。

WhisPro 支持边缘设备的两种用例

  • 始终开启的唤醒词检测引擎。在这种用例中,WhisPro 的作用是在检测到预定义短语时唤醒处于睡眠模式的设备。
  • 语音命令。在这种用例中,WhisPro 的作用是启用语音接口。用户可以使用语音控制设备。常见的命令可以是:音量调高、音量调低、播放、停止等。

WhisPro 使得集成 CEVA BX DSP 核心的任何 SoC 都能实现语音接口,降低了对希望加入语音接口革命的 OEM 和 ODM 的进入门槛。

我们的动机

最初,WhisPro 是使用一个名为 CEVA NN Lib 的内部神经网络库实现的。虽然该实现取得了出色的性能,但开发过程相当复杂。我们意识到,如果我们将 TFLM 运行时库移植到我们的目标硬件并进行优化,整个模型移植过程将变得透明且更加可靠(需要编写、修改和维护的代码行数将大大减少)。

为 CEVA-BX DSP 系列构建 TFLM

我们首先要弄清楚如何将 TFLM 移植到我们自己的平台。我们发现,遵循这个 移植到新平台指南 非常有用。
按照指南,我们

  • 验证了我们的平台支持 DebugLog() 实现。
  • 在 CEVA 的基于 Eclipse 的 IDE 中创建了一个 TFLM 运行时库项目
    • 在 CEVA 的 IDE 中创建了一个新的 CEVA-BX 项目
    • 将所有必需的源文件添加到项目中
  • 为 CEVA-BX 核心构建了 TFLM 运行时库。
    这需要对编译器标志进行通常的调整,包括路径(并非所有必需文件都在“micro”目录下)、链接器脚本等。

模型移植过程

我们的起点是模型的 Keras 实现。让我们来看看我们为将模型部署到裸机目标硬件所采取的步骤

使用 TF 内置转换器 将 TensorFlow 模型转换为 TensorFlow Lite

$ python3 -m tensorflow_docs.tools.nbfmt [options] notebook.ipynb

```
converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)
converter.experimental_new_converter = True
tflite_model = converter.convert()
open("converted_to_tflite_model.tflite", "wb").write(tflite_model)
```

使用 量化

$ python3 -m tensorflow_docs.tools.nbfmt [options] notebook.ipynb


```
converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.representative_dataset = representative_data_gen
```

使用 xxd 将 TensorFlow Lite 模型转换为 TFLM

$ python3 -m tensorflow_docs.tools.nbfmt [options] notebook.ipynb
  

```
$> xxd –I model.tflite > model.cc
```

Here we found that some of the model layers (for example, GRU) were not properly supported (at the time) by TFLM. It is very reasonable to assume that, as TFLM continues to mature and Google and the TFLM community invest more in it, issues like this will become rarer.
In our case, though, we opted to re-implement the GRU layers in terms of Fully Connected layers, which was surprisingly easy.

集成

下一步是将 TFLM 运行时库和转换后的模型集成到我们现有的嵌入式 C 前端中,该前端处理音频预处理和特征提取。

尽管我们的前端不是为 TFLM 而设计的,但它足够模块化,可以通过实现一个简单的包装函数来轻松集成,如下所示

  1. 将 TFLM 运行时库链接到我们的嵌入式 C 应用程序(WhisPro 前端)
  2. 实现一个包装-over-setup 函数,用于将模型映射到可用的数据结构,分配解释器和张量
  3. 实现一个包装-over-execute 函数,用于将从 WhisPro 前端传递的数据映射到实际 execute 函数使用的 tflite 张量
  4. 将对原始模型 execute 函数的调用替换为对 TFLM 实现的调用

过程可视化

我们描述的过程由两个组件执行

  • 微控制器供应商,在本例中是 CEVA - 负责针对其硬件架构优化 TFLM。
  • 微控制器用户,在本例中是 CEVA WhisPro 开发人员 - 负责使用优化的 TFLM 运行时库,在目标微控制器上部署基于神经网络的模型。

接下来

这项工作证明了 TFLM 平台对我们的重要性,以及支持 TFLM 可以为我们的客户和合作伙伴带来的巨大价值,它使他们能够在边缘设备上轻松部署神经网络模型。我们致力于通过以下方式进一步支持 CEVA-BX DSP 系列上的 TFLM

  • 积极参与 TFLM 项目,目标是提高层覆盖率和整体平台成熟度。
  • 投资于 TFLM 算子优化,以便在 CEVA-BX 核心上执行,目标是实现全覆盖。

最后的想法

虽然移植过程遇到了一些障碍,但最终还是取得了巨大成功,大约花了 4-5 天的时间。从头开始用 C 实现一个模型,并手工制作从 Python 到 C 的模型转换脚本,可能需要 2-3 周的时间(以及大量的调试)。

CEVA 技术虚拟研讨会

要了解更多信息,欢迎观看 CEVA 的虚拟研讨会 - 无线音频会议,内容涵盖 TFLM 以及其他主题。

下一篇文章
How CEVA uses TensorFlow Lite for Always-On Speech Recognition on the Edge

由 CEVA 的 Ido Gus 撰写的一篇客座文章 CEVA 是无线连接和智能传感技术的领先授权商。我们的产品帮助 OEM 设计适用于各种终端市场的节能、智能和互联设备,包括移动、消费、汽车、机器人、工业和物联网。在本文中,我们将介绍我们如何使用 面向微控制器的 TensorFlow Lite (TFLM) 来部署…