macOS companion app

Голосовая активация (macOS)

Голосовая активация и передача по нажатию

Требования

Для голосовой активации и передачи по нажатию требуется macOS 26 или новее. В более ранних версиях macOS элементы управления скрыты на странице настроек голоса, а вместо них отображается требование macOS 26.

Режимы

  • Режим ключевого слова (по умолчанию): постоянно активный распознаватель речи ожидает слова активации (swabbleTriggerWords). При совпадении он начинает запись, отображает наложение с частично распознанным текстом и автоматически отправляет его после паузы.
  • Передача по нажатию (удерживайте Right 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: распознавание речи запускается немедленно, частичные результаты передаются в наложение, а при отпускании вызывается VoiceWakeForwarder.
  • При запуске передачи по нажатию среда обработки ключевого слова приостанавливается, чтобы избежать конкурирующего захвата звука; после отпускания она автоматически перезапускается.
  • Разрешения: требуются доступ к микрофону и распознаванию речи; для получения событий клавиатуры необходимо разрешение Accessibility/Input Monitoring.
  • Внешние клавиатуры: некоторые из них не передают правую клавишу Option ожидаемым образом. Если пользователи сообщают о пропущенных нажатиях, предложите резервное сочетание клавиш.

Пользовательские настройки

  • Переключатель Голосовая активация: включает среду обработки ключевого слова.
  • Удерживайте Right Option для разговора: включает монитор передачи по нажатию.
  • Средства выбора языка и микрофона, индикатор уровня в реальном времени, таблица ключевых слов и средство проверки (работает только локально и ничего не передаёт).
  • Средство выбора микрофона сохраняет последний выбранный вариант при отключении устройства, показывает уведомление об отключении и временно использует системное устройство по умолчанию, пока выбранное устройство не станет доступно снова.
  • Звуки: сигналы при обнаружении ключевого слова и отправке; по умолчанию используется системный звук macOS "Glass". Для каждого события можно выбрать любой файл, загружаемый через NSSound (например, MP3/WAV/AIFF), или выбрать Без звука.

Поведение при передаче

  • При передаче VoiceWakeForwarder.selectedSessionOptions выбирает ключ активного сеанса WebChat, если он задан, иначе — ключ основного сеанса Gateway.
  • Этот сеанс ищется через sessions.list, после чего канал и получатель определяются из контекста доставки сеанса (с переходом к последнему каналу и получателю, а затем к разобранному ключу сеанса); если определить их не удаётся, по умолчанию используется WebChat.
  • Если доставка завершается с ошибкой, она записывается в журнал (категория voicewake.forward), а выполнение по-прежнему отображается в WebChat и журналах сеанса.

Полезная нагрузка передачи

  • VoiceWakeForwarder.prefixedTranscript(_:) добавляет перед расшифровкой строку с подсказкой о компьютере (определённое имя узла или "этот Mac", если определить его не удалось); эта строка используется как для ключевого слова, так и для передачи по нажатию.

Быстрая проверка

  • Включите передачу по нажатию, удерживайте Right Option, произнесите текст и отпустите клавишу: наложение должно сначала показать частичные результаты, а затем отправить текст.
  • Пока клавиша удерживается, значок ушей в строке меню должен оставаться увеличенным (triggerVoiceEars(ttl: nil)); после отпускания он уменьшается.

Связанные разделы

Was this useful?
On this page

On this page