Files
app/wei_ai_app/优化.md
2026-02-09 21:54:32 +08:00

86 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
我已经详细阅读了整个 interaction
模块和相关服务代码,以下是完整的架构分析和优化建议:
---
架构概览
screens/interaction/
├── interaction_screen.dart # 文字聊天 UI
├── voice_mode_overlay.dart # 语音通话 UI
└── voice_session_controller.dart # 语音状态编排
core/services/
├── chat_service.dart # LLM API (SSE 流式)
├── chat_storage_service.dart # SharedPreferences 持久化
├── stt_service.dart # 系统 STT (已废弃)
├── vad_stt_service.dart # Silero VAD + Google Cloud STT
├── tts_service.dart # TTS 门面 + 引擎选择
└── tts/
├── tts_engine.dart # 抽象接口
├── minimax_tts_engine.dart # MiniMax WebSocket 流式 TTS
├── system_tts_engine.dart # 系统 TTS 兜底
└── ws_client_*.dart # 跨平台 WebSocket
整体评价: 服务分层清晰TTS 的抽象接口设计不错,语音对话的"句子级 TTS +
预连接"体验优化做得挺好。但有几个明显需要处理的问题:
---
需要优化的问题 (按优先级)
P0 - 安全问题
1. API Key 硬编码 — minimax_config.dart 中 MiniMax JWT 和 vad_stt_service.dart
中 Google Cloud STT API Key 直接写在代码里。APK 反编译即可提取,存在严重的
Key 被盗刷风险。
- 建议: 所有第三方 API 调用走后端代理,客户端不存放任何 Key
P1 - 潜在 Bug
2. 消息重复保存 — InteractionScreen._sendMessage() 会保存消息到
storage语音流程中 VoiceSessionController._processUserMessage()
也通过回调保存。如果两个流程不小心交叉,可能产生重复消息。
- 建议: 统一消息保存入口,只在一处写入
3. 句子缓冲丢失 — _sentenceBuffer
在流式结束或网络中断时未说完的文本会丢失TTS 不完整但文字显示完整)。
- 建议: 流结束时 flush 残留 buffer增加超时机制如 2s 无标点则强制切句)
4. 语音打断时资源泄漏 — 用户在 TTS 播放中关闭语音界面_speakCompleter
可能不会被 complete定时器可能继续运行。
- 建议: dispose() 中强制 complete 所有 Completer取消所有 Timer
5. WebSocket 连接泄漏 — 退出语音模式后 TTS WebSocket
连接没有显式关闭,可能造成连接泄漏。
- 建议: 退出语音模式时显式调用 disconnect
P2 - 架构优化
6. 状态管理不统一 — InteractionScreen 用 Riverpod + setState
混合VoiceSessionController 用 ChangeNotifier。风格不一致维护成本高。
- 建议: 统一用 RiverpodVoiceSessionController 迁移为 StateNotifierProvider
7. 服务紧耦合 — VoiceSessionController 直接 new VadSttService() /
TTSService(),无法做单元测试。
- 建议: 通过依赖注入 (Riverpod Provider) 注入服务实例
8. 存储性能 — SharedPreferences 每次写入都序列化整个 session
JSON消息多了会卡。
- 建议: 考虑换用 Isar/Hive 等本地数据库,支持增量写入和分页加载
P3 - 体验优化
9. 无重试机制 — Google STT API
调用失败时没有重试逻辑,网络抖动直接导致语音识别失败。
- 建议: 增加 1-2 次重试,带指数退避
10. 未完成功能 — VoiceModeOverlay 的扬声器切换按钮是空实现 (onPressed: ()
{}),波形动画是固定的不跟实际音频挂钩。
11. 流式响应类型安全 — ChatService._sendStreamRequest() 中 JSON 解析用了
dynamic 类型API 返回异常格式时可能 crash。
---
做得好的地方
- TTS 引擎抽象 + MiniMax/System 自动降级兜底
- WebSocket 预连接 降低首次语音响应延迟
- 句子级流式 TTS 而非等全文,对话体感自然
- 30s keep-alive ping 保持连接复用
- LLM 流式渲染 + 打字动画,用户反馈及时
---
要我针对某个具体问题开始修复吗?比如先处理 P1 的 bug 或 P2 的架构重构?