MNN 端侧推理、Sherpa-ONNX 本地语音、FFmpeg 视频处理——一个人从零开始构建隐私优先的AI助手


前言

2024年底我开始思考一个问题:当我们在使用AI助手时,我们的对话数据去了哪里?

绝大部分AI助手依赖云端接口,每一次对话、每一段录音都要上传到服务器处理。这种方式能力强大,但也意味着用户必须信任服务商的数据处理承诺。

有没有另一种可能——核心AI能力在本地运行,数据不出设备?

半年后,聆通AI 诞生了。这不是一个比云端AI更强的产品,而是一个走不同路线的产品:端侧推理 + 隐私优先。语音识别、大模型推理、语音合成,全部可以在本地完成。

一个人,从架构设计到UI实现,从MNN模型集成到FFmpeg水印处理,把这条路走通了一遍。


一、整体架构

┌─────────────────────────────────────────┐
│              UI Layer                    │
├─────────────────────────────────────────┤
│           Service Layer                  │
│  AiCallDialog / ChatManager / Payment    │
├──────────────────┬──────────────────────┤
│   端侧推理(核心)  │    云端扩展(可选)   │
│  ┌────────────┐  │  ┌────────────────┐   │
│  │ MNN LLM    │  │  │ API Models     │   │
│  │ Sherpa ASR │  │  │ ImageGen API   │   │
│  │ Sherpa TTS │  │  │ VideoGen API   │   │
│  └────────────┘  │  └────────────────┘   │
├──────────────────┴──────────────────────┤
│              Data Layer                  │
│  SQLite / SharedPreferences              │
│  File Storage / FFmpeg Processing        │
└─────────────────────────────────────────┘

核心设计原则:本地优先,云端可选。基础对话能力完全离线运行,高级创作能力通过API扩展,用户自主选择。


二、为什么做端侧AI

隐私是首要考虑。

云端AI的使用流程是:录音 → 上传 → 服务器处理 → 返回结果。用户的所有语音数据都要经过网络传输和第三方服务器处理。

端侧AI的流程是:录音 → 本地处理 → 返回结果。数据不离开设备,不存在传输泄露、服务端泄露的风险。

这不是说云端AI不好——云端模型能力更强、更新更快。端侧AI和云端AI是不同场景下的选择:重隐私场景适合端侧,重能力场景适合云端。

聆通AI同时支持两种模式,用户可根据需要自由切换。


在这里插入图片描述

三、端侧推理引擎选型:MNN

对比过三套主流方案:

维度 TFLite NCNN MNN
Transformer 算子优化 一般 一般 ✅ 汇编级优化
量化模型支持
内存占用 较高 中等 ✅ 较低
Android 集成 中等
社区活跃度 中等 中等

选择 MNN 的主要原因是它对 Attention、LayerNorm 等 Transformer 算子做了汇编级优化,在移动端推理速度上有优势,且内存占用控制得较好。

注意事项: ONNX 转 MNN 时 opset version 建议用 12-15,超出范围可能导致算子转换失败。先用 onnx-simplifier 简化模型再转换会更稳妥。


在这里插入图片描述

四、本地语音流水线

基于 Sherpa-ONNX 实现端到端的本地语音处理:

[用户说话] → [AudioRecord] → [VAD] → [ASR(本地)] → [LLM(本地)] → [TTS(本地)] → [AudioTrack]

所有环节均在设备本地完成,无网络请求,无数据上传

流式处理

ASR 采用流式识别,2048 samples/帧,边采集边识别,端到端延迟约 1-2s

打断机制

当前只支持手动打断。

延迟实测

环节 延迟
ASR 首帧 ~200ms
端侧 LLM 首 token 300-500ms
TTS 合成 ~100ms
端到端 1-2s

坑: 部分机型上 AudioRecord 偶尔返回空帧,导致误判为静音。解决方案是加能量阈值 + 连续非静音帧数双重判断。


在这里插入图片描述

五、模型管理

聆通AI支持两类模型:

  • 端侧模型type: preset)— MNN格式,本地推理,离线可用,数据不离开设备
  • API 模型type: api)— 远程调用,能力更强,适合需要大模型能力的场景

配置统一在 model_market.json 中管理:

{
  "models": [
    {
      "modelName": "Qwen3.5-2B-MNN",
      "type": "preset",
      "category": "system_preset"
    },
    {
      "modelName": "agnes-2.0-flash",
      "type": "api",
      "category": "api_service",
      "api_config": {
        "base_url": "...",
        "model_name": "agnes-2.0-flash",
        "max_tokens": 8192
      }
    }
  ]
}

隐私说明: 端侧模型模式下,所有数据在本地处理,不会发送到任何服务器。API 模式则由用户主动选择,数据经由用户配置的 API 地址传输。


六、视频水印:FFmpeg 实践

依赖选择

使用 com.arthenica:ffmpeg-kit-full-gpl:6.0-2.LTS(注意不是 com.antonkarpenko 版本,后者 Java package 不一致)。

implementation 'com.arthenica:ffmpeg-kit-full-gpl:6.0-2.LTS'

水印动画

模式 效果
scroll-x 水平滚动
scroll-y 垂直滚动
bounce 弹跳
random 随机移动

注意事项

  • drawtext 的 y 坐标是 baseline 位置,需要加 fontSize + 10 偏移
  • TTC 字体用 :index=0 指定子集
  • 可变字体用 :fontvariations=wght=700 控制粗细

七、UI 设计

  • 自定义 Dialog 样式:通过 alertDialogTheme 注入全局圆角主题
  • 导航简化:模型分类用 Spinner 下拉替代两行 TabLayout
  • 中文渲染:内嵌 NotoSansSC 可变字体,确保各设备显示一致

八、内测招募

App 已进入内测阶段,正在寻找第一批真实用户。

当前功能

  • AI 语音通话(端侧运行,数据不上传)
  • 多模型聊天(端侧 + 可选 API)
  • 图片生成与编辑
  • 视频生成(自定义水印)
  • 微信支付
  • 创作管理与收藏

内测说明

  • 内测期间 免费使用全部功能
  • 直接和开发者交流,反馈会被优先处理
  • 正式版上线后,内测用户赠送额外时长

参与方式

目前 APK 已打包好,诚邀你帮忙测试:

✅ AI语音对话(像打电话一样自然)
✅ 端侧推理,隐私安全,断网也能用
✅ 支持 AI 通话、语音问答

👉 下载链接(蒲公英):https://www.pgyer.com/lingtongai
👉 测试反馈:直接微信我

如果你对 AI 产品感兴趣、或者单纯想尝个鲜,都欢迎来试一下。提前感谢你的时间!🙏

扫码加入内测群,下载 APK 即可体验。

端侧AI和云端AI不是对立关系,而是不同场景下的不同选择。聆通AI的选择是:把隐私的主动权还给用户。

欢迎来体验,也欢迎在评论区交流技术问题。


Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