# 硬件对接技术方案 ## 完整流程 ``` 用户 本地硬件 云端服务 | | | | "小助手" | | |--------------->| | | | 唤醒词检测(本地) | | | ~10ms | | | | | | 启动录音 | | "今天天气怎样" | | |--------------->| | | | VAD 检测停顿 | | | ~1s | | | | | | 上传音频 | | |----------------->| | | | ASR 转文字 | | | 1-3s | | | | | | LLM 生成回复 | | | "今天北京晴..." | | | | | | 调你的 TTS API | | | | | 返回音频流 | | |<-----------------| | "今天北京晴..." | | |<---------------| | | | 播放音频 | ``` ## 端到端延迟优化 ### 默认延迟(~5 秒) ``` 唤醒 10ms 录音停顿 500ms ASR 1500ms LLM 2000ms TTS 800ms 播放启动 100ms ───────────────── 总计 ~5s ``` ### 优化后延迟(~3 秒) - 流式 ASR(边录边识别) - 流式 LLM(边识别边生成) - 流式 TTS(边生成边合成) - 流式播放(边合成边播放) ## 各模块技术选型 ### 唤醒词 | 方案 | 树莓派 | ESP32 | |------|--------|-------| | Picovoice Porcupine | ✅ | ✅(官方支持) | | Snowboy | ✅ | ❌ 已停止维护 | | 关键词自定义 | ✅ | ✅ | ### VAD(语音活动检测) | 方案 | 树莓派 | ESP32 | |------|--------|-------| | webrtcvad | ✅ | ❌ | | Silero VAD | ✅ | ⚠️ 资源紧张 | | 能量检测 | ✅ | ✅(最简方案) | ### ASR | 方案 | 推荐度 | 价格 | |------|--------|------| | OpenAI Whisper API | ⭐⭐⭐⭐⭐ | ¥0.006/分钟 | | 阿里达摩院 Paraformer | ⭐⭐⭐⭐ | 按量计费 | | 本地 Whisper.cpp | ⭐⭐⭐ | 免费(树莓派能跑) | | 讯飞 / 百度 | ⭐⭐⭐ | 价格不一 | ### LLM | 方案 | 推荐度 | 价格 | |------|--------|------| | DeepSeek | ⭐⭐⭐⭐⭐ | ¥1/百万 token(便宜) | | GPT-4o | ⭐⭐⭐⭐ | $5/百万 token | | 通义千问 Qwen | ⭐⭐⭐⭐ | 按量计费 | | Ollama 本地 | ⭐⭐⭐ | 免费(但慢) | ### TTS(你的服务)⭐ 参考 `tts-sdk/README.md` ## 内存与算力需求 ### 树莓派 4B - 内存:1-2 GB 占用 - CPU:单核 50%(音频处理时) - 网络:稳定 WiFi 即可 ### ESP32-S3 - 内存:录音缓冲 < 1 MB - CPU:单核 80%(网络忙时) - 网络:必须 2.4GHz WiFi ## 常见问题 ### Q: 没网络时怎么办? A: 预设回复("网络不好,请稍后重试") + 重试机制 ### Q: 弱网时延迟太高? A: 流式处理 + 超时控制 + 降级方案 ### Q: 多人说话识别错? A: 远场拾音需要麦克风阵列,单麦限制大 ### Q: 怎么调试延迟? A: 每个模块打印耗时日志,定位瓶颈 ## 安全性 ### API Key 保护 - 不要硬编码在代码里 - 使用环境变量或密钥管理 - 不同环境用不同 Key ### 用户隐私 - 录音不上传到第三方(除非必要) - 提示用户"正在录音" - 提供删除历史功能 ### 设备安全 - ESP32 OTA 升级签名验证 - 防止恶意固件刷入 - API 调用频率限制