Flexible parameters
Configure 6 documented parameters, including bitrate_kbps, output_format, references, sample_rate_hz, text.
Expressive multilingual speech for conversational and narrative audio
curl -X POST https://runapi.ai/api/v1/fish_audio/text_to_speech \
-H "Authorization: Bearer $RUNAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "s1",
"text": "Turn this short documentary narration into expressive, natural speech with consistent pacing."
}'
import { FishAudioClient } from "@runapi.ai/fish-audio";
const client = new FishAudioClient();
const result = await client.textToSpeech.run({
model: "s1",
text: "Turn this short documentary narration into expressive, natural speech with consistent pacing.",
});
import os
import requests
response = requests.post(
"https://runapi.ai/api/v1/fish_audio/text_to_speech",
headers={"Authorization": f"Bearer {os.environ['RUNAPI_API_KEY']}"},
json={"model":"s1","text":"Turn this short documentary narration into expressive, natural speech with consistent pacing."}
)
response.raise_for_status()
<?php
$client = curl_init("https://runapi.ai/api/v1/fish_audio/text_to_speech");
curl_setopt_array($client, [
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("RUNAPI_API_KEY"), "Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode([
'model' => 's1',
'text' => 'Turn this short documentary narration into expressive, natural speech with consistent pacing.',
])
]);
$response = curl_exec($client);
RunApi client = new RunApi(System.getenv("RUNAPI_API_KEY"));
Task task = client.textToSpeech().run({"model":"s1","text":"Turn this short documentary narration into expressive, natural speech with consistent pacing."});
task.waitForResult();
require "runapi/fish_audio"
client = RunApi::FishAudio::Client.new
result = client.text_to_speech.run(
model: "s1",
text: "Turn this short documentary narration into expressive, natural speech with consistent pacing."
)
client := runapi.NewClient(os.Getenv("RUNAPI_API_KEY"))
task, err := client.textToSpeech.Run({"model":"s1","text":"Turn this short documentary narration into expressive, natural speech with consistent pacing."})
if err != nil { log.Fatal(err) }
task.Wait()
$ runapi generate \
--model s1 \
--endpoint text_to_speech \
--wait
3 versions available
Pick any model and generate in seconds.
| Provider | Fish Audio |
| Model ID | s1 |
| Modality | Audio & Music |
| Task types | Synchronous |
| API endpoint | /api/v1/fish_audio/text_to_speech |
| Billing unit | 1K UTF-8 bytes |
| Input parameters | bitrate_kbps, model, output_format, references, sample_rate_hz, text, voice_id |
| Output format | mp3, wav |
| Catalog status | Operational |
Sign up for free and create an API key for s1 from the dashboard.
POST to /api/v1/fish_audio/text_to_speech with the s1 model slug and your parameters.
Read the completed s1 response directly from the endpoint.
Configure 6 documented parameters, including bitrate_kbps, output_format, references, sample_rate_hz, text.
Exposes 1 public endpoint(s): text_to_speech.
Metered by 1K UTF-8 bytes with no subscription requirement.
textNo description available.
voice_idNo description available.
referencesOne temporary voice-cloning sample. Cannot be combined with voice_id. Omit, use null, or [] for no sample.
bitrate_kbpsMP3 bitrate. Not accepted for WAV output. (64, 128, 192)
output_formatOutput audio format. (mp3, wav)
sample_rate_hzOutput sample rate. MP3 supports 32000 and 44100 Hz; WAV supports every listed value. (8000, 16000, 24000, 32000, 44100)
Generate royalty-free background music matched to episode mood without licensing fees.
Generate adaptive ambient soundscapes and effects for procedurally generated levels.
Generate custom voiceovers and sound effects for client spots without a recording studio.
Pass the model ID shown in the quickstart.
Per-key rate limits scale with your usage tier. The pricing page shows current limits. If you need higher throughput, contact support to discuss tier upgrades.
Yes. Variant is a parameter in the request. Switch by changing the model ID — no code changes, no re-authentication, no separate billing setup. All variants share the same API key and request shape.
Where streaming is available, RunAPI streams end-to-end. LLM models support token-level streaming. Media models use async task polling or webhook callbacks for result delivery.
Open an issue on the public GitHub repo or email support at [email protected]. Include the task ID and model ID so the team can investigate the specific generation.
No. Your RunAPI API key is enough to access this variant and every other model in the catalog. You do not need accounts with the underlying provider.
We're here to help with enterprise setup, integrations, and technical questions.
Contact Us