2. 唤醒词技术基础

做嵌入式AI部署,最怕什么?

不是模型精度不够,也不是算法太复杂。最怕的是环境没搭好,折腾两天连个Hello World都跑不起来。我见过太多新手卡在这一步,信心直接被磨没了。

所以这一章,咱们把话说清楚。Python环境怎么配,推理引擎怎么装,交叉编译链怎么选,开发板怎么连。每一步我都会告诉你——哪些坑我踩过,哪些坑你完全可以绕过去。

本章核心目标:在一台普通x86电脑上,搭建一套完整的唤醒词模型部署环境。从Python到C++,从模拟到真机,一条龙打通。

环境搭建知识体系 主机开发环境 (x86 Ubuntu 20.04) 软件栈 Python 3.8 + venv TensorFlow Lite ONNX Runtime 工具链 ARM GCC (gcc-arm-none-eabi) QEMU 模拟器 开发板驱动 目标硬件:ARM Cortex-M / Cortex-A

2.1 Python环境配置

Python版本怎么选?我个人习惯用Python 3.8。为什么?因为TensorFlow Lite和ONNX Runtime对3.8的支持最稳定。3.9以上也能用,但有些老版本的算子库可能不兼容。你想想看,为了追新版本多花两天排查问题,不值当。

我建议用虚拟环境。别图省事直接装系统级Python包,后面项目多了会乱成一锅粥。

我的习惯:每个项目一个独立的venv,包版本锁死。这样换机器、换项目,直接pip freeze导出,干净利落。

# 安装Python 3.8(Ubuntu 20.04自带)
sudo apt update
sudo apt install python3.8 python3.8-venv python3.8-dev

# 创建项目虚拟环境
python3.8 -m venv wakeup_env

# 激活环境
source wakeup_env/bin/activate

# 升级pip
pip install --upgrade pip

# 验证
python --version   # 确保输出 Python 3.8.x

嗯,这里要注意。如果你用的是Windows,venv激活命令是 wakeup_env\Scripts\activate。但说实话,做嵌入式AI开发,我强烈建议你用Linux。不是Windows不好,是很多交叉编译工具链在Linux下才有一等支持。

2.2 TensorFlow Lite 安装

TensorFlow Lite有两种安装方式。一种是装完整的TensorFlow,然后取TFLite模块。另一种是只装TFLite解释器,轻量很多。做部署验证,我推荐后者。

# 方式一:安装完整TensorFlow(不推荐,包太大)
pip install tensorflow==2.10.0

# 方式二:仅安装TFLite Runtime(推荐)
pip install tflite-runtime==2.10.0

为什么推荐tflite-runtime?我在项目里吃过亏。完整TensorFlow依赖一大堆库,在ARM开发板上根本装不上。而tflite-runtime只有几百KB,交叉编译也方便。

避坑指南:我曾经因为版本没对齐,在x86上转换好的.tflite模型,放到开发板上推理结果全错。后来发现是TFLite Runtime版本和转换时用的TensorFlow版本不一致。记住:转换用哪个版本的TensorFlow,部署就用哪个版本的tflite-runtime。

验证安装是否成功:

python -c "import tflite_runtime.interpreter as tflite; print('TFLite version:', tflite.__version__)"

2.3 ONNX Runtime 安装

ONNX Runtime的优势是什么?跨框架。你从PyTorch导出的模型,转成ONNX格式,用ORT跑,不需要装PyTorch。这在资源受限的嵌入式设备上太香了。

# 安装ONNX Runtime(CPU版本)
pip install onnxruntime==1.14.0

# 如果需要GPU加速(x86开发机上用)
pip install onnxruntime-gpu==1.14.0

验证:

python -c "import onnxruntime as ort; print('ORT version:', ort.__version__)"

小经验:ONNX Runtime的CPU版本在ARM Cortex-A上也能跑,但需要自己编译。别怕,后面章节我会手把手带你走一遍。

2.4 交叉编译工具链:ARM GCC

