Nodes and media

Режим разговора

Режим разговора имеет две runtime-формы:

  • Нативный режим разговора macOS/iOS/Android использует локальное распознавание речи, чат Gateway и TTS talk.speak. Узлы объявляют возможность talk и команды talk.*, которые они поддерживают.
  • Браузерный режим разговора использует talk.client.create для принадлежащих клиенту сеансов webrtc и provider-websocket или talk.session.create для принадлежащих Gateway сеансов gateway-relay. managed-room зарезервирован для передачи управления Gateway и комнат рации.
  • Режим разговора Android может включать принадлежащие Gateway realtime-сеансы ретрансляции с talk.realtime.mode: "realtime" и talk.realtime.transport: "gateway-relay". В остальных случаях он остается на нативном распознавании речи, чате Gateway и talk.speak.
  • Клиенты только для транскрибации используют talk.session.create({ mode: "transcription", transport: "gateway-relay", brain: "none" }), затем talk.session.appendAudio, talk.session.cancelTurn и talk.session.close, когда им нужны субтитры или диктовка без голосового ответа ассистента.

Нативный режим разговора — это непрерывный цикл голосового диалога:

  1. Слушать речь
  2. Отправить транскрипт модели через активный сеанс
  3. Дождаться ответа
  4. Озвучить его через настроенного провайдера разговора (talk.speak)

Браузерный realtime-режим разговора пересылает вызовы инструментов провайдера через talk.client.toolCall; браузерные клиенты не вызывают chat.send напрямую для realtime-консультаций. Пока realtime-консультация активна, клиенты режима разговора могут использовать talk.client.steer или talk.session.steer, чтобы классифицировать произнесенный ввод как status, steer, cancel или followup. Принятое управление ставится в очередь активного встроенного запуска; отклоненное управление возвращает структурированную причину, например no_active_run, not_streaming или compacting.

Режим разговора только для транскрибации создает ту же общую оболочку событий разговора, что и realtime- и STT/TTS-сеансы, но использует mode: "transcription" и brain: "none". Он предназначен для субтитров, диктовки и наблюдательного захвата речи; одноразово загруженные голосовые заметки по-прежнему используют путь медиа/аудио.

Поведение (macOS)

  • Постоянно видимый оверлей, пока включен режим разговора.
  • Переходы фаз Прослушивание → Обдумывание → Озвучивание.
  • При короткой паузе (окно тишины) текущий транскрипт отправляется.
  • Ответы записываются в WebChat (как при вводе текста).
  • Прерывание речью (по умолчанию включено): если пользователь начинает говорить, пока ассистент озвучивает ответ, мы останавливаем воспроизведение и фиксируем временную метку прерывания для следующего запроса.

Голосовые директивы в ответах

Ассистент может добавить в начало ответа одну строку JSON для управления голосом:

json
{ "voice": "<voice-id>", "once": true }

Правила:

  • Только первая непустая строка.
  • Неизвестные ключи игнорируются.
  • once: true применяется только к текущему ответу.
  • Без once голос становится новым значением по умолчанию для режима разговора.
  • Строка JSON удаляется перед воспроизведением TTS.

Поддерживаемые ключи:

  • voice / voice_id / voiceId
  • model / model_id / modelId
  • speed, rate (WPM), stability, similarity, style, speakerBoost
  • seed, normalize, lang, output_format, latency_tier
  • once

Конфигурация (~/.openclaw/openclaw.json)

json5
{  talk: {    provider: "elevenlabs",    providers: {      elevenlabs: {        voiceId: "elevenlabs_voice_id",        modelId: "eleven_v3",        outputFormat: "mp3_44100_128",        apiKey: "elevenlabs_api_key",      },      mlx: {        modelId: "mlx-community/Soprano-80M-bf16",      },      system: {},    },    speechLocale: "ru-RU",    silenceTimeoutMs: 1500,    interruptOnSpeech: true,    realtime: {      provider: "openai",      providers: {        openai: {          apiKey: "openai_api_key",          model: "gpt-realtime-2",          voice: "cedar",        },      },      instructions: "Speak warmly and keep answers brief.",      mode: "realtime",      transport: "webrtc",      brain: "agent-consult",    },  },}

