---
read_when:
    - Włączanie zamiany tekstu na mowę dla odpowiedzi
    - Konfigurowanie dostawcy TTS, łańcucha awaryjnego lub persony
    - Używanie poleceń lub dyrektyw /tts
sidebarTitle: Text to speech (TTS)
summary: Tekst na mowę dla odpowiedzi wychodzących — dostawcy, persony, polecenia slash i wyjście dla poszczególnych kanałów
title: Zamiana tekstu na mowę
x-i18n:
    generated_at: "2026-06-27T18:32:24Z"
    model: gpt-5.5
    postprocess_version: locale-links-v1
    provider: openai
    source_hash: 94835daf766286e937c57828818a4ee0a20e6d5894b7d51d6f98fc7ebdaffe35
    source_path: tools/tts.md
    workflow: 16
---

OpenClaw może konwertować odpowiedzi wychodzące na audio przy użyciu **14 dostawców mowy**
i dostarczać natywne wiadomości głosowe w Feishu, Matrix, Telegram i WhatsApp,
załączniki audio wszędzie indziej oraz strumienie PCM/Ulaw dla telefonii i Talk.

TTS to połowa trybu `stt-tts` w Talk odpowiedzialna za wyjście mowy. Natywne dla dostawcy
sesje Talk typu `realtime` syntetyzują mowę wewnątrz dostawcy czasu rzeczywistego zamiast
wywoływać tę ścieżkę TTS, natomiast sesje `transcription` nie syntetyzują
głosowej odpowiedzi asystenta.

## Szybki start

<Steps>
  <Step title="Wybierz dostawcę">
    OpenAI i ElevenLabs to najbardziej niezawodne opcje hostowane. Microsoft i
    Local CLI działają bez klucza API. Pełną listę znajdziesz w [macierzy dostawców](#supported-providers).
  </Step>
  <Step title="Ustaw klucz API">
    Wyeksportuj zmienną środowiskową dla swojego dostawcy (na przykład `OPENAI_API_KEY`,
    `ELEVENLABS_API_KEY`). Microsoft i Local CLI nie wymagają klucza.
  </Step>
  <Step title="Włącz w konfiguracji">
    Ustaw `messages.tts.auto: "always"` i `messages.tts.provider`:

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

  </Step>
  <Step title="Wypróbuj w czacie">
    `/tts status` pokazuje bieżący stan. `/tts audio Hello from OpenClaw`
    wysyła jednorazową odpowiedź audio.
  </Step>
</Steps>

<Note>
Auto-TTS jest domyślnie **wyłączone**. Gdy `messages.tts.provider` nie jest ustawione,
OpenClaw wybiera pierwszego skonfigurowanego dostawcę zgodnie z kolejnością automatycznego wyboru w rejestrze.
Wbudowane narzędzie agenta `tts` działa tylko przy wyraźnej intencji: zwykły czat pozostaje
tekstowy, chyba że użytkownik poprosi o audio, użyje `/tts` albo włączy mowę Auto-TTS/dyrektywy.
</Note>

## Obsługiwani dostawcy

| Dostawca          | Uwierzytelnianie                                                                                                 | Uwagi                                                                                       |
| ----------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| **Azure Speech**  | `AZURE_SPEECH_KEY` + `AZURE_SPEECH_REGION` (także `AZURE_SPEECH_API_KEY`, `SPEECH_KEY`, `SPEECH_REGION`)          | Natywne wyjście notatki głosowej Ogg/Opus i telefonia.                                            |
| **DeepInfra**     | `DEEPINFRA_API_KEY`                                                                                              | TTS zgodny z OpenAI. Domyślnie `hexgrad/Kokoro-82M`.                                    |
| **ElevenLabs**    | `ELEVENLABS_API_KEY` lub `XI_API_KEY`                                                                             | Klonowanie głosu, wielojęzyczność, deterministycznie przez `seed`; strumieniowane dla odtwarzania głosu w Discord. |
| **Google Gemini** | `GEMINI_API_KEY` lub `GOOGLE_API_KEY`                                                                             | Wsadowe TTS w Gemini API; uwzględnia personę przez `promptTemplate: "audio-profile-v1"`.               |
| **Gradium**       | `GRADIUM_API_KEY`                                                                                                | Wyjście notatki głosowej i telefonii.                                                            |
| **Inworld**       | `INWORLD_API_KEY`                                                                                                | Streamingowe API TTS. Natywna notatka głosowa Opus i telefonia PCM.                                |
| **Local CLI**     | brak                                                                                                             | Uruchamia skonfigurowane lokalne polecenie TTS.                                                        |
| **Microsoft**     | brak                                                                                                             | Publiczne neuronowe TTS Edge przez `node-edge-tts`. Najlepszy możliwy wysiłek, bez SLA.                            |
| **MiniMax**       | `MINIMAX_API_KEY` (lub plan Token: `MINIMAX_OAUTH_TOKEN`, `MINIMAX_CODE_PLAN_KEY`, `MINIMAX_CODING_API_KEY`)      | API T2A v2. Domyślnie `speech-2.8-hd`.                                                    |
| **OpenAI**        | `OPENAI_API_KEY`                                                                                                 | Używany także do automatycznego podsumowania; obsługuje personę `instructions`.                                |
| **OpenRouter**    | `OPENROUTER_API_KEY` (może ponownie używać `models.providers.openrouter.apiKey`)                                            | Domyślny model `hexgrad/kokoro-82m`.                                                         |
| **Volcengine**    | `VOLCENGINE_TTS_API_KEY` lub `BYTEPLUS_SEED_SPEECH_API_KEY` (starsze AppID/token: `VOLCENGINE_TTS_APPID`/`_TOKEN`) | HTTP API BytePlus Seed Speech.                                                              |
| **Vydra**         | `VYDRA_API_KEY`                                                                                                  | Wspólny dostawca obrazów, wideo i mowy.                                                   |
| **xAI**           | `XAI_API_KEY`                                                                                                    | Wsadowe TTS xAI. Natywna notatka głosowa Opus **nie** jest obsługiwana.                                 |
| **Xiaomi MiMo**   | `XIAOMI_API_KEY`                                                                                                 | MiMo TTS przez uzupełnienia czatu Xiaomi.                                                   |

Jeśli skonfigurowano wielu dostawców, wybrany dostawca jest używany jako pierwszy, a
pozostali są opcjami zapasowymi. Automatyczne podsumowanie używa `summaryModel` (lub
`agents.defaults.model.primary`), więc ten dostawca także musi być uwierzytelniony,
jeśli podsumowania pozostają włączone.

<Warning>
Dołączony dostawca **Microsoft** używa internetowej usługi neuronowego TTS Microsoft Edge
przez `node-edge-tts`. Jest to publiczna usługa WWW bez opublikowanego
SLA ani limitu — traktuj ją jako najlepszy możliwy wysiłek. Starszy identyfikator dostawcy `edge` jest
normalizowany do `microsoft`, a `openclaw doctor --fix` przepisuje utrwaloną
konfigurację; nowe konfiguracje powinny zawsze używać `microsoft`.
</Warning>

## Konfiguracja

Konfiguracja TTS znajduje się pod `messages.tts` w `~/.openclaw/openclaw.json`. Wybierz
preset i dostosuj blok dostawcy:

<Tabs>
  <Tab title="Azure Speech">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "azure-speech",
      providers: {
        "azure-speech": {
          apiKey: "${AZURE_SPEECH_KEY}",
          region: "eastus",
          speakerVoice: "en-US-JennyNeural",
          lang: "en-US",
          outputFormat: "audio-24khz-48kbitrate-mono-mp3",
          voiceNoteOutputFormat: "ogg-24khz-16bit-mono-opus",
        },
      },
    },
  },
}
```
  </Tab>
  <Tab title="ElevenLabs">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "elevenlabs",
      providers: {
        elevenlabs: {
          apiKey: "${ELEVENLABS_API_KEY}",
          model: "eleven_multilingual_v2",
          speakerVoiceId: "EXAVITQu4vr4xnSDxMaL",
        },
      },
    },
  },
}
```
  </Tab>
  <Tab title="Google Gemini">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "google",
      providers: {
        google: {
          apiKey: "${GEMINI_API_KEY}",
          model: "gemini-3.1-flash-tts-preview",
          speakerVoice: "Kore",
          // Optional natural-language style prompts:
          // audioProfile: "Speak in a calm, podcast-host tone.",
          // speakerName: "Alex",
        },
      },
    },
  },
}
```
  </Tab>
  <Tab title="Gradium">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "gradium",
      providers: {
        gradium: {
          apiKey: "${GRADIUM_API_KEY}",
          speakerVoiceId: "YTpq7expH9539ERJ",
        },
      },
    },
  },
}
```
  </Tab>
  <Tab title="Inworld">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "inworld",
      providers: {
        inworld: {
          apiKey: "${INWORLD_API_KEY}",
          modelId: "inworld-tts-1.5-max",
          speakerVoiceId: "Sarah",
          temperature: 0.7,
        },
      },
    },
  },
}
```
  </Tab>
  <Tab title="Local CLI">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "tts-local-cli",
      providers: {
        "tts-local-cli": {
          command: "say",
          args: ["-o", "{{OutputPath}}", "{{Text}}"],
          outputFormat: "wav",
          timeoutMs: 120000,
        },
      },
    },
  },
}
```
  </Tab>
  <Tab title="Microsoft (bez klucza)">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "microsoft",
      providers: {
        microsoft: {
          enabled: true,
          speakerVoice: "en-US-MichelleNeural",
          lang: "en-US",
          outputFormat: "audio-24khz-48kbitrate-mono-mp3",
          rate: "+0%",
          pitch: "+0%",
        },
      },
    },
  },
}
```
  </Tab>
  <Tab title="MiniMax">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "minimax",
      providers: {
        minimax: {
          apiKey: "${MINIMAX_API_KEY}",
          model: "speech-2.8-hd",
          speakerVoiceId: "English_expressive_narrator",
          speed: 1.0,
          vol: 1.0,
          pitch: 0,
        },
      },
    },
  },
}
```
  </Tab>
  <Tab title="OpenAI + ElevenLabs">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "openai",
      summaryModel: "openai/gpt-4.1-mini",
      modelOverrides: { enabled: true },
      providers: {
        openai: {
          apiKey: "${OPENAI_API_KEY}",
          model: "gpt-4o-mini-tts",
          speakerVoice: "alloy",
        },
        elevenlabs: {
          apiKey: "${ELEVENLABS_API_KEY}",
          model: "eleven_multilingual_v2",
          speakerVoiceId: "EXAVITQu4vr4xnSDxMaL",
          voiceSettings: { stability: 0.5, similarityBoost: 0.75, style: 0.0, useSpeakerBoost: true, speed: 1.0 },
          applyTextNormalization: "auto",
          languageCode: "en",
        },
      },
    },
  },
}
```
  </Tab>
  <Tab title="OpenRouter">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "openrouter",
      providers: {
        openrouter: {
          apiKey: "${OPENROUTER_API_KEY}",
          model: "hexgrad/kokoro-82m",
          speakerVoice: "af_alloy",
          responseFormat: "mp3",
        },
      },
    },
  },
}
```
  </Tab>
  <Tab title="Volcengine">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "volcengine",
      providers: {
        volcengine: {
          apiKey: "${VOLCENGINE_TTS_API_KEY}",
          resourceId: "seed-tts-1.0",
          speakerVoice: "en_female_anna_mars_bigtts",
        },
      },
    },
  },
}
```
  </Tab>
  <Tab title="xAI">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "xai",
      providers: {
        xai: {
          apiKey: "${XAI_API_KEY}",
          speakerVoiceId: "eve",
          language: "en",
          responseFormat: "mp3",
        },
      },
    },
  },
}
```
  </Tab>
  <Tab title="Xiaomi MiMo">
