Сопутствующее приложение для macOS

Voice Wake

Режимы

  • Режим голосового пробуждения (по умолчанию): постоянно активный распознаватель речи ожидает триггерные слова (swabbleTriggerWords). При совпадении он начинает захват, показывает оверлей с частичным текстом и автоматически отправляет после тишины.
  • Нажатие для разговора (удержание правой Option): удерживайте правую клавишу Option для немедленного захвата — триггер не требуется. Оверлей появляется во время удержания; отпускание клавиши завершает захват и пересылает текст после короткой задержки, чтобы можно было отредактировать текст.

Поведение во время выполнения (голосовое пробуждение)

  • Распознаватель речи работает в VoiceWakeRuntime.
  • Триггер срабатывает только при значительной паузе между словом пробуждения и следующим словом (~0.55 с). Оверлей/звуковой сигнал может появиться во время паузы, даже до начала команды.
  • Окна тишины: 2.0 с, когда речь активна, 5.0 с, если было услышано только слово пробуждения.
  • Жесткая остановка: 120 с для предотвращения бесконечных сессий.
  • Защитный интервал между сессиями: 350 мс.
  • Оверлей управляется через VoiceWakeOverlayController с цветовым кодированием подтвержденного/неподтвержденного текста.
  • После отправки распознаватель перезапускается для прослушивания следующего триггера.

Инварианты жизненного цикла

  • Если Voice Wake включен и разрешения предоставлены, распознаватель голосового пробуждения должен слушать (за исключением явного захвата в режиме нажатия для разговора).
  • Видимость оверлея (включая ручное закрытие через кнопку X) никогда не должна препятствовать возобновлению работы распознавателя.

Режим сбоя с залипающим оверлеем (предыдущий)

Ранее, если оверлей зависал в видимом состоянии и вы закрывали его вручную, Voice Wake мог казаться «мертвым», потому что попытка перезапуска среды выполнения могла блокироваться видимостью оверлея, и последующий перезапуск не планировался. Усиление:

  • Перезапуск среды выполнения пробуждения больше не блокируется видимостью оверлея.
  • Завершение закрытия оверлея запускает VoiceWakeRuntime.refresh(...) через VoiceSessionCoordinator, поэтому ручное закрытие через X всегда возобновляет прослушивание.

Особенности нажатия для разговора

  • Обнаружение горячих клавиш использует глобальный монитор .flagsChanged для правой Option (keyCode 61 + .option). Мы только отслеживаем события (не перехватываем их).
  • Конвейер захвата находится в VoicePushToTalk: немедленно запускает распознавание речи, передает частичные результаты в оверлей и вызывает VoiceWakeForwarder при отпускании клавиши.
  • При начале нажатия для разговора мы приостанавливаем среду выполнения голосового пробуждения, чтобы избежать конфликта аудиопотоков; она автоматически возобновляется после отпускания.
  • Разрешения: требуется доступ к микрофону и распознаванию речи; для отслеживания событий необходимо одобрение Доступности/Мониторинга ввода.
  • Внешние клавиатуры: некоторые могут не предоставлять правую Option должным образом — предлагайте резервное сочетание клавиш, если пользователи сообщают о пропусках.

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

  • Переключатель Voice Wake: включает среду выполнения голосового пробуждения.
  • Удерживайте Cmd+Fn для разговора: включает монитор нажатия для разговора. Отключено на macOS < 26.
  • Выбор языка и микрофона, индикатор уровня громкости в реальном времени, таблица триггерных слов, тестер (только локальный; не пересылает).
  • Выбор микрофона сохраняет последний выбор, если устройство отключается, показывает подсказку об отключении и временно переключается на системный микрофон по умолчанию, пока устройство не вернется.
  • Звуки: сигналы при обнаружении триггера и при отправке; по умолчанию используется системный звук macOS «Glass». Вы можете выбрать любой файл, загружаемый NSSound (например, MP3/WAV/AIFF) для каждого события или выбрать Без звука.

Поведение пересылки

  • Когда Voice Wake включен, расшифровки пересылаются активному шлюзу/агенту (тот же локальный или удаленный режим, который используется остальной частью приложения для mac).
  • Ответы доставляются последнему использованному основному провайдеру (WhatsApp/Telegram/Discord/WebChat). Если доставка не удается, ошибка записывается в журнал, а сеанс все равно виден через WebChat/журналы сеансов.

Полезная нагрузка пересылки

  • VoiceWakeForwarder.prefixedTranscript(_:) добавляет машинную подсказку перед отправкой. Общий для путей голосового пробуждения и нажатия для разговора.

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

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

Строка менюГолосовой оверлей