Fish Audio in OpenClaw: set up the S2.1 speech provider without the cloning risk

Fish Audio is now a first-class speech option in OpenClaw. The v2026.8.1 beta line adds hosted S2.1 synthesis through a fish-audio speech provider and a local Fish S2 Pro voice that runs on-device in the native macOS Talk app. If you want your agent to answer with a natural voice on Telegram, WhatsApp, a Discord call, or a phone line, this is the shortest path to a good one.

The setup is straightforward. The judgment call is which mode fits your task and how you handle reference voices, since S2.1 can clone a voice from a short sample. Get those two decisions right and the rest is a plugin install and a config line.

What Fish Audio actually adds to OpenClaw

Fish Audio started life as Fish Speech, an open-source text-to-speech project. The current hosted model, S2.1 Pro, does two things that matter for an agent: it reads inline delivery tags like [whisper] or [excited], and it can synthesize speech from a reference clip in 80-plus languages.

OpenClaw exposes this in two separate places, and they are not interchangeable:

ModeWhere it runsNeeds a Fish API keyBest for
Hosted S2.1The Gateway, via the fish-audio providerYesChannels, voice notes, telephony, Discord voice
Local S2 ProThe native macOS Talk app, via the mlx providerNoOn-device Talk with nothing leaving the Mac

Hosted S2.1 covers the channels most people care about. It sends MP3 for ordinary audio, Opus at 48 kHz for native voice notes, and raw PCM at 8 kHz for telephony. On a Discord call, OpenClaw plays Fish Audio’s chunked HTTP response as it arrives instead of waiting for the whole clip, so replies start sooner.

Local S2 Pro is the privacy answer. It runs inside the macOS app through the existing mlx Talk provider, so audio is generated on your machine and no Fish key is involved. New to the product? Start with what OpenClaw is and how OpenClaw works before wiring up voice.

Set up hosted S2.1

Hosted synthesis is a plugin plus a provider selection. Install the speech plugin first:

openclaw plugins install @openclaw/fish-audio-speech

Treat that install like any other third-party plugin: confirm the source before you run it, the same way you would for any package that gains a capability inside your agent. Our plugin install guide covers why an untrusted source should require a deliberate --force, not a reflex.

Once the plugin is present, point your speech provider at fish-audio and supply the Fish API key through OpenClaw’s normal secret handling rather than pasting it into a shared config. From there, any channel that supports outbound audio can speak: OpenClaw converts replies to audio across native voice messages on Feishu, Matrix, Telegram, and WhatsApp, plus audio attachments elsewhere.

To make the voice expressive, put natural-language tags directly in the spoken text:

[whisper] Keep this between us. [pause] [excited] We shipped it!

S2 and S2.1 read those inline, so you control delivery without a separate SSML file. Keep the tags sparse. A line that is all stage directions reads worse than one with a single well-placed [pause].

Set up local S2 Pro on a Mac

The local path skips the API entirely. In the native macOS app, select the mlx Talk provider and the Fish S2 Pro model:

{
  talk: {
    provider: "mlx",
    providers: {
      mlx: { modelId: "mlx-community/fish-audio-s2-pro-8bit" }
    }
  }
}

Two practical notes. The first utterance downloads roughly 6.8 GB of model and codec data, so the initial reply is slow. After that, OpenClaw keeps one selected MLX model resident and unloads it after five idle minutes, app shutdown, or memory pressure. Plan for the cold start and the memory footprint, and local S2 Pro gives you a capable voice with no per-word cost and no audio leaving the device.

Where hosted wins and where local wins

The choice usually comes down to reach and privacy, not raw quality.

  • Pick hosted S2.1 when the agent needs to speak on channels a phone can reach: Telegram, WhatsApp, a Discord voice call, or a telephony line. Streaming playback and telephony framing only exist on the hosted path.
  • Pick local S2 Pro when the work is Mac-side Talk and you would rather not send text to a speech API at all. It is the right default for sensitive dictation or a personal assistant you keep on one machine.

If your agent lives in a Discord call, the setup guides in our Discord voice agent post and the choppy-capture fix pair well with a hosted Fish Audio voice: one handles how the agent hears you, the other how clearly it speaks back.

S2.1 can synthesize speech from a reference audio sample, either a stored reference_id or a references array for zero-shot cloning. That is genuinely useful for a consistent brand voice or content localization. It is also the part of this release that deserves a rule, not a shrug.

The rule is simple: only clone a voice you have explicit permission to use. A short reference clip is enough for S2.1 to produce convincing speech, which is exactly why an agent should never pull an arbitrary voice sample from a chat, a call recording, or a scraped file and reuse it. Keep reference voices to a small, approved set. If a workflow would generate speech in someone’s voice, that should be a decision a person made on purpose, logged, and revocable, not a side effect of a prompt.

This is the same posture OpenClaw applies elsewhere: a powerful capability gets a narrow, visible boundary. Voice synthesis is convincing enough now that the boundary has to be a policy you enforce, because the model will not enforce it for you.

A short preflight before you turn on Fish Audio

Before you route agent replies through Fish Audio, answer these:

  1. Does this task need reach (hosted) or privacy (local)?
  2. Is the Fish API key stored as a secret, not in shared config?
  3. Which reference voices are approved, and who approved them?
  4. Should any voice output require review before it is sent externally?
  5. Can the workflow fall back to text if synthesis fails mid-reply?

None of that is heavy. It is the difference between a voice feature you can trust in an unattended cron job and one that quietly does something you did not intend.

Putting a Fish Audio voice to work

Fish Audio gives OpenClaw a strong, low-friction voice on both the hosted and on-device paths. Install the fish-audio-speech plugin for channel and telephony reach, or run local S2 Pro on a Mac when nothing should leave the machine. Use inline tags for delivery, keep the API key in secret storage, and treat reference-voice cloning as a permissioned action rather than a default. Do that, and a talking agent stops being a novelty and becomes a reliable part of the workflow.

FAQ

What is Fish Audio in OpenClaw?

Fish Audio is a speech provider added in the OpenClaw v2026.8.1 beta line. Hosted S2.1 runs through the fish-audio provider on the Gateway for channels, voice notes, telephony, and Discord voice. A local Fish S2 Pro model runs on-device in the native macOS Talk app through the mlx provider.

Do I need a Fish Audio API key?

For hosted S2.1, yes: install @openclaw/fish-audio-speech and supply a key through OpenClaw’s secret handling. For local S2 Pro in the macOS app, no key is needed because synthesis runs on your Mac.

Can Fish Audio clone a voice?

S2.1 supports voice cloning from a reference sample using a reference_id or a references array. Only clone voices you have explicit permission to use, keep the reference set small and approved, and treat any voice-generation step as a deliberate, logged action.

Does local S2 Pro work on Windows or Linux?

The local Fish S2 Pro path runs through the mlx Talk provider in the native macOS app, so it is Mac-only today. On other platforms, use the hosted S2.1 provider instead.

Sources: