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, коли їм потрібні субтитри або диктування без голосової відповіді асистента.
Нативний режим розмови — це безперервний цикл голосової розмови:
- Слухати мовлення
- Надіслати транскрипт до моделі через активний сеанс
- Дочекатися відповіді
- Озвучити її через налаштованого провайдера розмови (
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/voiceIdmodel/model_id/modelIdspeed,rate(WPM),stability,similarity,style,speakerBoostseed,normalize,lang,output_format,latency_tieronce
Конфігурація (~/.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: truesilenceTimeoutMs: якщо не задано, режим розмови зберігає стандартне для платформи вікно паузи перед надсиланням транскрипту (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.