```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "xiaomi",
      providers: {
        xiaomi: {
          apiKey: "${XIAOMI_API_KEY}",
          model: "mimo-v2.5-tts",
          speakerVoice: "mimo_default",
          format: "mp3",
        },
      },
    },
  },
}
```
  </Tab>
</Tabs>

Dla Xiaomi `mimo-v2.5-tts-voicedesign` pomiń `speakerVoice` i ustaw `style` na
prompt projektowania głosu. OpenClaw wysyła ten prompt jako wiadomość `user` TTS
i nie wysyła `audio.voice` dla modelu voicedesign.

### Nadpisania głosu dla poszczególnych agentów

Użyj `agents.list[].tts`, gdy jeden agent powinien mówić z innym dostawcą,
głosem, modelem, personą lub trybem auto-TTS. Blok agenta jest głęboko scalany z
`messages.tts`, więc dane uwierzytelniające dostawcy mogą pozostać w globalnej konfiguracji dostawcy:

```json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "elevenlabs",
      providers: {
        elevenlabs: { apiKey: "${ELEVENLABS_API_KEY}", model: "eleven_multilingual_v2" },
      },
    },
  },
  agents: {
    list: [
      {
        id: "reader",
        tts: {
          providers: {
            elevenlabs: { speakerVoiceId: "EXAVITQu4vr4xnSDxMaL" },
          },
        },
      },
    ],
  },
}
```

Aby przypiąć personę dla konkretnego agenta, ustaw `agents.list[].tts.persona` obok konfiguracji
dostawcy — zastępuje ona globalne `messages.tts.persona` tylko dla tego agenta.

Kolejność pierwszeństwa dla automatycznych odpowiedzi, `/tts audio`, `/tts status` i narzędzia agenta
`tts`:

