跳转到主要内容

语音唤醒和按下说话

模式

  • 唤醒词模式(默认):始终在线的 Speech 识别器等待触发令牌 (swabbleTriggerWords)。匹配时开始捕获,显示带有部分文本的叠加层, 并在静默后自动发送。
  • 按下说话(按住右 Option):按住右 Option 键立即捕获—无需触发。 叠加层在按住时出现;释放后最终确定并在短暂延迟后转发,以便你可以调整文本。

运行时行为(唤醒词)

  • Speech 识别器位于 VoiceWakeRuntime 中。
  • 仅当唤醒词和下一个词之间有有意义的停顿(约 0.55 秒间隙)时才触发。 即使在命令开始之前,叠加层/提示音也可以在停顿时启动。
  • 静默窗口:语音流动时为 2.0 秒,仅听到触发时为 5.0 秒。
  • 硬停止:120 秒以防止失控会话。
  • 会话之间的去抖:350 毫秒。
  • 叠加层通过 VoiceWakeOverlayController 驱动,具有提交/易失性着色。
  • 发送后,识别器干净地重启以侦听下一个触发。

生命周期不变量

  • 如果启用语音唤醒并授予权限,唤醒词识别器应该在侦听 (除了在明确的按下说话捕获期间)。
  • 叠加层可见性(包括通过 X 按钮手动关闭)绝不能阻止识别器恢复。

粘性叠加层失败模式(以前)

以前,如果叠加层卡住可见并且你手动关闭它,语音唤醒可能看起来”死了”, 因为运行时的重启尝试可能被叠加层可见性阻止,并且没有安排后续重启。 强化:
  • 唤醒运行时重启不再被叠加层可见性阻止。
  • 叠加层关闭完成通过 VoiceSessionCoordinator 触发 VoiceWakeRuntime.refresh(...), 因此手动 X-关闭始终恢复侦听。

按下说话特定内容

  • 热键检测使用全局 .flagsChanged 监视器用于右 Option (keyCode 61 + .option)。我们只观察事件(不吞咽)。
  • 捕获管道位于 VoicePushToTalk 中:立即启动 Speech,将部分流式传输到 叠加层,并在释放时调用 VoiceWakeForwarder
  • 当按下说话开始时,我们暂停唤醒词运行时以避免竞争音频抽头;它在释放后 自动重启。
  • 权限:需要麦克风 + 语音;查看事件需要辅助功能/输入监控批准。
  • 外部键盘:一些可能不会按预期公开右 Option—如果用户报告未命中, 提供回退快捷方式。

面向用户的设置

  • Voice Wake 切换:启用唤醒词运行时。
  • Hold Cmd+Fn to talk: 启用按下说话监视器。在 macOS < 26 上禁用。
  • 语言和麦克风选择器、实时级别表、触发词表、测试器(仅本地;不转发)。
  • 麦克风选择器在设备断开连接时保留上次选择,显示断开连接提示, 并暂时回退到系统默认值,直到它返回。
  • Sounds: 在触发检测和发送时提示音;默认为 macOS”Glass”系统声音。 你可以为每个事件选择任何 NSSound 可加载文件(例如 MP3/WAV/AIFF) 或选择 No Sound

转发行为

  • 启用语音唤醒时,转录被转发到活动网关/代理(mac 应用其余部分使用的 相同本地 vs 远程模式)。
  • 回复传递到最后使用的主要提供商(WhatsApp/Telegram/Discord/WebChat)。 如果传递失败,错误被记录,运行仍然通过 WebChat/会话日志可见。

转发有效负载

  • VoiceWakeForwarder.prefixedTranscript(_:) 在发送前添加机器提示。 在唤醒词和按下说话路径之间共享。

快速验证

  • 打开按下说话,按住 Cmd+Fn,说话,释放:叠加层应该显示部分,然后发送。
  • 按住时,菜单栏耳朵应该保持放大(使用 triggerVoiceEars(ttl:nil)); 它们在释放后下降。