在 OpenHarmony 上跑通 tflite_web:WASM 推理适配要点
在 OpenHarmony 上用 Flutter Web 做混合应用时,端侧 AI 推理通常会考虑原生 MindSpore Lite,但如果手里已经有一堆 TFLite 模型,又不想做模型转换,tflite_web 提供了一个基于 WebAssembly 的轻量方案。它的原理是把 TFLite 推理引擎编译成 WASM,通过 JS 互操作与 Flutter 通信,利用 Webview 的 WebGL 或 WebGPU 后端做张量加速。
我最近在鸿蒙 Web 容器里跑通了基本的推理流程,这里记录一些适配细节和坑。
整体流程
调用流程大致是这样的:由 Flutter Web 层发起推理请求,经过 tflite_web 接口,将模型和数据交给 JS 侧的 tflite-wasm,WASM 执行内核利用 SIMD 优化,最终在鸿蒙 Webview 的 GPU 加速下完成张量计算,结果返回 UI 展示。
选择这个方案是因为:
- 已有的
.tflite模型可以直接用,不用再走模型转换。 - 同一套推理逻辑在鸿蒙、Android、iOS 以及 PC 浏览器上行为一致,适合多端项目。
- 推理跑在 Web 独立线程,不占 UIAbility 主线程,响应不会卡顿。
基础适配
鸿蒙 Webview 基于 Chromium 内核,对 WASM 的支持是内置的,所以 tflite_web 可以直接用。pubspec.yaml 里加上依赖就行:
dependencies:
tflite_web: ^0.1.0-alpha
模型加载
加载 .tflite 模型时,优先走本地资源,避免从 CDN 动态下载。模型文件放在 web/assets 目录下。
import 'package:tflite_web/tflite_web.dart';
Future<TFLiteModel> loadModel() async {
final model = await TFLiteModel.fromAsset(
'assets/mobilenet.tflite',
tfLiteLibUrl: 'https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-tflite/dist/',
);
return model;
}
上面的 tfLiteLibUrl 虽然指向 CDN,但初始化时实际上可以替换成本地路径,后面安全部分会提到。
图像推理
对图像做分类推理时,需要把图片数据构造成张量。下面是一个示例:
import 'package:tflite_web/tflite_web.dart';
Future<void> runInference(TFLiteModel model, List<num> inputData) async {
// inputData 是一维或高维数组,这里假定是 [1, 224, 224, 3] 的输入
final inputTensor = TFLiteTensor(inputData, [1, 224, 224, 3]);
final outputs = await model.predict(inputTensor);
final resultData = outputs.first.data as List<num>;
// 处理 resultData...
}
我试过的两个场景
实时 OCR 区域提取
在鸿蒙 Webview 页面里,从 Canvas 拿到像素数据,塞进模型,输出文字区域坐标。
void startScanFrame(TFLiteModel model, CanvasRenderingContext2D ctx) {
final imageData = ctx.getImageData(0, 0, 224, 224).data;
model.predict(TFLiteTensor(imageData, [1, 224, 224, 4])).then((outputs) {
_drawOverlay(outputs.first.data);
});
}