1. `messages.tts`
2. aktywne `agents.list[].tts`
3. nadpisanie kanału, gdy kanał obsługuje `channels.<channel>.tts`
4. nadpisanie konta, gdy kanał przekazuje `channels.<channel>.accounts.<id>.tts`
5. lokalne preferencje `/tts` dla tego hosta
6. dyrektywy inline `[[tts:...]]`, gdy [nadpisania modelu](#model-driven-directives) są włączone

Nadpisania kanału i konta używają tego samego kształtu co `messages.tts` i
głęboko scalają się z wcześniejszymi warstwami, więc współdzielone dane uwierzytelniające dostawcy mogą pozostać w
`messages.tts`, podczas gdy kanał lub konto bota zmienia tylko głos lektora, model, personę
albo tryb automatyczny:

```json5
{
  messages: {
    tts: {
      provider: "openai",
      providers: {
        openai: { apiKey: "${OPENAI_API_KEY}", model: "gpt-4o-mini-tts" },
      },
    },
  },
  channels: {
    feishu: {
      accounts: {
        english: {
          tts: {
            providers: {
              openai: { speakerVoice: "shimmer" },
            },
          },
        },
      },
    },
  },
}
```

## Persony

**Persona** to stabilna tożsamość mówiona, którą można deterministycznie stosować
u różnych dostawców. Może preferować jednego dostawcę, definiować neutralną wobec dostawców intencję promptu
oraz przenosić powiązania specyficzne dla dostawcy dla głosów, modeli, szablonów promptów,
ziaren i ustawień głosu.

### Minimalna persona

```json5
{
  messages: {
    tts: {
      auto: "always",
      persona: "narrator",
      personas: {
        narrator: {
          label: "Narrator",
          provider: "elevenlabs",
          providers: {
            elevenlabs: {
              speakerVoiceId: "EXAVITQu4vr4xnSDxMaL",
              modelId: "eleven_multilingual_v2",
            },
          },
        },
      },
    },
  },
}
```

### Pełna persona (prompt neutralny wobec dostawcy)

```json5
{
  messages: {
    tts: {
      auto: "always",
      persona: "alfred",
      personas: {
        alfred: {
          label: "Alfred",
          description: "Dry, warm British butler narrator.",
          provider: "google",
          fallbackPolicy: "preserve-persona",
          prompt: {
            profile: "A brilliant British butler. Dry, witty, warm, charming, emotionally expressive, never generic.",
            scene: "A quiet late-night study. Close-mic narration for a trusted operator.",
            sampleContext: "The speaker is answering a private technical request with concise confidence and dry warmth.",
            style: "Refined, understated, lightly amused.",
            accent: "British English.",
            pacing: "Measured, with short dramatic pauses.",
            constraints: ["Do not read configuration values aloud.", "Do not explain the persona."],
          },
          providers: {
            google: {
              model: "gemini-3.1-flash-tts-preview",
              speakerVoice: "Algieba",
              promptTemplate: "audio-profile-v1",
            },
            openai: { model: "gpt-4o-mini-tts", speakerVoice: "cedar" },
            elevenlabs: {
              speakerVoiceId: "voice_id",
              modelId: "eleven_multilingual_v2",
              seed: 42,
              voiceSettings: {
                stability: 0.65,
                similarityBoost: 0.8,
                style: 0.25,
                useSpeakerBoost: true,
                speed: 0.95,
              },
            },
          },
        },
      },
    },
  },
}
```

### Rozstrzyganie persony

Aktywna persona jest wybierana deterministycznie:

1. lokalna preferencja `/tts persona <id>`, jeśli ustawiona.
2. `messages.tts.persona`, jeśli ustawione.
3. Brak persony.

Wybór dostawcy działa według zasady „najpierw jawne ustawienia”:

1. Bezpośrednie nadpisania (CLI, Gateway, Talk, dozwolone dyrektywy TTS).
2. Lokalna preferencja `/tts provider <id>`.
3. `provider` aktywnej persony.
4. `messages.tts.provider`.
5. Automatyczny wybór z rejestru.

Dla każdej próby dostawcy OpenClaw scala konfiguracje w tej kolejności:

1. `messages.tts.providers.<id>`
2. `messages.tts.personas.<persona>.providers.<id>`
3. Zaufane nadpisania żądania
4. Dozwolone nadpisania z dyrektyw TTS wyemitowanych przez model

### Jak dostawcy używają promptów persony

Pola promptu persony (`profile`, `scene`, `sampleContext`, `style`, `accent`,
`pacing`, `constraints`) są **neutralne wobec dostawcy**. Każdy dostawca decyduje, jak
ich używać:

<AccordionGroup>
  <Accordion title="Google Gemini">
    Opakowuje pola promptu persony w strukturę promptu Gemini TTS **tylko wtedy, gdy**
    efektywna konfiguracja dostawcy Google ustawia `promptTemplate: "audio-profile-v1"`
    albo `personaPrompt`. Starsze pola `audioProfile` i `speakerName` nadal są
    dołączane na początku jako tekst promptu specyficzny dla Google. Tagi audio inline, takie jak
    `[whispers]` lub `[laughs]` wewnątrz bloku `[[tts:text]]`, są zachowywane
    w transkrypcie Gemini; OpenClaw nie generuje tych tagów.
  </Accordion>
  <Accordion title="OpenAI">
    Mapuje pola promptu persony na pole żądania `instructions` **tylko wtedy, gdy**
    nie skonfigurowano jawnych OpenAI `instructions`. Jawne `instructions`
    zawsze ma pierwszeństwo.
  </Accordion>
  <Accordion title="Inni dostawcy">
    Używają tylko powiązań persony specyficznych dla dostawcy pod
    `personas.<id>.providers.<provider>`. Pola promptu persony są ignorowane,
    chyba że dostawca implementuje własne mapowanie promptu persony.
  </Accordion>
</AccordionGroup>

### Zasada fallbacku

`fallbackPolicy` kontroluje zachowanie, gdy persona **nie ma powiązania** dla
próbowanego dostawcy:

| Zasada              | Zachowanie                                                                                                                                         |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| `preserve-persona`  | **Domyślne.** Pola promptu neutralne wobec dostawcy pozostają dostępne; dostawca może ich użyć lub je zignorować.                                            |
| `provider-defaults` | Persona jest pomijana podczas przygotowania promptu dla tej próby; dostawca używa swoich neutralnych ustawień domyślnych, podczas gdy fallback do innych dostawców trwa dalej. |
| `fail`              | Pomiń tę próbę dostawcy z `reasonCode: "not_configured"` i `personaBinding: "missing"`. Dostawcy fallbacku nadal są próbowani.              |

Całe żądanie TTS kończy się niepowodzeniem tylko wtedy, gdy **każdy** próbowany dostawca zostanie pominięty
albo zakończy się niepowodzeniem.

Wybór dostawcy sesji Talk jest ograniczony do sesji. Klient Talk powinien wybierać
identyfikatory dostawców, identyfikatory modeli, identyfikatory głosów i ustawienia regionalne z `talk.catalog` oraz przekazywać
je przez sesję Talk lub żądanie handoff. Otwarcie sesji głosowej nie powinno
mutować `messages.tts` ani globalnych domyślnych ustawień dostawców Talk.

## Dyrektywy sterowane modelem

Domyślnie asystent **może** emitować dyrektywy `[[tts:...]]`, aby nadpisać
głos, model lub prędkość dla pojedynczej odpowiedzi, a także opcjonalny
blok `[[tts:text]]...[[/tts:text]]` dla wskazówek ekspresyjnych, które powinny pojawić się
tylko w audio:

```text
Here you go.

[[tts:speakerVoiceId=pMsXgVXv3BLzUgSXRplE model=eleven_v3 speed=1.1]]
[[tts:text]](laughs) Read the song once more.[[/tts:text]]
```

Gdy `messages.tts.auto` ma wartość `"tagged"`, **dyrektywy są wymagane**, aby wyzwolić
audio. Dostarczanie bloków strumieniowych usuwa dyrektywy z widocznego tekstu, zanim
kanał je zobaczy, nawet gdy są podzielone między sąsiednie bloki.

`provider=...` jest ignorowane, chyba że `modelOverrides.allowProvider: true`. Gdy
odpowiedź deklaruje `provider=...`, pozostałe klucze w tej dyrektywie są parsowane
tylko przez tego dostawcę; nieobsługiwane klucze są usuwane i raportowane jako ostrzeżenia
dyrektyw TTS.

**Dostępne klucze dyrektyw:**

- `provider` (zarejestrowany identyfikator dostawcy; wymaga `allowProvider: true`)
- `speakerVoice` / `speakerVoiceId` (starsze aliasy: `voice`, `voiceName`, `voice_name`, `google_voice`, `voiceId`)
- `model` / `google_model`
- `stability`, `similarityBoost`, `style`, `speed`, `useSpeakerBoost`
- `vol` / `volume` (głośność MiniMax, 0–10)
- `pitch` (całkowita wysokość tonu MiniMax, −12 do 12; wartości ułamkowe są obcinane)
- `emotion` (tag emocji Volcengine)
- `applyTextNormalization` (`auto|on|off`)
- `languageCode` (ISO 639-1)
- `seed`

**Całkowicie wyłącz nadpisania modelu:**

```json5
{ messages: { tts: { modelOverrides: { enabled: false } } } }
```

**Zezwól na przełączanie dostawców, pozostawiając inne pokrętła konfigurowalne:**

```json5
{ messages: { tts: { modelOverrides: { enabled: true, allowProvider: true, allowSeed: false } } } }
```

## Polecenia slash

Pojedyncze polecenie `/tts`. W Discord OpenClaw rejestruje także `/voice`, ponieważ
`/tts` jest wbudowanym poleceniem Discord — tekstowe `/tts ...` nadal działa.

```text
/tts off | on | status
/tts chat on | off | default
/tts latest
/tts provider <id>
/tts persona <id> | off
/tts limit <chars>
/tts summary off
/tts audio <text>
```

<Note>
Polecenia wymagają autoryzowanego nadawcy (obowiązują reguły listy dozwolonych/właściciela) oraz włączenia
`commands.text` albo natywnej rejestracji poleceń.
</Note>

Uwagi dotyczące zachowania:

- `/tts on` zapisuje lokalną preferencję TTS jako `always`; `/tts off` zapisuje ją jako `off`.
- `/tts chat on|off|default` zapisuje nadpisanie auto-TTS o zakresie sesji dla bieżącego czatu.
- `/tts persona <id>` zapisuje lokalną preferencję persony; `/tts persona off` ją czyści.
- `/tts latest` odczytuje najnowszą odpowiedź asystenta z transkryptu bieżącej sesji i wysyła ją jednorazowo jako audio. Przechowuje tylko skrót tej odpowiedzi we wpisie sesji, aby tłumić zduplikowane wysyłki głosowe.
- `/tts audio` generuje jednorazową odpowiedź audio (**nie** włącza TTS).
- `limit` i `summary` są przechowywane w **lokalnych preferencjach**, nie w głównej konfiguracji.
- `/tts status` zawiera diagnostykę fallbacku dla najnowszej próby — `Fallback: <primary> -> <used>`, `Attempts: ...` oraz szczegóły każdej próby (`provider:outcome(reasonCode) latency`).
- `/status` pokazuje aktywny tryb TTS oraz skonfigurowanego dostawcę, model, głos i oczyszczone metadane niestandardowego punktu końcowego, gdy TTS jest włączony.

## Preferencje użytkownika

Polecenia slash zapisują lokalne nadpisania do `prefsPath`. Wartość domyślna to
`~/.openclaw/settings/tts.json`; nadpisz ją zmienną środowiskową `OPENCLAW_TTS_PREFS`
albo `messages.tts.prefsPath`.

| Przechowywane pole | Efekt                                       |
| ------------ | -------------------------------------------- |
| `auto`       | Lokalne nadpisanie auto-TTS (`always`, `off`, …) |
| `provider`   | Lokalne nadpisanie głównego dostawcy              |
| `persona`    | Lokalne nadpisanie persony                       |
| `maxLength`  | Próg podsumowania (domyślnie `1500` znaków)     |
| `summarize`  | Przełącznik podsumowania (domyślnie `true`)              |

Zastępują one efektywną konfigurację z `messages.tts` oraz aktywny
blok `agents.list[].tts` dla tego hosta.

## Formaty wyjściowe (stałe)

Dostarczanie głosu TTS jest sterowane możliwościami kanału. Pluginy kanałów ogłaszają,
czy TTS w stylu głosu powinien prosić dostawców o natywny cel `voice-note`, czy
zachować zwykłą syntezę `audio-file` i tylko oznaczać zgodne wyjście do dostarczania
głosu.

- **Kanały obsługujące notatki głosowe**: odpowiedzi jako notatki głosowe preferują Opus (`opus_48000_64` z ElevenLabs, `opus` z OpenAI).
  - 48 kHz / 64 kbps to dobry kompromis dla wiadomości głosowej.
- **Feishu / WhatsApp**: gdy odpowiedź jako notatka głosowa zostanie utworzona jako MP3/WebM/WAV/M4A
  lub inny prawdopodobny plik audio, Plugin kanału transkoduje ją do 48 kHz
  Ogg/Opus za pomocą `ffmpeg` przed wysłaniem natywnej wiadomości głosowej. WhatsApp wysyła
  wynik przez ładunek Baileys `audio` z `ptt: true` i
  `audio/ogg; codecs=opus`. Jeśli konwersja się nie powiedzie, Feishu otrzymuje oryginalny
  plik jako załącznik; wysyłanie WhatsApp kończy się niepowodzeniem zamiast opublikowania niezgodnego
  ładunku PTT.
- **Inne kanały**: MP3 (`mp3_44100_128` z ElevenLabs, `mp3` z OpenAI).
  - 44,1 kHz / 128 kbps to domyślny balans dla klarowności mowy.
- **MiniMax**: MP3 (model `speech-2.8-hd`, częstotliwość próbkowania 32 kHz) dla zwykłych załączników audio. W przypadku celów notatek głosowych ogłaszanych przez kanał OpenClaw transkoduje MP3 MiniMax do 48 kHz Opus za pomocą `ffmpeg` przed dostarczeniem, gdy kanał ogłasza obsługę transkodowania.
- **Xiaomi MiMo**: domyślnie MP3 albo WAV po skonfigurowaniu. W przypadku celów notatek głosowych ogłaszanych przez kanał OpenClaw transkoduje wyjście Xiaomi do 48 kHz Opus za pomocą `ffmpeg` przed dostarczeniem, gdy kanał ogłasza obsługę transkodowania.
- **Lokalny CLI**: używa skonfigurowanego `outputFormat`. Cele notatek głosowych są
  konwertowane do Ogg/Opus, a wyjście telefoniczne jest konwertowane do surowego, monofonicznego PCM 16 kHz
  za pomocą `ffmpeg`.
- **Google Gemini**: TTS Gemini API zwraca surowy PCM 24 kHz. OpenClaw opakowuje go jako WAV dla załączników audio, transkoduje go do 48 kHz Opus dla celów notatek głosowych i zwraca PCM bezpośrednio dla Talk/telefonii.
- **Gradium**: WAV dla załączników audio, Opus dla celów notatek głosowych i `ulaw_8000` przy 8 kHz dla telefonii.
- **Inworld**: MP3 dla zwykłych załączników audio, natywne `OGG_OPUS` dla celów notatek głosowych i surowe `PCM` przy 22050 Hz dla Talk/telefonii.
- **xAI**: domyślnie MP3; `responseFormat` może być `mp3`, `wav`, `pcm`, `mulaw` albo `alaw`. OpenClaw używa wsadowego punktu końcowego REST TTS xAI i zwraca kompletny załącznik audio; strumieniowy WebSocket TTS xAI nie jest używany przez tę ścieżkę dostawcy. Natywny format notatek głosowych Opus nie jest obsługiwany przez tę ścieżkę.
- **Microsoft**: używa `microsoft.outputFormat` (domyślnie `audio-24khz-48kbitrate-mono-mp3`).
  - Dołączony transport akceptuje `outputFormat`, ale nie wszystkie formaty są dostępne z usługi.
  - Wartości formatu wyjściowego są zgodne z formatami wyjściowymi Microsoft Speech (w tym Ogg/WebM Opus).
  - Telegram `sendVoice` akceptuje OGG/MP3/M4A; użyj OpenAI/ElevenLabs, jeśli potrzebujesz
    gwarantowanych wiadomości głosowych Opus.
  - Jeśli skonfigurowany format wyjściowy Microsoft zawiedzie, OpenClaw ponawia próbę z MP3.

Formaty wyjściowe OpenAI/ElevenLabs są stałe dla każdego kanału (zobacz powyżej).

## Zachowanie Auto-TTS

Gdy `messages.tts.auto` jest włączone, OpenClaw:

- Pomija TTS, jeśli odpowiedź zawiera już media strukturalne.
- Pomija bardzo krótkie odpowiedzi (poniżej 10 znaków).
- Streszcza długie odpowiedzi, gdy streszczenia są włączone, używając
  `summaryModel` (albo `agents.defaults.model.primary`).
- Dołącza wygenerowane audio do odpowiedzi.
- W `mode: "final"` nadal wysyła TTS tylko audio dla strumieniowanych odpowiedzi końcowych
  po zakończeniu strumienia tekstu; wygenerowane media przechodzą przez tę samą
  normalizację mediów kanału co zwykłe załączniki odpowiedzi.

Jeśli odpowiedź przekracza `maxLength`, a streszczenie jest wyłączone (albo brakuje klucza API dla
modelu streszczania), audio jest pomijane i wysyłana jest zwykła odpowiedź tekstowa.

```text
Reply -> TTS enabled?
  no  -> send text
  yes -> has media / short?
          yes -> send text
          no  -> length > limit?
                   no  -> TTS -> attach audio
                   yes -> summary enabled?
                            no  -> send text
                            yes -> summarize -> TTS -> attach audio
```

## Formaty wyjściowe według kanału

| Cel                                   | Format                                                                                                                                |
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| Feishu / Matrix / Telegram / WhatsApp | Odpowiedzi jako notatki głosowe preferują **Opus** (`opus_48000_64` z ElevenLabs, `opus` z OpenAI). 48 kHz / 64 kbps równoważy klarowność i rozmiar. |
| Inne kanały                           | **MP3** (`mp3_44100_128` z ElevenLabs, `mp3` z OpenAI). 44,1 kHz / 128 kbps domyślnie dla mowy.                                 |
| Talk / telefonia                      | Natywny dla dostawcy **PCM** (Inworld 22050 Hz, Google 24 kHz) albo `ulaw_8000` z Gradium dla telefonii.                                 |

Uwagi dotyczące poszczególnych dostawców:

- **Transkodowanie Feishu / WhatsApp:** Gdy odpowiedź jako notatka głosowa trafia jako MP3/WebM/WAV/M4A, Plugin kanału transkoduje do 48 kHz Ogg/Opus za pomocą `ffmpeg`. WhatsApp wysyła przez Baileys z `ptt: true` i `audio/ogg; codecs=opus`. Jeśli konwersja się nie powiedzie: Feishu wraca do dołączenia oryginalnego pliku; wysyłanie WhatsApp kończy się niepowodzeniem zamiast opublikowania niezgodnego ładunku PTT.
- **MiniMax / Xiaomi MiMo:** Domyślnie MP3 (32 kHz dla MiniMax `speech-2.8-hd`); transkodowane do 48 kHz Opus dla celów notatek głosowych przez `ffmpeg`.
- **Lokalny CLI:** Używa skonfigurowanego `outputFormat`. Cele notatek głosowych są konwertowane do Ogg/Opus, a wyjście telefoniczne do surowego, monofonicznego PCM 16 kHz.
- **Google Gemini:** Zwraca surowy PCM 24 kHz. OpenClaw opakowuje jako WAV dla załączników, transkoduje do 48 kHz Opus dla celów notatek głosowych, zwraca PCM bezpośrednio dla Talk/telefonii.
- **Inworld:** załączniki MP3, natywne notatki głosowe `OGG_OPUS`, surowe `PCM` 22050 Hz dla Talk/telefonii.
- **xAI:** domyślnie MP3; `responseFormat` może mieć wartość `mp3|wav|pcm|mulaw|alaw`. Używa wsadowego punktu końcowego REST xAI — strumieniowy WebSocket TTS **nie** jest używany. Natywny format notatek głosowych Opus **nie** jest obsługiwany.
- **Microsoft:** Używa `microsoft.outputFormat` (domyślnie `audio-24khz-48kbitrate-mono-mp3`). Telegram `sendVoice` akceptuje OGG/MP3/M4A; użyj OpenAI/ElevenLabs, jeśli potrzebujesz gwarantowanych wiadomości głosowych Opus. Jeśli skonfigurowany format Microsoft zawiedzie, OpenClaw ponawia próbę z MP3.

Formaty wyjściowe OpenAI i ElevenLabs są stałe dla każdego kanału zgodnie z powyższą listą.

## Informacje o polach

<AccordionGroup>
  <Accordion title="messages.tts.* najwyższego poziomu">
    <ParamField path="auto" type='"off" | "always" | "inbound" | "tagged"'>
      Tryb Auto-TTS. `inbound` wysyła audio tylko po przychodzącej wiadomości głosowej; `tagged` wysyła audio tylko wtedy, gdy odpowiedź zawiera dyrektywy `[[tts:...]]` albo blok `[[tts:text]]`.
    </ParamField>
    <ParamField path="enabled" type="boolean" deprecated>
      Przestarzały przełącznik. `openclaw doctor --fix` migruje go do `auto`.
    </ParamField>
    <ParamField path="mode" type='"final" | "all"' default="final">
      `"all"` obejmuje odpowiedzi narzędzi/bloków oprócz odpowiedzi końcowych.
    </ParamField>
    <ParamField path="provider" type="string">
      Identyfikator dostawcy mowy. Gdy nie jest ustawiony, OpenClaw używa pierwszego skonfigurowanego dostawcy w kolejności automatycznego wyboru rejestru. Przestarzałe `provider: "edge"` jest przepisywane na `"microsoft"` przez `openclaw doctor --fix`.
    </ParamField>
    <ParamField path="persona" type="string">
      Aktywny identyfikator persony z `personas`. Normalizowany do małych liter.
    </ParamField>
    <ParamField path="personas.<id>" type="object">
      Stabilna tożsamość mówiona. Pola: `label`, `description`, `provider`, `fallbackPolicy`, `prompt`, `providers.<provider>`. Zobacz [Persony](#personas).
    </ParamField>
    <ParamField path="summaryModel" type="string">
      Tani model do automatycznego streszczania; domyślnie `agents.defaults.model.primary`. Akceptuje `provider/model` albo skonfigurowany alias modelu.
    </ParamField>
    <ParamField path="modelOverrides" type="object">
      Zezwól modelowi na emitowanie dyrektyw TTS. `enabled` domyślnie ma wartość `true`; `allowProvider` domyślnie ma wartość `false`.
    </ParamField>
    <ParamField path="providers.<id>" type="object">
      Ustawienia należące do dostawcy, indeksowane identyfikatorem dostawcy mowy. Przestarzałe bezpośrednie bloki (`messages.tts.openai`, `.elevenlabs`, `.microsoft`, `.edge`) są przepisywane przez `openclaw doctor --fix`; zatwierdzaj tylko `messages.tts.providers.<id>`.
    </ParamField>
    <ParamField path="maxTextLength" type="number">
      Twardy limit znaków wejściowych TTS. `/tts audio` kończy się niepowodzeniem po przekroczeniu.
    </ParamField>
    <ParamField path="timeoutMs" type="number">
      Limit czasu żądania w milisekundach.
    </ParamField>
    <ParamField path="prefsPath" type="string">
      Zastąp lokalną ścieżkę JSON preferencji (dostawca/limit/streszczenie). Domyślnie `~/.openclaw/settings/tts.json`.
    </ParamField>
  </Accordion>

  <Accordion title="Azure Speech">
    <ParamField path="apiKey" type="string">Env: `AZURE_SPEECH_KEY`, `AZURE_SPEECH_API_KEY` albo `SPEECH_KEY`.</ParamField>
    <ParamField path="region" type="string">Region Azure Speech (np. `eastus`). Env: `AZURE_SPEECH_REGION` albo `SPEECH_REGION`.</ParamField>
    <ParamField path="endpoint" type="string">Opcjonalne zastąpienie punktu końcowego Azure Speech (alias `baseUrl`).</ParamField>
    <ParamField path="speakerVoice" type="string">ShortName głosu Azure. Domyślnie `en-US-JennyNeural`. Przestarzały alias: `voice`.</ParamField>
    <ParamField path="lang" type="string">Kod języka SSML. Domyślnie `en-US`.</ParamField>
    <ParamField path="outputFormat" type="string">Azure `X-Microsoft-OutputFormat` dla standardowego audio. Domyślnie `audio-24khz-48kbitrate-mono-mp3`.</ParamField>
    <ParamField path="voiceNoteOutputFormat" type="string">Azure `X-Microsoft-OutputFormat` dla wyjścia notatek głosowych. Domyślnie `ogg-24khz-16bit-mono-opus`.</ParamField>
  </Accordion>

  <Accordion title="ElevenLabs">
    <ParamField path="apiKey" type="string">Wraca do `ELEVENLABS_API_KEY` albo `XI_API_KEY`.</ParamField>
    <ParamField path="model" type="string">Identyfikator modelu (np. `eleven_multilingual_v2`, `eleven_v3`).</ParamField>
    <ParamField path="speakerVoiceId" type="string">Identyfikator głosu ElevenLabs. Przestarzały alias: `voiceId`.</ParamField>
    <ParamField path="voiceSettings" type="object">
      `stability`, `similarityBoost`, `style` (każde `0..1`), `useSpeakerBoost` (`true|false`), `speed` (`0.5..2.0`, `1.0` = normalne).
    </ParamField>
    <ParamField path="applyTextNormalization" type='"auto" | "on" | "off"'>Tryb normalizacji tekstu.</ParamField>
    <ParamField path="languageCode" type="string">2-literowy ISO 639-1 (np. `en`, `de`).</ParamField>
    <ParamField path="seed" type="number">Liczba całkowita `0..4294967295` dla determinizmu w najlepszym możliwym zakresie.</ParamField>
    <ParamField path="baseUrl" type="string">Zastąp bazowy URL API ElevenLabs.</ParamField>
  </Accordion>

  <Accordion title="Google Gemini">
    <ParamField path="apiKey" type="string">Wraca do `GEMINI_API_KEY` / `GOOGLE_API_KEY`. Jeśli pominięto, TTS może ponownie użyć `models.providers.google.apiKey` przed powrotem do zmiennych środowiskowych.</ParamField>
    <ParamField path="model" type="string">Model TTS Gemini. Domyślnie `gemini-3.1-flash-tts-preview`.</ParamField>
    <ParamField path="speakerVoice" type="string">Nazwa wbudowanego głosu Gemini. Domyślnie `Kore`. Przestarzałe aliasy: `voiceName`, `voice`.</ParamField>
    <ParamField path="audioProfile" type="string">Prompt stylu w języku naturalnym dodawany przed tekstem mówionym.</ParamField>
    <ParamField path="speakerName" type="string">Opcjonalna etykieta mówcy dodawana przed tekstem mówionym, gdy prompt używa nazwanego mówcy.</ParamField>
    <ParamField path="promptTemplate" type='"audio-profile-v1"'>Ustaw na `audio-profile-v1`, aby opakować aktywne pola promptu persony w deterministyczną strukturę promptu TTS Gemini.</ParamField>
    <ParamField path="personaPrompt" type="string">Dodatkowy tekst promptu persony specyficzny dla Google, dołączany do uwag reżysera w szablonie.</ParamField>
    <ParamField path="baseUrl" type="string">Akceptowane jest tylko `https://generativelanguage.googleapis.com`.</ParamField>
  </Accordion>

  <Accordion title="Gradium">
    <ParamField path="apiKey" type="string">Środowisko: `GRADIUM_API_KEY`.</ParamField>
    <ParamField path="baseUrl" type="string">Domyślnie `https://api.gradium.ai`.</ParamField>
    <ParamField path="speakerVoiceId" type="string">Domyślnie Emma (`YTpq7expH9539ERJ`). Starszy alias: `voiceId`.</ParamField>
  </Accordion>

  <Accordion title="Inworld">
    ### Podstawowy Inworld

    <ParamField path="apiKey" type="string">Środowisko: `INWORLD_API_KEY`.</ParamField>
    <ParamField path="baseUrl" type="string">Domyślnie `https://api.inworld.ai`.</ParamField>
    <ParamField path="modelId" type="string">Domyślnie `inworld-tts-1.5-max`. Także: `inworld-tts-1.5-mini`, `inworld-tts-1-max`, `inworld-tts-1`.</ParamField>
    <ParamField path="speakerVoiceId" type="string">Domyślnie `Sarah`. Starszy alias: `voiceId`.</ParamField>
    <ParamField path="temperature" type="number">Temperatura próbkowania `0..2`.</ParamField>

  </Accordion>

  <Accordion title="Lokalny CLI (tts-local-cli)">
    <ParamField path="command" type="string">Lokalny plik wykonywalny lub ciąg polecenia dla CLI TTS.</ParamField>
    <ParamField path="args" type="string[]">Argumenty polecenia. Obsługuje symbole zastępcze `{{Text}}`, `{{OutputPath}}`, `{{OutputDir}}`, `{{OutputBase}}`.</ParamField>
    <ParamField path="outputFormat" type='"mp3" | "opus" | "wav"'>Oczekiwany format wyjściowy CLI. Domyślnie `mp3` dla załączników audio.</ParamField>
    <ParamField path="timeoutMs" type="number">Limit czasu polecenia w milisekundach. Domyślnie `120000`.</ParamField>
    <ParamField path="cwd" type="string">Opcjonalny katalog roboczy polecenia.</ParamField>
    <ParamField path="env" type="Record<string, string>">Opcjonalne nadpisania środowiska dla polecenia.</ParamField>
  </Accordion>

  <Accordion title="Microsoft (bez klucza API)">
    <ParamField path="enabled" type="boolean" default="true">Zezwól na użycie mowy Microsoft.</ParamField>
    <ParamField path="speakerVoice" type="string">Nazwa głosu neuronowego Microsoft (np. `en-US-MichelleNeural`). Starszy alias: `voice`.</ParamField>
    <ParamField path="lang" type="string">Kod języka (np. `en-US`).</ParamField>
    <ParamField path="outputFormat" type="string">Format wyjściowy Microsoft. Domyślnie `audio-24khz-48kbitrate-mono-mp3`. Nie wszystkie formaty są obsługiwane przez dołączony transport oparty na Edge.</ParamField>
    <ParamField path="rate / pitch / volume" type="string">Ciągi procentowe (np. `+10%`, `-5%`).</ParamField>
    <ParamField path="saveSubtitles" type="boolean">Zapisz napisy JSON obok pliku audio.</ParamField>
    <ParamField path="proxy" type="string">URL proxy dla żądań mowy Microsoft.</ParamField>
    <ParamField path="timeoutMs" type="number">Nadpisanie limitu czasu żądania (ms).</ParamField>
    <ParamField path="edge.*" type="object" deprecated>Starszy alias. Uruchom `openclaw doctor --fix`, aby przepisać utrwaloną konfigurację na `providers.microsoft`.</ParamField>
  </Accordion>

  <Accordion title="MiniMax">
    <ParamField path="apiKey" type="string">W razie braku używa `MINIMAX_API_KEY`. Uwierzytelnianie Token Plan przez `MINIMAX_OAUTH_TOKEN`, `MINIMAX_CODE_PLAN_KEY` lub `MINIMAX_CODING_API_KEY`.</ParamField>
    <ParamField path="baseUrl" type="string">Domyślnie `https://api.minimax.io`. Środowisko: `MINIMAX_API_HOST`.</ParamField>
    <ParamField path="model" type="string">Domyślnie `speech-2.8-hd`. Środowisko: `MINIMAX_TTS_MODEL`.</ParamField>
    <ParamField path="speakerVoiceId" type="string">Domyślnie `English_expressive_narrator`. Środowisko: `MINIMAX_TTS_VOICE_ID`. Starszy alias: `voiceId`.</ParamField>
    <ParamField path="speed" type="number">`0.5..2.0`. Domyślnie `1.0`.</ParamField>
    <ParamField path="vol" type="number">`(0, 10]`. Domyślnie `1.0`.</ParamField>
    <ParamField path="pitch" type="number">Liczba całkowita `-12..12`. Domyślnie `0`. Wartości ułamkowe są obcinane przed żądaniem.</ParamField>
  </Accordion>

  <Accordion title="OpenAI">
    <ParamField path="apiKey" type="string">W razie braku używa `OPENAI_API_KEY`.</ParamField>
    <ParamField path="model" type="string">Identyfikator modelu TTS OpenAI (np. `gpt-4o-mini-tts`).</ParamField>
    <ParamField path="speakerVoice" type="string">Nazwa głosu (np. `alloy`, `cedar`). Starszy alias: `voice`.</ParamField>
    <ParamField path="instructions" type="string">Jawne pole OpenAI `instructions`. Po ustawieniu pola promptu persony **nie** są automatycznie mapowane.</ParamField>
    <ParamField path="extraBody / extra_body" type="Record<string, unknown>">Dodatkowe pola JSON scalane z treściami żądań `/audio/speech` po wygenerowanych polach TTS OpenAI. Użyj tego dla punktów końcowych zgodnych z OpenAI, takich jak Kokoro, które wymagają kluczy specyficznych dla dostawcy, takich jak `lang`; niebezpieczne klucze prototypu są ignorowane.</ParamField>
    <ParamField path="baseUrl" type="string">
      Nadpisz punkt końcowy TTS OpenAI. Kolejność rozstrzygania: konfiguracja → `OPENAI_TTS_BASE_URL` → `https://api.openai.com/v1`. Wartości inne niż domyślne są traktowane jako punkty końcowe TTS zgodne z OpenAI, więc niestandardowe nazwy modeli i głosów są akceptowane.
    </ParamField>
  </Accordion>

  <Accordion title="OpenRouter">
    <ParamField path="apiKey" type="string">Środowisko: `OPENROUTER_API_KEY`. Może ponownie użyć `models.providers.openrouter.apiKey`.</ParamField>
    <ParamField path="baseUrl" type="string">Domyślnie `https://openrouter.ai/api/v1`. Starszy `https://openrouter.ai/v1` jest normalizowany.</ParamField>
    <ParamField path="model" type="string">Domyślnie `hexgrad/kokoro-82m`. Alias: `modelId`.</ParamField>
    <ParamField path="speakerVoice" type="string">Domyślnie `af_alloy`. Starsze aliasy: `voice`, `voiceId`.</ParamField>
    <ParamField path="responseFormat" type='"mp3" | "pcm"'>Domyślnie `mp3`.</ParamField>
    <ParamField path="speed" type="number">Nadpisanie szybkości natywne dla dostawcy.</ParamField>
  </Accordion>

  <Accordion title="Volcengine (BytePlus Seed Speech)">
    <ParamField path="apiKey" type="string">Środowisko: `VOLCENGINE_TTS_API_KEY` lub `BYTEPLUS_SEED_SPEECH_API_KEY`.</ParamField>
    <ParamField path="resourceId" type="string">Domyślnie `seed-tts-1.0`. Środowisko: `VOLCENGINE_TTS_RESOURCE_ID`. Użyj `seed-tts-2.0`, gdy Twój projekt ma uprawnienie TTS 2.0.</ParamField>
    <ParamField path="appKey" type="string">Nagłówek klucza aplikacji. Domyślnie `aGjiRDfUWi`. Środowisko: `VOLCENGINE_TTS_APP_KEY`.</ParamField>
    <ParamField path="baseUrl" type="string">Nadpisz punkt końcowy HTTP Seed Speech TTS. Środowisko: `VOLCENGINE_TTS_BASE_URL`.</ParamField>
    <ParamField path="speakerVoice" type="string">Typ głosu. Domyślnie `en_female_anna_mars_bigtts`. Środowisko: `VOLCENGINE_TTS_VOICE`. Starszy alias: `voice`.</ParamField>
    <ParamField path="speedRatio" type="number">Współczynnik szybkości natywny dla dostawcy.</ParamField>
    <ParamField path="emotion" type="string">Znacznik emocji natywny dla dostawcy.</ParamField>
    <ParamField path="appId / token / cluster" type="string" deprecated>Starsze pola Volcengine Speech Console. Środowisko: `VOLCENGINE_TTS_APPID`, `VOLCENGINE_TTS_TOKEN`, `VOLCENGINE_TTS_CLUSTER` (domyślnie `volcano_tts`).</ParamField>
  </Accordion>

  <Accordion title="xAI">
    <ParamField path="apiKey" type="string">Środowisko: `XAI_API_KEY`.</ParamField>
    <ParamField path="baseUrl" type="string">Domyślnie `https://api.x.ai/v1`. Środowisko: `XAI_BASE_URL`.</ParamField>
    <ParamField path="speakerVoiceId" type="string">Domyślnie `eve`. Aktywne głosy: `ara`, `eve`, `leo`, `rex`, `sal`, `una`. Starszy alias: `voiceId`.</ParamField>
    <ParamField path="language" type="string">Kod języka BCP-47 lub `auto`. Domyślnie `en`.</ParamField>
    <ParamField path="responseFormat" type='"mp3" | "wav" | "pcm" | "mulaw" | "alaw"'>Domyślnie `mp3`.</ParamField>
    <ParamField path="speed" type="number">Nadpisanie szybkości natywne dla dostawcy.</ParamField>
  </Accordion>

  <Accordion title="Xiaomi MiMo">
    <ParamField path="apiKey" type="string">Środowisko: `XIAOMI_API_KEY`.</ParamField>
    <ParamField path="baseUrl" type="string">Domyślnie `https://api.xiaomimimo.com/v1`. Środowisko: `XIAOMI_BASE_URL`.</ParamField>
    <ParamField path="model" type="string">Domyślnie `mimo-v2.5-tts`. Środowisko: `XIAOMI_TTS_MODEL`. Obsługuje także `mimo-v2-tts` i `mimo-v2.5-tts-voicedesign`.</ParamField>
    <ParamField path="speakerVoice" type="string">Domyślnie `mimo_default` dla modeli z gotowym głosem. Środowisko: `XIAOMI_TTS_VOICE`. Starszy alias: `voice`. Nie jest wysyłane dla `mimo-v2.5-tts-voicedesign`.</ParamField>
    <ParamField path="format" type='"mp3" | "wav"'>Domyślnie `mp3`. Środowisko: `XIAOMI_TTS_FORMAT`.</ParamField>
    <ParamField path="style" type="string">Opcjonalna instrukcja stylu w języku naturalnym wysyłana jako wiadomość użytkownika; nie jest wypowiadana. Dla `mimo-v2.5-tts-voicedesign` jest to prompt projektowania głosu; OpenClaw dostarcza wartość domyślną, gdy zostanie pominięta.</ParamField>
  </Accordion>
</AccordionGroup>

## Narzędzie agenta

Narzędzie `tts` konwertuje tekst na mowę i zwraca załącznik audio do
dostarczenia odpowiedzi. W Feishu, Matrix, Telegram i WhatsApp audio jest
dostarczane jako wiadomość głosowa, a nie jako załącznik pliku. Feishu i
WhatsApp mogą transkodować wyjście TTS inne niż Opus na tej ścieżce, gdy `ffmpeg`
jest dostępny.

WhatsApp wysyła audio przez Baileys jako notatkę głosową PTT (`audio` z
`ptt: true`) i wysyła widoczny tekst **oddzielnie** od audio PTT, ponieważ
klienci nie renderują konsekwentnie podpisów przy notatkach głosowych.

Narzędzie akceptuje opcjonalne pola `channel` i `timeoutMs`; `timeoutMs` to
limit czasu żądania dostawcy dla pojedynczego wywołania w milisekundach. Wartości
dla pojedynczego wywołania nadpisują `messages.tts.timeoutMs`; skonfigurowane
limity czasu TTS nadpisują dowolną domyślną wartość dostawcy utworzoną przez Plugin.

## RPC Gateway

| Metoda            | Cel                                      |
| ----------------- | ---------------------------------------- |
| `tts.status`      | Odczytaj bieżący stan TTS i ostatnią próbę. |
| `tts.enable`      | Ustaw lokalną preferencję automatyczną na `always`. |
| `tts.disable`     | Ustaw lokalną preferencję automatyczną na `off`. |
| `tts.convert`     | Jednorazowy tekst → audio.               |
| `tts.setProvider` | Ustaw lokalną preferencję dostawcy.      |
| `tts.setPersona`  | Ustaw lokalną preferencję persony.       |
| `tts.providers`   | Wyświetl listę skonfigurowanych dostawców i status. |

## Łącza usług

- [Przewodnik OpenAI po zamianie tekstu na mowę](https://platform.openai.com/docs/guides/text-to-speech)
- [Dokumentacja API OpenAI Audio](https://platform.openai.com/docs/api-reference/audio)
- [REST zamiany tekstu na mowę Azure Speech](https://learn.microsoft.com/azure/ai-services/speech-service/rest-text-to-speech)
- [Dostawca Azure Speech](/pl/providers/azure-speech)
- [Zamiana tekstu na mowę ElevenLabs](https://elevenlabs.io/docs/api-reference/text-to-speech)
- [Uwierzytelnianie ElevenLabs](https://elevenlabs.io/docs/api-reference/authentication)
- [Gradium](/pl/providers/gradium)
- [API Inworld TTS](https://docs.inworld.ai/tts/tts)
- [API MiniMax T2A v2](https://platform.minimaxi.com/document/T2A%20V2)
- [API HTTP Volcengine TTS](/pl/providers/volcengine#text-to-speech)
- [Synteza mowy Xiaomi MiMo](/pl/providers/xiaomi#text-to-speech)
- [node-edge-tts](https://github.com/SchneeHertz/node-edge-tts)
- [Formaty wyjściowe Microsoft Speech](https://learn.microsoft.com/azure/ai-services/speech-service/rest-text-to-speech#audio-outputs)
- [Zamiana tekstu na mowę xAI](https://docs.x.ai/developers/rest-api-reference/inference/voice#text-to-speech-rest)

## Powiązane

- [Omówienie multimediów](/pl/tools/media-overview)
- [Generowanie muzyki](/pl/tools/music-generation)
- [Generowanie wideo](/pl/tools/video-generation)
- [Polecenia ukośnikowe](/pl/tools/slash-commands)
- [Plugin połączeń głosowych](/pl/plugins/voice-call)
