语音覆盖层(Voice Overlay)管理唤醒词和按键通话(PTT)的交互生命周期,确保两者重叠时行为可预测。

核心设计意图

  • 覆盖层已因唤醒词显示时,用户按下热键:PTT 会话继承现有文本而非重置
  • 唤醒词在静默后自动发送;PTT 在释放时立即发送
  • 每次捕获携带唯一 token,过期回调被丢弃,避免旧识别器重新打开覆盖层

会话 Token 机制

  • 覆盖层会话携带每次捕获的 token(唤醒词或 PTT)
  • 不匹配 token 的 partial/final/send/dismiss/level 更新被丢弃
  • PTT 继承可见覆盖层文本作为前缀,等待最多 1.5s 获取最终转录

日志调试

# 流式查看语音覆盖层日志
sudo log stream \
  --predicate 'subsystem == "ai.openclaw" AND category CONTAINS "voicewake"' \
  --level info --style compact

关键事件:session_started、adopted_by_push_to_talk、partial、finalized、send、dismiss、cancel、cooldown

架构组件(规划中)

组件职责
VoiceSessionCoordinator(actor)同一时间只持有一个 VoiceSession
VoiceSession(model)token、source、文本、计时器、overlayMode
VoiceSessionPublisher将活跃会话镜像到 SwiftUI
VoiceWakeOverlayView仅通过 publisher 渲染,不直接修改全局单例

相关链接