一、实验目的
唤醒词上线后,语音交互的入口打通了,但新的问题立刻暴露:所有推理都在云端,弱网时首字延迟 1.9s,断网时花盆彻底「失联」——一个号称有生命的物体,断网就变成哑巴花盆,这在体验上不可接受。
本次实验的目标是把架构重构为 云边协同:明确哪些能力必须在端侧、哪些交给云端,并通过缓存、批量上报与本地兜底,把延迟、流量、断网可用性三项指标同时压到可接受区间。
验收线:首字延迟 ≤ 0.8s、日均上行流量 ≤ 5MB、断网时本地表达成功率 100%。
二、为什么不是全云端 / 全端侧
| 维度 | 全云端 | 全端侧 | 云边协同 |
|---|---|---|---|
| 首字延迟 | 1.9s(实测) | 0.3s(能力受限) | 0.7s |
| 音频流量 | 全程上传 | 0 | 仅唤醒后上传 |
| 隐私 | 音频全量上云 | 最好 | 待机不采集 |
| 智能上限 | 高(大模型) | 低 | 高 |
| 硬件成本 | 低 | 高(需 NPU) | 中(复用现有 MCU) |
结论很直接:端侧负责「感知 + 唤醒 + 兜底」,云端负责「理解 + 生成 + 长期记忆」。切分的依据不是模型大小,而是「断网时这件事还该不该发生」。
三、任务切分矩阵
| 任务 | 执行位置 | 延迟预算 | 切分理由 |
|---|---|---|---|
| 关键词唤醒 | 端侧 | <50ms | 常驻、离线可用、不上传音频 |
| VAD 端点检测 | 端侧 | <30ms | 高频、规则简单 |
| 声纹确认 | 云端(暂) | 200ms | 模型较大,规划下沉 WeSpeaker |
| 传感器采集与滤波 | 端侧 | 周期 1min | 高频低价值,端侧聚合后上报 |
| 异常阈值告警 | 端侧 | 实时 | 断网也要能报警 |
| 养护知识问答 | 云端 | 800ms | 需知识库与 LLM |
| LMPI 情感推理 | 云端 | 300ms | 依赖人格与记忆上下文 |
| 长期记忆写入 | 云端 | 异步 | 需 PostgreSQL 与向量检索 |
| TTS 合成 | 云端 | 流式 | 音色一致性 |
| 光语 / 动作表达 | 端侧 | 实时 | 断网也要有反馈 |
四、端侧数据管道
传感器原始数据是最典型的「高频低价值」数据:一秒钟采样一次没有意义,但一分钟内突然干旱又必须立刻知道。因此端侧做两级处理——先滤波去噪,再做变化量触发。
传感器(温湿度 / 光照 / 土壤 / 水位)
→ 5 次滑动中值滤波(剔除跳变与毛刺)
→ 变化量 > 阈值 或 周期到点 → 批量打包
→ MQTT QoS1 上行(topic: longzhi/{device}/telemetry)
→ 未确认消息写入本地环形队列(最多 200 条,掉电不丢)实测效果:上行消息数从 1,440 条/天降到 137 条/天(-90%),而干旱、缺水这类关键事件的端到端告警延迟反而从 62s 降到 3s 以内——因为不再等云端轮询,端侧自己就能判断。
五、云端编排层
云端保留完整的 AI 编排能力,只在被唤醒后的几秒内工作:
唤醒后音频 → ASR → 声纹确认 → LMPI 情感推理(传感器 + 心境 + 记忆)
→ 意图识别 ┬─ knowledge → 知识库注入 LLM
├─ news → 联网搜索 + LLM 总结
└─ normal → 情感对话
→ 人格演化 + 记忆写入 → TTS 流式 → 端侧播放 + LED 光语关键改动是把 传感器快照 提前到 LMPI 推理之前一次性取回并缓存 5s,避免同一轮对话里 ASR、情感推理、记忆写入各查一次库。仅这一项就把 p95 延迟压低约 180ms。
六、三级缓存设计
| 缓存层 | 缓存内容 | 命中率 | 收益 |
|---|---|---|---|
| L1 端侧 | 光语脚本、12 条兜底语音 | 100% | 断网可用 |
| L2 Redis-TTS | 合成音频(按文本 hash) | 37% | 首字延迟 -410ms |
| L3 Redis-意图 | LLM 回复(归一化问句) | 21% | token 成本 -18% |
L3 需要谨慎:缓存开放式情感对话会产生「重复感」,因此只对知识类与养护类意图开启,闲聊一律不缓存,并给缓存回复标注 24 小时 TTL。
七、弱网与降级实测
用 tc netem 在网关侧注入延迟与丢包,模拟四类真实网络条件,每类跑 60 次标准交互(唤醒 → 提问 → 听到回答):
| 场景 | RTT | 丢包 | 首字延迟 | 成功率 |
|---|---|---|---|---|
| 办公室 Wi-Fi | 18ms | 0% | 0.68s | 100% |
| 家庭 Wi-Fi | 42ms | 0.3% | 0.79s | 100% |
| 弱网模拟 | 220±90ms | 2% | 1.35s | 98.5% |
| 高丢包 | 300ms | 8% | 2.1s | 91.2% |
| 断网 | - | - | 本地兜底 | 100% |
断网兜底策略:LED 光语表达当前心境(4 色 + 呼吸节奏)+ 12 条预置离线语音 + 本地养护告警;恢复网络后按时间戳补传离线事件队列,记忆不丢失。
八、成本与功耗核算
| 指标 | 改造前 | 改造后 |
|---|---|---|
| 日均上行流量 | 21.4 MB | 4.7 MB(-78%) |
| 日均 LLM token | 38.6k | 31.7k(-18%) |
| 端侧待机电流 | 62mA | 18mA(-71%) |
| 日均电费(估算) | 0.09 元 | 0.03 元 |
九、实验总结与下一步
三项验收线全部达成:首字延迟 0.7s、日均上行流量 4.7MB、断网本地表达成功率 100%。回头看,收益最大的不是某一项优化,而是想清楚了「断网时这件事还该不该发生」这把尺子——它让切分决策变得机械而快速,不需要每次都争论模型能不能塞进 MCU。
下一步:① 声纹模型下沉端侧(WeSpeaker 量化版),进一步降低唤醒后的隐私暴露;② 端侧小模型承接高频固定指令(浇水、关灯、查土壤),目标端侧处理率 ≥ 40%;③ 用真实弱网日志训练自适应上报策略,让上报频率随网络质量动态调整。


💬 过往技术交流