Fish Audio: S2 Pro
Fish Audio S2 Pro creates expressive multilingual speech with word-level directions and native multi-speaker dialogue. Square-bracket instructions control delivery inside the script, while voice references identify the speakers and output settings shape the audio artifact.
About the model
This description covers the model’s capabilities. Available in Ailoot inputs, outputs and options are listed for the selected method below.
S2 Pro is Fish Audio’s second-generation text-to-speech model for expressive narration, character dialogue and conversational voice output. It turns a written script into audio and supports natural-language direction at the word or phrase level. The previous S1 generation uses parenthesis cues, while S2 Pro natively uses square brackets and supports multiple speakers within one synthesis request. The maker releases S2 Pro weights and fine-tuning code for separate customization work; an ordinary speech request uses the selected model rather than training a new one.
Write the spoken content first, then place a delivery instruction immediately before the word or phrase it should affect. Directions can describe a whisper, a reaction, a pause, an emotional shift or an open-ended speaking style. For a short product explanation, keep the factual sentence clear and put emphasis only where the listener should notice a distinction. For a character line, describe the emotional change at the moment it occurs instead of making the whole passage share one fixed mood.
Square-bracket tags are open-domain descriptions rather than a closed menu. Examples include [whispering], [sigh], [long pause] and a phrase such as [speaking slowly, almost hesitant]. Tags can appear mid-sentence and affect the following speech. A descriptive tag needs actual text after it; an isolated instruction can give unpredictable output. Start with one or two useful directions before adding layers, since competing tags can obscure the performance you intended. Different voice references can respond to the same direction with different intensity.
S2’s release describes approximately 80 languages and gives examples of writing delivery instructions in the same language as the script. Prepare the wording in the language that should be spoken and preserve names, units and abbreviations that need a particular reading. A multilingual narration can keep its intended voice while changing script language, but the final artifact still needs listening for pronunciation and continuity. Synthesis produces the supplied content as speech rather than deciding what information the application should say.
For a single speaker, choose a saved voice identifier or supply reference audio and its matching transcript. The producer recommends a clean 10–30-second sample for instant conditioning. For dialogue, use speaker markers such as <|speaker:0|> and <|speaker:1|>, with an ordered list of voice identifiers or separate reference groups for the speakers. The numeric marker selects the corresponding voice entry; keep the ordering fixed as a conversation develops. Natural-language performance directions and speaker selection have different roles in the script.
The audio output can be MP3, WAV, raw PCM or Opus. MP3 defaults to 128 kbps and offers 64 or 192 kbps; Opus output uses 48 kHz, while WAV and PCM support their documented sample-rate choices as 16-bit mono. Choose the format for its actual destination: a retained file for narration, or suitable audio chunks for playback. The producer speech workflow also describes live text streaming when the script arrives progressively. The generated result should remain associated with the complete script and selected voices.
Speed can be adjusted between 0.5 and 2.0, with volume and output loudness-normalisation controls. Text normalisation improves reading of English and Chinese numbers. Processing uses chunks in a 100–300 range and a per-chunk audio-token budget, so these settings should not be read as a fixed maximum length for an entire narration. Previous-chunk conditioning can carry voice context into the next segment. Sampling controls such as temperature and top-p influence variation; a deliberately directed line still needs enough text and context to carry the intended sound.
A useful production brief separates narration, dialogue and delivery directions, then states the voice and format of the resulting artifact. Listen for missing words, repeated audio, number pronunciation, speaker changes and the timing of a reaction. Revise the line or voice reference responsible for the mismatch rather than assuming more tags will improve every passage. S2 Pro remains a distinct previous-generation S2 model; S2.1 Pro is the later edition with its own improvements and model-specific setting behavior.
Ailoot Ultra · Speech POST /v1/audio/speech fish-audio/s2-pro
fish-audio/s2-proOverview
Fish Audio S2 Pro creates expressive multilingual speech with word-level directions and native multi-speaker dialogue. Square-bracket instructions control delivery inside the script, while voice references identify the speakers and output settings shape the audio artifact.
- Accepted inputs
- Text
- Results
- Audio
Available in Ailoot · inputs & methods
Ailoot Ultra · Speech POST /v1/audio/speech
- Input types
text- Output types
audio
| Field | Type | Requirement | Values & limits | Default |
|---|---|---|---|---|
Fieldmodel | Typestring | RequirementRequired | Values & limits fish-audio/s2-pro | Default— |
Fieldinput | Typestring | RequirementRequired | Values & limits Minimum length: 1 | Default— |
Fieldvoice | Typestring | RequirementRequired | Values & limits b347db033a6549378b48d00acb0d06cd Minimum length: 1 | Default— |
Fieldresponse_format | Typestring | RequirementOptional | Values & limits mp3, pcm | Defaultpcm |
Fieldprovider | Typeobject | RequirementOptional | Values & limits | Default— |
Method parameters and lifecycle
| Parameter | Contract |
|---|---|
Parametercontent_type | Contractapplication/json |
Parameterrequired | Contractmodel, input, voice |
Parametermaterial_types | Contracttext |
Lifecycle: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · actual returned task_id or media library record
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Pricing
Tariff references do not add request options. Supported parameters are listed for the selected method.
- Fast mode
- Not specified When fast mode is selected
- Flex mode
- Not specified When flex mode is selected
- Maximum reasoning effort
- Not specified When maximum reasoning effort uses the default adjustment
Ailoot rates
Prices by configuration
Match each charge to the conditions shown. Use one rate for each set of alternative configurations.
| Configuration | Rate schedule | Billing unit | Charge |
|---|---|---|---|
| ConfigurationBase token rates | Rate scheduleBase rate | Billing unit— | Charge Input · Input tokens — / 1K tokens Output · Output tokens — / 1K tokens Input · Cache read — / 1K tokens Input · Cache write — / 1K tokens Input · Cache write, 1 hour — / 1K tokens |
| Configurationinput UTF-8 byte | Rate schedule— | Billing unitper input UTF-8 byte | Charge Input · input UTF-8 byte $0.00003 per input UTF-8 byte |
Ailoot reserves an estimated amount before a request. After the result, it settles the final charge from measured usage. Streaming settlement uses the final usage record. How reservation and settlement work →
Example requests
Ailoot Ultra · Speech
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_INPUT_TEXT:?Set the actual documented input value}"
export AILOOT_INPUT_TEXT
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
request={'model': 'fish-audio/s2-pro', 'input': '${ACTUAL_INPUT_TEXT}', 'voice': 'b347db033a6549378b48d00acb0d06cd', 'response_format': 'mp3'}
request['input']=os.environ['AILOOT_INPUT_TEXT']
Path('request.json').write_text(json.dumps(request,ensure_ascii=False),encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o response.bin
# Retain the complete response and headers, every actual output, original returned identifiers and all usage fields. Recover the original operation without submitting creation again.
Receive and save results
Ailoot Ultra · Speech
Complete binary audio or original audio_url response, headers and every owned asset.
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Other content reads
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \
-H "Authorization: Bearer $AILOOT_API_KEY" -o owned-assets.json
# Preserve every returned asset and follow its exact signed content URL. Do not construct a signed token.
Keep all completed results
Keep every complete returned response, file and content part.
Retain the complete response and headers, every actual output, original returned identifiers and all usage fields. Recover the original operation without submitting creation again.
If the original response needs checking
Keep the returned X-Client-Request-ID for reconciliation. Read only actual returned task_id/asset_id values or the owned media library; never build a task URL from the operation ID and never resubmit creation.
Aliases
Model aliases
Ailoot Ultra fish-audio/s2-pro
Method path aliases
Use the method paths shown above.
Related caller IDs
FAQ · Fish Audio: S2 Pro
- What inputs and results are available?
POST /v1/audio/speech·fish-audio/s2-pro:text→audio- Which fields does the request use?
POST /v1/audio/speech·fish-audio/s2-pro:model,input,voice,response_format,provider