语音唤醒 & 按键通话
模式
- 唤醒词模式(默认):始终开启的语音识别器等待触发词(
swabbleTriggerWords)。匹配后开始捕捉,显示带部分文本的叠加层,静默后自动发送。 - 按键通话(按住右 Option 键):按住右 Option 键立即捕捉,无需触发词。按住时叠加层出现,松开后稍作延迟完成并转发,以便调整文本。
运行时行为(唤醒词模式)
- 语音识别器驻留在
VoiceWakeRuntime。 - 触发仅在唤醒词与下一词之间有明显停顿时触发(约 0.55 秒间隔)。叠加层和提示音可在停顿时启动,甚至在指令开始前。
- 静默时长:语音流畅时为 2.0 秒,仅听到触发词时为 5.0 秒。
- 最大时长限制:120 秒,防止长时间运行。
- 会话间去抖动时间:350 毫秒。
- 叠加层由
VoiceWakeOverlayController控制,使用已提交/临时着色区分状态。 - 发送后,识别器干净地重启,准备监听下一触发词。
生命周期不变式
- 如果启用语音唤醒并授予权限,唤醒词识别器应保持监听(显式按键通话捕捉时除外)。
- 叠加层的可见性(包括通过 X 按钮手动关闭)绝不应阻止识别器恢复监听。
叠加层卡死失败模式(以前)
之前,若叠加层卡在可见状态并手动关闭,语音唤醒可能看似“死机”,因为运行时的重启尝试会被叠加层可见性阻止,且不会安排后续重启。 加固措施:- 唤醒运行时重启不再受叠加层可见性的阻碍。
- 叠加层关闭完成后,通过
VoiceSessionCoordinator触发VoiceWakeRuntime.refresh(...),确保手动 X 关闭总能恢复监听。
按键通话细节
- 热键监测使用全局
.flagsChanged监听 右 Option 键(keyCode 61+.option),仅观察事件,不拦截。 - 捕捉流程在
VoicePushToTalk:按下时立即启动语音,实时流式部分结果到叠加层,松开时调用VoiceWakeForwarder。 - 按键通话开始时暂停唤醒词运行时,避免音频冲突;松开后自动重启。
- 权限需求:麦克风 + 语音识别;检测按键需要无障碍和输入监控权限。
- 外接键盘:部分可能无法正确识别右 Option;若用户反映失效,可提供备用快捷键。
面向用户的设置
- 语音唤醒 开关:启用唤醒词运行时。
- 按住 Cmd+Fn 说话:启用按键通话监听。macOS 26 以下禁用。
- 语言和麦克风选择器、实时音量计、触发词列表、测试器(仅本地,不转发)。
- 麦克风选择器在设备断开后保留最后选择,显示断开提示,临时回退至系统默认,设备返回时恢复。
- 声音:触发检测和发送时均有提示音,默认为 macOS “Glass” 系统音。可为每事件选择任意支持
NSSound加载格式文件(如 MP3/WAV/AIFF),或选择无声音。
转发行为
- 启用语音唤醒时,转录内容将转发到当前激活的网关/代理(与 Mac 应用其余部分使用的本地或远程模式相同)。
- 回复会发送到最后使用的主要提供者(WhatsApp/Telegram/Discord/WebChat)。若发送失败,错误会被记录,运行会话仍可通过 WebChat/会话日志查看。
转发负载
VoiceWakeForwarder.prefixedTranscript(_:)在发送前添加机器提示。该方法被唤醒词和按键通话路径共享。
快速验证
- 打开按键通话,按住 Cmd+Fn,讲话,松开:叠加层应显示部分文本然后发送。
- 按住时,菜单栏“耳朵”应持续放大(使用
triggerVoiceEars(ttl:nil));松开后恢复正常。