Перейти до основного вмісту

Text-to-speech (TTS)

OpenClaw може перетворювати вихідні відповіді на аудіо за допомогою ElevenLabs, Microsoft, MiniMax або OpenAI. Це працює всюди, де OpenClaw може надсилати аудіо.

Підтримувані сервіси

  • ElevenLabs (основний або резервний провайдер)
  • Microsoft (основний або резервний провайдер; поточна вбудована реалізація використовує node-edge-tts)
  • MiniMax (основний або резервний провайдер; використовує API T2A v2)
  • OpenAI (основний або резервний провайдер; також використовується для summary)

Примітки щодо мовлення Microsoft

Поточний вбудований провайдер мовлення Microsoft використовує онлайн-сервіс нейронного TTS Microsoft Edge через бібліотеку node-edge-tts. Це хостований сервіс (не локальний), який використовує кінцеві точки Microsoft і не потребує API key. node-edge-tts надає параметри конфігурації мовлення та формати виводу, але не всі параметри підтримуються сервісом. Застаріла конфігурація та вхід директив із edge усе ще працюють і нормалізуються до microsoft. Оскільки цей шлях використовує публічний вебсервіс без опублікованого SLA чи квоти, розглядайте його як best-effort. Якщо вам потрібні гарантовані ліміти та підтримка, використовуйте OpenAI або ElevenLabs.

Необов’язкові ключі

Якщо ви хочете використовувати OpenAI, ElevenLabs або MiniMax:
  • ELEVENLABS_API_KEY (або XI_API_KEY)
  • MINIMAX_API_KEY
  • OPENAI_API_KEY
Мовлення Microsoft не потребує API key. Якщо налаштовано кілька провайдерів, спочатку використовується вибраний провайдер, а інші стають резервними варіантами. Auto-summary використовує налаштований summaryModel (або agents.defaults.model.primary), тому якщо ви вмикаєте summary, цей провайдер також має бути автентифікований.

Посилання на сервіси

Чи ввімкнено це типово?

Ні. Auto‑TTS вимкнено типово. Увімкніть його в конфігурації через messages.tts.auto або для окремої сесії через /tts always (псевдонім: /tts on). Коли messages.tts.provider не задано, OpenClaw вибирає перший налаштований провайдер мовлення в порядку auto-select реєстру.

Конфігурація

Конфігурація TTS міститься в messages.tts у openclaw.json. Повна схема наведена в Gateway configuration.

Мінімальна конфігурація (увімкнення + провайдер)

{
  messages: {
    tts: {
      auto: "always",
      provider: "elevenlabs",
    },
  },
}

OpenAI як основний із резервним ElevenLabs

{
  messages: {
    tts: {
      auto: "always",
      provider: "openai",
      summaryModel: "openai/gpt-4.1-mini",
      modelOverrides: {
        enabled: true,
      },
      providers: {
        openai: {
          apiKey: "openai_api_key",
          baseUrl: "https://api.openai.com/v1",
          model: "gpt-4o-mini-tts",
          voice: "alloy",
        },
        elevenlabs: {
          apiKey: "elevenlabs_api_key",
          baseUrl: "https://api.elevenlabs.io",
          voiceId: "voice_id",
          modelId: "eleven_multilingual_v2",
          seed: 42,
          applyTextNormalization: "auto",
          languageCode: "en",
          voiceSettings: {
            stability: 0.5,
            similarityBoost: 0.75,
            style: 0.0,
            useSpeakerBoost: true,
            speed: 1.0,
          },
        },
      },
    },
  },
}

Microsoft як основний (без API key)

{
  messages: {
    tts: {
      auto: "always",
      provider: "microsoft",
      providers: {
        microsoft: {
          enabled: true,
          voice: "en-US-MichelleNeural",
          lang: "en-US",
          outputFormat: "audio-24khz-48kbitrate-mono-mp3",
          rate: "+10%",
          pitch: "-5%",
        },
      },
    },
  },
}

MiniMax як основний

