---
title: 'Fish TTS'
description: "Generate speech with a voice cloned into Wireflow's Fish Audio account."
updated: 2026-09-23
---

# Fish TTS

**Badge:** New  
**Node type:** `audio:fish_tts`  
**Category:** `audio`

## Description

Generate speech with a voice cloned into Wireflow's Fish Audio account. Wire the Fish Voice Clone node into `voice_id`, or pick one of your saved voices in the sidebar.

Runs on Wireflow's Fish account, so there is no API key to bring. Output is a hosted `.wav` (44.1 kHz) that plays inline on the node.

## Pricing

- **Cost:** 3 credits per run, flat, regardless of how long the text is.

## Canvas ports

These appear as port handles on the left side of the node.

| ID         | Label     | Details                                                                                                           |
| ---------- | --------- | ----------------------------------------------------------------------------------------------------------------- |
| `text`     | **Text**  | `TEXT` _(required)_                                                                                               |
| `voice_id` | **Voice** | `TEXT` _(required)_. Fish reference_id. Connect the Fish Voice Clone node, or pick a cloned voice in the sidebar. |

## Sidebar config

The **Voice** field doubles as a config control when nothing is wired into the port:

- A dropdown of voices you cloned in Wireflow (Fish Voice Clone node), labelled by name and visibility. Use **Refresh voices** after a clone completes. The list also refreshes when you focus it. Saved voices can be reused across your workflows.
- **Paste a Fish voice ID** for a model you already made on fish.audio. That only works if the model's visibility is **public** or **unlisted**. A private model in your own account is not reachable with Wireflow's key. Pasted IDs are checked as you type.

| ID       | Label           | Details                                       |
| -------- | --------------- | --------------------------------------------- |
| `speed`  | **Speed**       | `NUMBER` · 0.5 to 2, default 1 (natural pace) |
| `volume` | **Volume (dB)** | `NUMBER` · -20 to 3, default 0                |

Out-of-range values are refused before anything is charged, never clamped. Volume is capped at +3 dB because +6 already peaks at 0 dBTP on an ordinary voice. Neither changes the price: Fish bills by input text, not output length.

## Outputs

| ID      | Label     | Type    |
| ------- | --------- | ------- |
| `audio` | **Audio** | `AUDIO` |

## Limits

- **1,500 bytes of text per run.** That is 1,500 characters of plain English, but **non-Latin scripts (Chinese, Japanese, Korean, Arabic) and emoji use up to 3-4 bytes per character**, so roughly 500 characters of Chinese hits the same ceiling. Fish charges by UTF-8 byte, which is why the limit is counted that way.
- Longer scripts should be split across several TTS nodes (or driven by an iterator) and the audio joined. Over-limit runs are refused before anything is charged.
- You can only use your own cloned voices, voices shared publicly, or an external Fish voice that is public/unlisted.

## Notes

- Voice quality tracks the sample, not the settings. A clean 15s reference beats a noisy 2 minutes.
- **"Voice is private to another Fish Audio account"**. The pasted ID is not visible to Wireflow's key. Clone the voice here, or flip it to unlisted on fish.audio.
- **"Fish API wallet is out of funds"**. That is on us, not your balance. Your credits are refunded. Ping support.

---

Documentation index: fetch https://www.wireflow.ai/llms.txt for the full list of Wireflow docs.
