跳转到主要内容

语音唤醒与按键通话

要求

语音唤醒和按键通话需要 macOS 26 或更新版本。在旧版 macOS 上,这些控件会从语音设置页面隐藏,该页面会改为显示 macOS 26 要求。

模式

  • 唤醒词模式(默认):一个始终开启的 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
  • 启动按键通话会暂停唤醒词运行时,以避免音频 tap 互相竞争;松开后会自动重启。
  • 权限:需要麦克风 + Speech;接收按键事件需要辅助功能/输入监控批准。
  • 外接键盘:有些外接键盘不会按预期暴露右 Option。如果用户报告漏检,请提供备用快捷键。

面向用户的设置

  • 语音唤醒开关:启用唤醒词运行时。
  • 按住右 Option 说话:启用按键通话监视器。
  • 语言和麦克风选择器、实时电平表、触发词表,以及测试器(仅本地,绝不转发)。
  • 如果设备断开连接,麦克风选择器会保留上次选择,显示断开连接提示,并临时回退到系统默认设备,直到该设备恢复。
  • 声音:在检测到触发词和发送时播放提示音,默认使用 macOS “Glass”系统声音。可为每个事件选择任何可由 NSSound 加载的文件(例如 MP3/WAV/AIFF),或选择无声音

转发行为

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

转发载荷

  • VoiceWakeForwarder.prefixedTranscript(_:) 会在转录文本前添加一行机器提示(解析出的主机名,回退为 “this Mac”),唤醒词和按键通话路径共用该逻辑。

快速验证

  • 打开按键通话开关,按住右 Option,说话,然后松开:浮层应显示部分结果,然后发送。
  • 按住期间,菜单栏耳朵图标应保持放大(triggerVoiceEars(ttl: nil));松开后恢复。

相关