Nodes and media
Голосовая активация
Фразы активации — это единый глобальный список, принадлежащий Gateway; отдельных пользовательских списков для каждого узла нет. Любой узел или интерфейс приложения может редактировать список; Gateway сохраняет изменение и рассылает его всем подключённым клиентам.
- macOS: локальный переключатель включения и отключения голосовой активации. Требуется macOS 26+; подробности о среде выполнения и PTT см. в разделе Голосовая активация (macOS).
- iOS: локальный переключатель включения и отключения голосовой активации в Settings.
- Android: локальный переключатель включения и отключения голосовой активации и редактор фраз активации в Settings → Voice. Требуется встроенное распознавание речи на устройстве Android.
Хранение
Фразы активации и правила маршрутизации хранятся в базе данных состояния Gateway, по умолчанию ~/.openclaw/state/openclaw.sqlite (можно переопределить с помощью OPENCLAW_STATE_DIR), в таблицах voicewake_triggers, voicewake_routing_config, voicewake_routing_routes. Устаревшие settings/voicewake.json и settings/voicewake-routing.json используются только как входные данные миграции openclaw doctor --fix — среда выполнения никогда их не считывает.
Протокол
Список триггеров
| Метод | Параметры | Результат |
|---|---|---|
voicewake.get |
нет | { triggers: string[] } |
voicewake.set |
{ triggers: string[] } |
{ triggers: string[] } |
voicewake.set нормализует входные данные: удаляет пробелы по краям, отбрасывает пустые элементы, оставляет не более 32 триггеров и сокращает каждый до 64 кодовых единиц UTF-16, не разделяя суррогатные пары. Если результат пуст, используются встроенные значения по умолчанию (openclaw, claude, computer).
Маршрутизация (от триггера к цели)
| Метод | Параметры | Результат |
|---|---|---|
voicewake.routing.get |
нет | { config: VoiceWakeRoutingConfig } |
voicewake.routing.set |
{ config: VoiceWakeRoutingConfig } |
{ config: VoiceWakeRoutingConfig } |
{ "version": 1, "defaultTarget": { "mode": "current" }, "routes": [{ "trigger": "фраза активации робота", "target": { "sessionKey": "agent:main:main" } }], "updatedAtMs": 1730000000000}Каждая цель маршрута target поддерживает ровно один из следующих вариантов:
{ "mode": "current" }{ "agentId": "main" }{ "sessionKey": "agent:main:main" }
Ограничения: не более 32 маршрутов, текст триггера — не более 64 символов. Триггеры маршрутов нормализуются для сопоставления и выявления дубликатов: переводятся в нижний регистр, из каждого слова удаляются начальные и конечные знаки препинания, а последовательности пробельных символов сворачиваются ("Hey, Bot!!" и "hey bot" совпадают и считаются дубликатами). Эта нормализация строже простого удаления пробелов по краям, применяемого к приведённому выше глобальному списку триггеров.
События
| Событие | Полезная нагрузка |
|---|---|
voicewake.changed |
{ triggers: string[] } |
voicewake.routing.changed |
{ config: VoiceWakeRoutingConfig } |
Оба события рассылаются каждому клиенту WebSocket с областью доступа на чтение (приложению macOS, WebChat и аналогичным клиентам), а также каждому подключённому узлу. Узел также получает оба события в виде исходного моментального снимка сразу после подключения.
Поведение клиентов
- macOS: вызывает
voicewake.set/voicewake.getи отслеживаетvoicewake.changed, чтобы сохранять синхронизацию с другими клиентами. - iOS: вызывает
voicewake.set/voicewake.getи отслеживаетvoicewake.changed, чтобы локальное обнаружение фраз активации своевременно реагировало на изменения. - Android: вызывает
voicewake.set/voicewake.get, отслеживаетvoicewake.changedи при включении объявляетvoiceWake. Распознавание выполняется на устройстве и только на переднем плане; оно приостанавливается, пока аудио используется режимом Talk, ручной диктовкой, записью голосовой заметки или озвучиванием сообщения.