Nodes and media

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

Режим розмови має дві runtime-форми:

  • Нативний режим розмови macOS/iOS/Android використовує локальне розпізнавання мовлення, чат Gateway і TTS talk.speak. Node оголошують можливість talk і визначають команди talk.*, які вони підтримують.
  • Браузерний режим розмови використовує talk.client.create для клієнтських сеансів webrtc і provider-websocket або talk.session.create для сеансів gateway-relay, якими володіє Gateway. managed-room зарезервовано для передавання керування Gateway і кімнат walkie-talkie.
  • Клієнти лише для транскрипції використовують 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)

Браузерний режим розмови в реальному часі пересилає виклики інструментів провайдера через talk.client.toolCall; браузерні клієнти не викликають chat.send напряму для консультацій у реальному часі.

Режим розмови лише для транскрипції створює ту саму спільну оболонку подій розмови, що й сеанси реального часу та STT/TTS, але використовує mode: "transcription" і brain: "none". Він призначений для субтитрів, диктування та захоплення мовлення лише для спостереження; разові завантажені голосові нотатки й надалі використовують шлях media/audio.

Поведінка (macOS)

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

Голосові директиви у відповідях

Асистент може додати на початку своєї відповіді один рядок 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)

{
  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",
          voice: "alloy",
        },
      },
      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, якщо доступний).
  • realtime.provider: вибирає активного браузерного/серверного голосового провайдера реального часу. Використовуйте openai для WebRTC, google для provider WebSocket або провайдера лише для мосту через Gateway relay.
  • realtime.providers.<provider> зберігає конфігурацію реального часу, що належить провайдеру. Браузер отримує лише ефемерні або обмежені облікові дані сеансу, ніколи не стандартний ключ API.
  • realtime.brain: agent-consult маршрутизує виклики інструментів реального часу через політику Gateway; direct-tools — це поведінка сумісності лише для власника; none призначено для транскрипції або зовнішньої оркестрації.
  • talk.catalog надає допустимі режими, транспорти, стратегії brain, аудіоформати реального часу та прапорці можливостей кожного провайдера, щоб first-party клієнти розмови могли уникати непідтримуваних комбінацій.
  • Провайдери потокової транскрипції виявляються через talk.catalog.transcription. Поточний Gateway relay використовує конфігурацію потокового провайдера Voice Call, доки не буде додано окрему конфігураційну поверхню транскрипції розмови.
  • speechLocale: необов'язковий ідентифікатор локалі BCP 47 для вбудованого в пристрій розпізнавання мовлення розмови на iOS/macOS. Залиште незаданим, щоб використовувати стандартне значення пристрою.
  • outputFormat: стандартно дорівнює pcm_44100 на macOS/iOS і pcm_24000 на Android (задайте mp3_*, щоб примусово ввімкнути потокове MP3)

UI macOS

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

UI Android

  • Перемикач на вкладці голосу: Розмова
  • Ручні режими Мікрофон і Розмова є взаємовиключними режимами захоплення під час виконання.
  • Ручний мікрофон зупиняється, коли застосунок виходить із переднього плану або користувач залишає вкладку голосу.
  • Режим розмови працює, доки його не вимкнуть або Android Node не від'єднається, і під час активності використовує тип foreground-service мікрофона Android.

Примітки

  • Потребує дозволів на Speech і Microphone.
  • Нативний режим розмови використовує активний сеанс Gateway і повертається до polling історії лише тоді, коли події відповіді недоступні.
  • Браузерний режим розмови в реальному часі використовує 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 використовує вбудований helper openclaw-mlx-tts, коли він наявний, або виконуваний файл у PATH. Задайте OPENCLAW_MLX_TTS_BIN, щоб указати власний helper-бінарник під час розробки.
  • 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.

Пов'язане