- 人工智能
- 语音
- 音频
【免费下载链接】react-native-executorch-fsmn-vad
react-native-executorch-fsmn-vad 仓库为 React Native ExecuTorch 提供了可直接运行的fsmn-vad 语音活动检测(VAD)端侧模型:XNNPACK 后端 fp32 构建,仅约1.83 MB,在 iPhone 16 上单次推理中位数耗时约1.5 ms。本文带你实测这个"小身材大能量"的.pte模型文件,并复盘 Core ML、MLX 后端被拒收的原因,以及"为什么不量化"的取舍逻辑。
📦 仓库里有什么?
仓库结构极简,四个核心文件各司其职:
| 文件 | 大小 | 作用 |
|---|---|---|
| config.json | 30 B | 仓库级元信息(模型名fsmn-vad) |
| xnnpack/fsmn_vad_xnnpack_fp32.pte | ~1.7 MB | 唯一发布的模型构建(XNNPACK / fp32) |
| xnnpack/config.json | 810 B | 模型 I/O 契约与能力声明 |
| coreml/NOTES.md / mlx/NOTES.md | 1.3 / 1.9 kB | 未发布后端的"拒收报告" |
上游模型来自 FunASR 项目的fsmn-vad,属于轻量级全卷积的语音活动检测模型——输入一段音频特征,输出每个时间片的人声概率。这类模型天然适合端侧:参数量小、推理快,正好匹配手机 App 的实时语音唤醒与说话人检测场景。
⚡ XNNPACK 后端实测:1.83 MB 与 1.5 ms
在xnnpack目录下,模型以 fp32 精度导出为 ExecuTorch 的.pte格式。根据 mlx/NOTES.md 中记录的对照实验(同一台 iPhone 16、同一 ExecuTorch 1.4.1 运行环境、同一输入):
| 后端 | 体积 | 实测结果 |
|---|---|---|
| xnnpack fp32 | 1.83 MB | 1.5 ms(中位数),输出正常 |
| mlx fp32 | 2.87 MB | 设备端执行失败 |
1.5 ms 是什么概念?一次推理只占 60 FPS 帧预算(约 16.7 ms)的 9% 左右——对端侧 VAD 而言,延迟基本可以忽略不计。
模型的输入输出契约在 xnnpack/config.json 中有明确声明:
- 输入:
[1000, 512]的float32张量(1000 帧 × 512 维音频特征) - 输出:
[1, 1000, 248]的float32张量(每帧 248 维隐状态)
这种"分块喂入"的设计正是 VAD 模型的低延迟关键:不需要整段音频,滑动窗口推一遍即可实时判断。
🚫 为什么 Core ML 和 MLX 没有发布?
这个仓库最有价值的部分,可能是两份"拒收报告"——它们记录了导出失败的真实原因,比任何教程都直白。
Core ML:CPU_AND_NE执行直接报错
根据 coreml/NOTES.md:
- 在
CPU_AND_NE计算单元下,fp16 与 fp32都在执行阶段报0x1错误,调整compute_unit无效; - 复测时特意清空了 Core ML 编译缓存(
~/Library/Caches/executorchcoreml)——因为陈旧缓存会悄悄返回旧的编译产物,伪装成测试通过,这是个很隐蔽的坑; CPU_ONLY模式可以跑通,但纯 CPU 的 Core ML 构建相对 XNNPACK 版没有任何加速优势,发布它毫无意义。
MLX:导出很干净,但设备端跑不起来
MLX 的失败更有意思(详见 mlx/NOTES.md):
- 模型导出顺利,只切分成3 个子图(对比之下,卷积视觉模型会碎成 28~50 片),lowering 质量相当健康;
- 但最终的
.pte在设备端执行时抛出Method 'forward' failed; - 两个算子没有成功降级:
aten.as_strided_copy(MLX 后端无处理器)、aten.clamp_(处理器注册了,但对Slot类型参数调用float()抛出TypeError)。
即便它跑通了也不该发布——2.87 MB,比 XNNPACK 版大 57%,性能却毫无收益。
🤔 量化取舍:为什么这里坚持 fp32?
新手常见疑问:模型既然已经很小了,为什么不做 int8 量化进一步瘦身?
答案是收益不成立。MLX 笔记中一针见血地指出:这个模型太小、太偏卷积,weight-only 量化(只量化权重、计算仍用浮点)帮不上忙:
- 1.83 MB 对 App 包体来说早已"不疼",量化省下的几百 KB 感知不明显;
- 小卷积模型的量化开销(反量化计算、kernel 效率损失)可能抵消体积收益;
- VAD 对时延极其敏感,fp32 下 1.5 ms 的余量才是核心竞争力。
所以仓库只发布了 fp32 一个变体——不是不想量化,而是量化无利可图。这是一个很实用的判断标准:量化前先问"体积还是延迟是瓶颈",VAD 这类模型通常都不是。
⚠️ 兼容性注意事项
根据 README.md:
- 这些
.pte文件面向ExecuTorch v1.4.1运行环境导出,ExecuTorch不提供前向兼容保证,旧版运行环境可能加载失败; - 在 React Native 项目中使用,需将 react-native-executorch 库模型注册表中的对应模型常量传入相应任务流水线,模型通过库自带的下载机制分发,无需手动搬移文件。
📌 小结
react-native-executorch-fsmn-vad 是一个"麻雀虽小"的端侧模型仓库:
- ✅1.83 MB的 XNNPACK fp32 构建,iPhone 16 上1.5 ms中位推理延迟;
- ✅ 用两份 NOTES.md 完整记录了 Core ML / MLX 后端的失败原因,是排查端侧推理问题的优秀样本;
- ✅ 坚持不量化的决策基于"体积非瓶颈、延迟才是"的实际取舍。
如果你在给自己的 React Native App 挑选 VAD 模型,这个仓库给出的结论很明确:XNNPACK + fp32,别折腾了。
- 人工智能
- 语音
- 音频
【免费下载链接】react-native-executorch-fsmn-vad
相关推荐
FSMN-VAD 模型原理通俗解析:react-native-executorch-fsmn-vad 如何做到端侧语音活动检测
FSMN VAD 模型原理通俗解析:react native executorch fsmn vad 如何做到端侧语音活动检测 react native exe
人工智能语音音频语音助手必装技能:react-native-executorch-fsmn-vad 的 4 个实战应用场景
语音助手必装技能:react native executorch fsmn vad 的 4 个实战应用场景 🎙️ react native executorc
人工智能语音音频从 PyTorch 到 .pte 文件:react-native-executorch-fsmn-vad 的 ExecuTorch 导出全流程与 v1.4.1 兼容性指南
从 PyTorch 到 .pte 文件:react native executorch fsmn vad 的 ExecuTorch 导出全流程与 v1.4.1
人工智能语音音频
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考