交叉编译是什么?说白了,就是在你的x86电脑上编译出能在ARM芯片上跑的程序。你想想看,开发板那点算力,编译个Linux内核得等到天荒地老。所以我们在PC上编译好,再把二进制文件丢到板子上跑。

ARM GCC有两个主流版本:

工具链 适用目标 安装方式
gcc-arm-none-eabi Cortex-M系列(裸机/RTOS) apt install gcc-arm-none-eabi
gcc-arm-linux-gnueabihf Cortex-A系列(Linux系统) apt install gcc-arm-linux-gnueabihf

我们的唤醒词模型,如果部署在Cortex-M4/M7这类MCU上,用前者。如果部署在树莓派这类Linux板子上,用后者。

# 安装Cortex-M系列工具链
sudo apt install gcc-arm-none-eabi

# 验证
arm-none-eabi-gcc --version

# 安装Cortex-A系列工具链
sudo apt install gcc-arm-linux-gnueabihf

# 验证
arm-linux-gnueabihf-gcc --version

注意:我曾经在Ubuntu 22.04上装gcc-arm-none-eabi,默认版本是15.x,结果编译出来的二进制在Cortex-M4上跑不起来。后来换成13.x版本才解决。建议用 apt-cache policy gcc-arm-none-eabi 查看可用版本,锁定一个经过验证的版本。

2.5 模拟器与开发板准备

没有开发板怎么办?用QEMU模拟。QEMU可以模拟ARM Cortex-M3/M4、Cortex-A系列,甚至完整的树莓派。我在早期原型验证阶段,全靠QEMU撑场子。

# 安装QEMU
sudo apt install qemu-system-arm

# 验证
qemu-system-arm --version

# 测试:模拟一个STM32F4开发板
qemu-system-arm -M stm32f4-discovery -kernel your_firmware.bin

但模拟器终究是模拟器。有些外设行为、中断延迟、功耗特性,模拟器模拟不了。所以最终一定要上真机。

开发板怎么选?我列个清单:

开发板 核心 适用场景 参考价格
STM32F4 Discovery Cortex-M4 MCU端唤醒词推理 ¥100-200
树莓派4B Cortex-A72 Linux端唤醒词服务 ¥300-500
ESP32-S3 Xtensa LX7 低功耗唤醒词 ¥50-100

我个人建议:预算够的话,STM32F4 + 树莓派各一块。一个练MCU部署,一个练Linux部署。唤醒词模型在两种平台上都有用武之地。

连接开发板:一般用USB转串口或JTAG/SWD调试器。STM32用ST-Link,树莓派直接用SSH。记得装好驱动,Linux下通常免驱,Windows可能需要装驱动精灵。

2.6 环境验证:跑一个Hello World

环境搭没搭好,跑个例子就知道了。我们写一个最简单的TFLite推理程序:

# test_tflite.py
import numpy as np
import tflite_runtime.interpreter as tflite

# 创建一个简单的模型(1x4输入,全连接层)
# 这里用随机权重演示
interpreter = tflite.Interpreter(model_path="test_model.tflite")
interpreter.allocate_tensors()

input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

# 构造输入
input_data = np.array([[1.0, 2.0, 3.0, 4.0]], dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)

# 推理
interpreter.invoke()

# 获取输出
output_data = interpreter.get_tensor(output_details[0]['index'])
print("Inference result:", output_data)

如果这个程序能跑通,恭喜你,环境搭建成功了。如果报错,别慌。99%的问题出在:

  • Python版本不对(检查是不是3.8)
  • tflite-runtime版本和模型不匹配(检查版本号)
  • 模型路径不对(用绝对路径试试)

总结一下:环境搭建没有捷径,但可以少走弯路。Python用3.8 + venv,TFLite用tflite-runtime,ONNX Runtime用CPU版,ARM GCC选对版本,开发板先模拟再真机。这套组合拳打下来,后面30章的实践你都会很顺畅。