2. 唤醒词技术基础
做嵌入式AI部署,最怕什么?
不是模型精度不够,也不是算法太复杂。最怕的是环境没搭好,折腾两天连个Hello World都跑不起来。我见过太多新手卡在这一步,信心直接被磨没了。
所以这一章,咱们把话说清楚。Python环境怎么配,推理引擎怎么装,交叉编译链怎么选,开发板怎么连。每一步我都会告诉你——哪些坑我踩过,哪些坑你完全可以绕过去。
本章核心目标:在一台普通x86电脑上,搭建一套完整的唤醒词模型部署环境。从Python到C++,从模拟到真机,一条龙打通。
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章的实践你都会很顺畅。