跳转至

语音唤醒与按住说话

要求

语音唤醒和按住说话要求 macOS 26 或更高版本。它们的设备控制选项出现在 仪表盘 → 设置 → 对话 → 这台 Mac 中,该页面会报告此 Mac 上语音功能何时不可用。

语音唤醒要求 Apple Speech 支持所选语言的设备端识别。当这种仅本地的契约不可用时,应用会拒绝启动被动式唤醒词监听;它绝不会回退到网络识别。按住说话、对话模式和快速聊天听写是明确的用户操作,可以使用 Apple Speech 网络服务来获得更广泛的语言覆盖。

模式

  • 唤醒词模式(默认):一个始终开启的设备端 Speech 识别器等待触发词(swabbleTriggerWords)。匹配后开始捕获,显示带有部分文本的覆盖层,并在静默后自动发送。
  • 按住说话(按住右 Option 键):按住右 Option 键立即开始捕获,无需触发词。按住期间显示覆盖层;松开后结束捕获,并在一小段延迟后转发,以便你可以编辑文本。

运行时行为(唤醒词)

  • 识别器位于 VoiceWakeRuntime 中。
  • 只有当唤醒词与下一个词之间存在明显停顿时,触发才会生效(triggerPauseWindow = 0.55s)。覆盖层/提示音可以在停顿期间、甚至在命令开始之前就启动。
  • 静默窗口:当语音正在输入时为 2.0s(silenceWindow);如果只听到触发词,则为 5.0s(triggerOnlySilenceWindow)。
  • 硬停止:120s(captureHardStop),以防止会话失控。
  • 会话间去抖:发送后 350ms(debounceAfterSend)。
  • 覆盖层由 VoiceWakeOverlayController 驱动,并带有已提交/易变文本的颜色区分。
  • 发送后,一个新的识别任务会监听下一个触发。在所选语言不变的情况下,对话模式、语音唤醒、按住说话和快速聊天听写会重用各自的识别器;停止捕获仍会释放麦克风并取消任务。

生命周期不变式

  • 如果语音唤醒已启用且权限已授予,唤醒词识别器会保持监听,除非正处于活跃的按住说话捕获期间。
  • 覆盖层关闭,包括通过 X 按钮手动关闭,总会恢复识别器:VoiceSessionCoordinator.overlayDidDismiss 会在所有关闭路径上调用 VoiceWakeRuntime.refresh(state:)。会话/令牌模型请参阅 语音覆盖层。

按住说话的具体细节

  • 热键检测使用全局 .flagsChanged 监视器来监听右 Option(keyCode 61 + .option)。它只观察事件,绝不会吞掉事件。
  • 捕获逻辑位于 VoicePushToTalk 中:立即启动 Speech,将部分识别结果流式传输到覆盖层,并在松开时调用 VoiceWakeForwarder。
  • 启动按住说话会暂停唤醒词运行时,以避免两个音频采集相互冲突;松开后会自动重启。
  • 权限:需要麦克风 + Speech;接收按键事件需要辅助功能/输入监视授权。
  • 外接键盘:有些键盘无法按预期暴露右 Option。如果用户报告漏触发,请提供一个备用快捷键。

面向用户的设置

在 macOS 应用中打开 仪表盘 → 设置 → 对话 → 这台 Mac,以进行设备语音设置。麦克风和语音权限位于 仪表盘 → 设置 → 这台 Mac → 权限。

  • 语音唤醒开关:启用唤醒词运行时。
  • 按住右 Option 键说话:启用按住说话监视器。
  • 如果所选语言在此 Mac 上不支持设备端识别,页面会解释为何无法启用语音唤醒。已启用的语音唤醒设置仍可关闭;按住说话和对话模式仍可用。
  • 语言和麦克风选择器用于选择此 Mac 的输入。系统默认会使用系统麦克风。
  • 主语言包含当前系统区域设置,并标记为 (System)。选择它时会像原生选择器一样保存其具体的区域标识符(例如 en_US);它不会保存空字符串或 system 标记。现有的系统标记会解析为该选项以便显示,但不会重写已保存的偏好设置。不可用的其他语言不会出现在显示的选择中。
  • 麦克风测试会打开一个原生面板,带有实时电平表和本地测试器,且绝不会转发语音。选择完成以关闭面板并释放麦克风。
  • 触发词是对话页面上的网关设置,并可在常规浏览器中编辑。Mac 的唤醒运行时使用主网关的触发词;打开另一个网关窗口不会重新定向该运行时。
  • 如果所选麦克风断开连接,语音运行时会临时使用系统默认麦克风,并保留该选择,以便在麦克风恢复时使用。
  • 触发和发送提示音开关分别打开或关闭相应声音。页面还控制唤醒是否启动对话模式、按住说话、对话阶段提示音、Shift 键停止和实时中继。

转发行为

  • 转发时,VoiceWakeForwarder.selectedSessionOptions 会选择已设置的活动 WebChat 会话键;否则选择网关的主会话键。
  • 它会通过 sessions.list 查找该会话,并从会话的投递上下文中推导投递渠道和目标(回退到该会话最后的渠道/目标,再回退到解析后的会话键),如果仍无法解析则默认使用 WebChat。
  • 如果投递失败,错误会记录到 voicewake.forward 类别日志中,并且该运行仍可通过 WebChat/会话日志查看。

转发负载

  • VoiceWakeForwarder.prefixedTranscript(_:) 会在转写文本前添加一行机器提示(解析后的主机名,若解析失败则回退为“this Mac”),该行为在唤醒词和按住说话路径中共享。

快速验证

  • 打开按住说话,按住右 Option,说话,松开:覆盖层应显示部分识别结果,然后发送。
  • 按住期间,菜单栏的耳朵图标应保持放大状态(triggerVoiceEars(ttl: nil));松开后它们会缩小。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw