Сопутствующее приложение для 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)); они уменьшаются после отпускания.