Значения по умолчанию:

  • interruptOnSpeech: true
  • silenceTimeoutMs: если не задано, режим разговора сохраняет стандартное для платформы окно паузы перед отправкой транскрипта (700 ms on macOS and Android, 900 ms on iOS)
  • provider: выбирает активного провайдера разговора. Используйте elevenlabs, mlx или system для локальных путей воспроизведения macOS.
  • providers.<provider>.voiceId: откатывается к ELEVENLABS_VOICE_ID / SAG_VOICE_ID для ElevenLabs (или к первому голосу ElevenLabs, если доступен ключ API).
  • providers.elevenlabs.modelId: по умолчанию eleven_v3, если не задано.
  • providers.mlx.modelId: по умолчанию mlx-community/Soprano-80M-bf16, если не задано.
  • providers.elevenlabs.apiKey: откатывается к ELEVENLABS_API_KEY (или к shell-профилю Gateway, если доступен).
  • consultThinkingLevel: необязательное переопределение уровня мышления для полного запуска агента OpenClaw за realtime-вызовами openclaw_agent_consult.
  • consultFastMode: необязательное переопределение быстрого режима для realtime-вызовов openclaw_agent_consult.
  • realtime.provider: выбирает активного браузерного/серверного realtime-провайдера голоса. Используйте openai для WebRTC, google для WebSocket провайдера или провайдера только-моста через ретрансляцию Gateway.
  • realtime.providers.<provider> хранит принадлежащую провайдеру realtime-конфигурацию. Браузер получает только эфемерные или ограниченные учетные данные сеанса, но никогда стандартный ключ API.
  • realtime.providers.openai.voice: встроенный идентификатор голоса OpenAI Realtime. Текущие голоса gpt-realtime-2: alloy, ash, ballad, coral, echo, sage, shimmer, verse, marin и cedar; marin и cedar рекомендуются для лучшего качества.
  • realtime.transport: webrtc и provider-websocket — браузерные realtime-транспорты. Android использует realtime-ретрансляцию только когда задано gateway-relay; в остальных случаях режим разговора Android использует собственный нативный цикл STT/TTS.
  • realtime.brain: agent-consult маршрутизирует realtime-вызовы инструментов через политику Gateway; direct-tools — устаревшее совместимое поведение прямых инструментов; none предназначен для транскрибации или внешней оркестрации.
  • realtime.consultRouting: provider-direct сохраняет прямой ответ провайдера, когда он пропускает openclaw_agent_consult; force-agent-consult вместо этого заставляет ретрансляцию Gateway маршрутизировать финализированные пользовательские транскрипты через OpenClaw.
  • realtime.instructions: добавляет обращенные к провайдеру системные инструкции к встроенному realtime-промпту OpenClaw. Используйте для стиля и тона голоса; OpenClaw сохраняет стандартные указания openclaw_agent_consult.
  • talk.catalog предоставляет допустимые режимы, транспорты, стратегии brain, realtime-форматы аудио и флаги возможностей каждого провайдера, чтобы собственные клиенты режима разговора могли избегать неподдерживаемых комбинаций.
  • Потоковые провайдеры транскрибации обнаруживаются через talk.catalog.transcription. Текущая ретрансляция Gateway использует конфигурацию потокового провайдера Voice Call, пока не будет добавлена выделенная поверхность конфигурации транскрибации режима разговора.
  • speechLocale: необязательный идентификатор локали BCP 47 для распознавания речи режима разговора на устройстве в iOS/macOS. Оставьте незаданным, чтобы использовать значение устройства по умолчанию.
  • outputFormat: по умолчанию pcm_44100 на macOS/iOS и pcm_24000 на Android (задайте mp3_*, чтобы принудительно включить потоковую передачу MP3)

Интерфейс macOS

  • Переключатель в строке меню: Разговор
  • Вкладка конфигурации: группа Режим разговора (идентификатор голоса + переключатель прерывания)
  • Оверлей:
    • Прослушивание: облако пульсирует с уровнем микрофона
    • Обдумывание: погружающаяся анимация
    • Озвучивание: расходящиеся кольца
    • Нажатие на облако: остановить озвучивание
    • Нажатие на X: выйти из режима разговора

Интерфейс Android

  • Переключатель вкладки голоса: Разговор
  • Ручные Микрофон и Разговор являются взаимоисключающими режимами runtime-захвата.
  • Ручной микрофон останавливается, когда приложение покидает передний план или пользователь уходит с вкладки голоса.
  • Режим разговора продолжает работать, пока его не отключат или пока Android-узел не отключится, и во время активности использует тип foreground-службы микрофона Android.

Примечания

  • Требуются разрешения на речь и микрофон.
  • Нативный режим разговора использует активный сеанс Gateway и откатывается к опросу истории только когда события ответа недоступны.
  • Браузерный realtime-режим разговора использует talk.client.toolCall для openclaw_agent_consult вместо предоставления chat.send принадлежащим провайдеру браузерным сеансам.
  • Режим разговора только для транскрибации использует talk.session.create, talk.session.appendAudio, talk.session.cancelTurn и talk.session.close; клиенты подписываются на talk.event для частичных/финальных обновлений транскрипта.
  • Gateway разрешает воспроизведение разговора через talk.speak, используя активного провайдера разговора. Android откатывается к локальному системному TTS только когда этот RPC недоступен.
  • Локальное воспроизведение MLX на macOS использует встроенный помощник openclaw-mlx-tts, если он присутствует, или исполняемый файл в PATH. Задайте OPENCLAW_MLX_TTS_BIN, чтобы указать пользовательский бинарный файл помощника во время разработки.
  • stability для eleven_v3 проверяется на значения 0.0, 0.5 или 1.0; другие модели принимают 0..1.
  • latency_tier проверяется на 0..4, если задано.
  • Android поддерживает выходные форматы pcm_16000, pcm_22050, pcm_24000 и pcm_44100 для низколатентной потоковой передачи AudioTrack.

Связанные материалы

Was this useful?
On this page

On this page