{
  messages: {
    tts: {
      auto: "always",
      provider: "minimax",
      providers: {
        minimax: {
          apiKey: "minimax_api_key",
          baseUrl: "https://api.minimax.io",
          model: "speech-2.8-hd",
          voiceId: "English_expressive_narrator",
          speed: 1.0,
          vol: 1.0,
          pitch: 0,
        },
      },
    },
  },
}

Вимкнення мовлення Microsoft

{
  messages: {
    tts: {
      providers: {
        microsoft: {
          enabled: false,
        },
      },
    },
  },
}

Власні ліміти + шлях до prefs

{
  messages: {
    tts: {
      auto: "always",
      maxTextLength: 4000,
      timeoutMs: 30000,
      prefsPath: "~/.openclaw/settings/tts.json",
    },
  },
}

Відповідати аудіо лише після вхідного голосового повідомлення

{
  messages: {
    tts: {
      auto: "inbound",
    },
  },
}

Вимкнення auto-summary для довгих відповідей

{
  messages: {
    tts: {
      auto: "always",
    },
  },
}
Потім виконайте:
/tts summary off

Примітки щодо полів

  • auto: режим auto‑TTS (off, always, inbound, tagged).
    • inbound надсилає аудіо лише після вхідного голосового повідомлення.
    • tagged надсилає аудіо лише тоді, коли відповідь містить теги [[tts]].
  • enabled: застарілий перемикач (doctor переносить його до auto).
  • mode: "final" (типово) або "all" (включає відповіді інструментів/блоків).
  • provider: id провайдера мовлення, наприклад "elevenlabs", "microsoft", "minimax" або "openai" (резервний варіант вибирається автоматично).
  • Якщо provider не задано, OpenClaw використовує перший налаштований провайдер мовлення в порядку auto-select реєстру.
  • Застаріле provider: "edge" усе ще працює й нормалізується до microsoft.
  • summaryModel: необов’язкова дешева модель для auto-summary; типово agents.defaults.model.primary.
    • Приймає provider/model або налаштований псевдонім моделі.
  • modelOverrides: дозволяє моделі виводити директиви TTS (типово ввімкнено).
    • allowProvider типово дорівнює false (перемикання провайдера вмикається окремо).
  • providers.<id>: налаштування конкретного провайдера за id провайдера мовлення.
  • Застарілі прямі блоки провайдерів (messages.tts.openai, messages.tts.elevenlabs, messages.tts.microsoft, messages.tts.edge) автоматично переносяться до messages.tts.providers.<id> під час завантаження.
  • maxTextLength: жорсткий ліміт для вхідного тексту TTS (символи). /tts audio завершується помилкою, якщо його перевищено.
  • timeoutMs: тайм-аут запиту (мс).
  • prefsPath: перевизначає локальний шлях до JSON prefs (provider/limit/summary).
  • Значення apiKey резервно беруться зі змінних середовища (ELEVENLABS_API_KEY/XI_API_KEY, MINIMAX_API_KEY, OPENAI_API_KEY).
  • providers.elevenlabs.baseUrl: перевизначає базову URL-адресу API ElevenLabs.
  • providers.openai.baseUrl: перевизначає кінцеву точку OpenAI TTS.
    • Порядок визначення: messages.tts.providers.openai.baseUrl -> OPENAI_TTS_BASE_URL -> https://api.openai.com/v1
    • Значення, відмінні від типового, розглядаються як OpenAI-compatible кінцеві точки TTS, тому дозволені власні назви моделей і голосів.
  • providers.elevenlabs.voiceSettings:
    • stability, similarityBoost, style: 0..1
    • useSpeakerBoost: true|false
    • speed: 0.5..2.0 (1.0 = звичайно)
  • providers.elevenlabs.applyTextNormalization: auto|on|off
  • providers.elevenlabs.languageCode: дволітерний ISO 639-1 (наприклад, en, de)
  • providers.elevenlabs.seed: ціле число 0..4294967295 (best-effort determinism)
  • providers.minimax.baseUrl: перевизначає базову URL-адресу API MiniMax (типово https://api.minimax.io, env: MINIMAX_API_HOST).
  • providers.minimax.model: модель TTS (типово speech-2.8-hd, env: MINIMAX_TTS_MODEL).
  • providers.minimax.voiceId: ідентифікатор голосу (типово English_expressive_narrator, env: MINIMAX_TTS_VOICE_ID).
  • providers.minimax.speed: швидкість відтворення 0.5..2.0 (типово 1.0).
  • providers.minimax.vol: гучність (0, 10] (типово 1.0; має бути більшою за 0).
  • providers.minimax.pitch: зсув тону -12..12 (типово 0).
  • providers.microsoft.enabled: дозволяє використання мовлення Microsoft (типово true; без API key).
  • providers.microsoft.voice: назва нейронного голосу Microsoft (наприклад, en-US-MichelleNeural).
  • providers.microsoft.lang: код мови (наприклад, en-US).
  • providers.microsoft.outputFormat: формат виводу Microsoft (наприклад, audio-24khz-48kbitrate-mono-mp3).
    • Коректні значення див. у форматах виводу Microsoft Speech; не всі формати підтримуються вбудованим транспортом на основі Edge.
  • providers.microsoft.rate / providers.microsoft.pitch / providers.microsoft.volume: рядки з відсотками (наприклад, +10%, -5%).
  • providers.microsoft.saveSubtitles: записує JSON-субтитри поруч з аудіофайлом.
  • providers.microsoft.proxy: URL-адреса проксі для запитів мовлення Microsoft.
  • providers.microsoft.timeoutMs: перевизначення тайм-ауту запиту (мс).
  • edge.*: застарілий псевдонім для тих самих налаштувань Microsoft.

Перевизначення, керовані моделлю (типово ввімкнені)

Типово модель може виводити директиви TTS для однієї окремої відповіді. Коли messages.tts.auto має значення tagged, ці директиви потрібні для запуску аудіо. Коли це ввімкнено, модель може виводити директиви [[tts:...]] для перевизначення голосу для однієї відповіді, а також необов’язковий блок [[tts:text]]...[[/tts:text]], щоб додати виразні теги (сміх, підказки до співу тощо), які мають з’являтися лише в аудіо. Директиви provider=... ігноруються, якщо modelOverrides.allowProvider: true не ввімкнено. Приклад payload відповіді:
Here you go.

[[tts:voiceId=pMsXgVXv3BLzUgSXRplE model=eleven_v3 speed=1.1]]
[[tts:text]](laughs) Read the song once more.[[/tts:text]]
Доступні ключі директив (коли ввімкнено):
  • provider (id зареєстрованого провайдера мовлення, наприклад openai, elevenlabs, minimax або microsoft; потребує allowProvider: true)
  • voice (голос OpenAI) або voiceId (ElevenLabs / MiniMax)
  • model (модель OpenAI TTS, id моделі ElevenLabs або модель MiniMax)
  • stability, similarityBoost, style, speed, useSpeakerBoost
  • vol / volume (гучність MiniMax, 0-10)
  • pitch (тон MiniMax, -12 до 12)
  • applyTextNormalization (auto|on|off)
  • languageCode (ISO 639-1)
  • seed
Вимкнення всіх перевизначень моделі:
{
  messages: {
    tts: {
      modelOverrides: {
        enabled: false,
      },
    },
  },
}
Необов’язковий allowlist (увімкнути перемикання провайдера, але залишити інші параметри налаштовуваними):
{
  messages: {
    tts: {
      modelOverrides: {
        enabled: true,
        allowProvider: true,
        allowSeed: false,
      },
    },
  },
}

Налаштування для окремого користувача

Команди slash записують локальні перевизначення до prefsPath (типово: ~/.openclaw/settings/tts.json, можна перевизначити через OPENCLAW_TTS_PREFS або messages.tts.prefsPath). Поля, що зберігаються:
  • enabled
  • provider
  • maxLength (поріг для summary; типово 1500 символів)
  • summarize (типово true)
Вони перевизначають messages.tts.* для цього хоста.

Формати виводу (фіксовані)

  • Feishu / Matrix / Telegram / WhatsApp: голосове повідомлення Opus (opus_48000_64 від ElevenLabs, opus від OpenAI).
    • 48 кГц / 64 кбіт/с — хороший компроміс для голосових повідомлень.
  • Інші канали: MP3 (mp3_44100_128 від ElevenLabs, mp3 від OpenAI).
    • 44.1 кГц / 128 кбіт/с — типовий баланс для чіткості мовлення.
  • MiniMax: MP3 (модель speech-2.8-hd, частота дискретизації 32 кГц). Формат голосових нотаток нативно не підтримується; використовуйте OpenAI або ElevenLabs для гарантованих голосових повідомлень Opus.
  • Microsoft: використовує microsoft.outputFormat (типово audio-24khz-48kbitrate-mono-mp3).
    • Вбудований транспорт приймає outputFormat, але не всі формати доступні в сервісі.
    • Значення форматів виводу відповідають форматам виводу Microsoft Speech (включно з Ogg/WebM Opus).
    • sendVoice у Telegram приймає OGG/MP3/M4A; використовуйте OpenAI/ElevenLabs, якщо вам потрібні гарантовані голосові повідомлення Opus.
    • Якщо налаштований формат виводу Microsoft не спрацьовує, OpenClaw повторює спробу з MP3.
Формати виводу OpenAI/ElevenLabs є фіксованими для кожного каналу (див. вище).

Поведінка Auto-TTS

Коли це ввімкнено, OpenClaw:
  • пропускає TTS, якщо відповідь уже містить медіа або директиву MEDIA:.
  • пропускає дуже короткі відповіді (< 10 символів).
  • виконує summary довгих відповідей, якщо це ввімкнено, за допомогою agents.defaults.model.primary (або summaryModel).
  • додає згенероване аудіо до відповіді.
Якщо відповідь перевищує maxLength, а summary вимкнено (або немає API key для моделі summary), аудіо пропускається, і надсилається звичайна текстова відповідь.

Діаграма потоку

Reply -> TTS enabled?
  no  -> send text
  yes -> has media / MEDIA: / short?
          yes -> send text
          no  -> length > limit?
                   no  -> TTS -> attach audio
                   yes -> summary enabled?
                            no  -> send text
                            yes -> summarize (summaryModel or agents.defaults.model.primary)
                                      -> TTS -> attach audio

Використання slash-команди

Є одна команда: /tts. Подробиці ввімкнення див. у Slash commands. Примітка для Discord: /tts — це вбудована команда Discord, тому OpenClaw реєструє там /voice як нативну команду. Текстовий варіант /tts ... усе ще працює.
/tts off
/tts always
/tts inbound
/tts tagged
/tts status
/tts provider openai
/tts limit 2000
/tts summary off
/tts audio Hello from OpenClaw
Примітки:
  • Команди потребують авторизованого відправника (правила allowlist/owner усе ще застосовуються).
  • Має бути ввімкнено commands.text або реєстрацію нативних команд.
  • off|always|inbound|tagged — це перемикачі для окремої сесії (/tts on є псевдонімом для /tts always).
  • limit і summary зберігаються в локальних prefs, а не в основній конфігурації.
  • /tts audio генерує одноразову аудіовідповідь (не вмикає TTS постійно).
  • /tts status містить видимість fallback для останньої спроби:
    • успішний fallback: Fallback: <primary> -> <used> плюс Attempts: ...
    • помилка: Error: ... плюс Attempts: ...
    • докладна діагностика: Attempt details: provider:outcome(reasonCode) latency
  • Помилки API OpenAI та ElevenLabs тепер містять розібрані деталі помилки провайдера та id запиту (коли провайдер їх повертає), які відображаються в помилках/логах TTS.

Інструмент агента

Інструмент tts перетворює текст на мовлення і повертає аудіовкладення для доставки у відповіді. Коли каналом є Feishu, Matrix, Telegram або WhatsApp, аудіо доставляється як голосове повідомлення, а не як файлове вкладення.

Gateway RPC

Методи Gateway:
  • tts.status
  • tts.enable
  • tts.disable
  • tts.convert
  • tts.setProvider
  • tts.providers