Create Model
Upload reference audio to create a custom TTS voice model. Synchronous endpoint: the model is ready for speech synthesis immediately after creation.
Upload reference audio to create a custom TTS voice model. On success the response includes model details; use _id as reference_id on the Text to Speech endpoint.
Synchronous endpoint: this request uploads files. For regular REST calls use multipart/form-data and let the HTTP client set the multipart Content-Type boundary automatically. train_mode only supports fast; the model is ready immediately after creation.
Base URL
https://api.autorouter.top— Production
Authentication
BearerAuth: http (bearer)
Authenticate using a Bearer Token.
Format: Authorization: Bearer sk-xxxxxx
Endpoints
POST /fishaudio/model
Create a voice model
Upload reference audio and model metadata; the response returns the new model details.
Because files are uploaded, use multipart/form-data and do not set the boundary manually.
Request Body
Content-Type: multipart/form-data
Example:
{
"type": "tts",
"title": "My Voice",
"description": "Cloned from a studio sample",
"visibility": "private",
"train_mode": "fast",
"voices": ["sample.wav"],
"texts": ["Hello, this is a studio sample."],
"tags": ["custom", "english"],
"enhance_audio_quality": true,
"generate_sample": false
}Properties:
| Name | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Model type, always tts (text to speech) |
title | string | Yes | Model title or name |
train_mode | string | Yes | Training mode, always fast. TTS models are ready immediately after creation |
voices | file | file[] | Yes | Reference audio used to tune the model, 1–20 files |
description | string | null | No | Model description |
cover_image | file | null | No | Cover image. Required if the model is public |
visibility | string | No | Visibility. Default private |
texts | string | string[] | null | No | Transcripts corresponding to voices; if omitted, ASR is run on the audio |
voice_design_signatures | string | string[] | null | No | Signatures from Voice Design candidates, one per voice in the same order |
tags | string | string[] | null | No | Model tags |
enhance_audio_quality | boolean | No | Whether to enhance audio quality. Default true |
generate_sample | boolean | No | Whether to generate default preview text. Default false |
visibilitystring(Optional)
Model visibility. Default private.
private: visible only to the creatorunlist: anyone with the link can accesspublic: shown publicly. API requests withpublicare downgraded toprivate; use the web publish flow to publish publicly
Public models require cover_image.
voicesfile | file[](Required)
Reference audio files for tuning. Minimum 1, maximum 20.
- Single file: field name
voices, upload one audio file - Multiple files: repeat the
voicesfield, one reference clip per file
If texts is omitted, the server runs ASR on the audio. Providing accurate transcripts improves clone quality.
textsstring | string[] | null(Optional)
Transcripts corresponding to voices, up to 20 items. Order must match voices.
- If omitted, the server runs ASR on the audio
- If provided, use the exact spoken text; accuracy directly affects clone quality
voice_design_signaturesstring | string[] | null(Optional)
Signatures from /v1/voice-design candidates, matching voices in count and order.
When every uploaded voice verifies, the model is stamped source=voice_design; an invalid signature rejects the request.
Responses
201: Created successfully
Content-Type: application/json
401: Unauthorized
Content-Type: application/json
503: Service overloaded
Content-Type: application/json
Request Example
curl -X POST "https://api.autorouter.top/fishaudio/model" \
-H "Authorization: Bearer sk-xxxxxx" \
-F "type=tts" \
-F "title=My Voice" \
-F "description=Cloned from a studio sample" \
-F "visibility=private" \
-F "train_mode=fast" \
-F "voices=@/path/to/sample.wav" \
-F "texts=Hello, this is a studio sample." \
-F "tags=custom" \
-F "enhance_audio_quality=true"Response Example
{
"_id": "7f8a9b0c1d2e3f4a5b6c7d8e",
"type": "tts",
"title": "My Voice",
"description": "Cloned from a studio sample",
"cover_image": "",
"train_mode": "fast",
"state": "trained",
"tags": ["custom"],
"samples": [],
"created_at": "2026-09-20T01:00:00.000Z",
"updated_at": "2026-09-20T01:00:00.000Z",
"languages": ["en"],
"visibility": "private",
"lock_visibility": false,
"default_text": "",
"source": null,
"licensed": false,
"like_count": 0,
"mark_count": 0,
"shared_count": 0,
"task_count": 0,
"liked": false,
"marked": false,
"unliked": false,
"author": {
"_id": "64a1b2c3d4e5f67890123456",
"nickname": "creator",
"avatar": "https://example.com/avatar.png"
}
}Response fields:
| Name | Type | Description |
|---|---|---|
_id | string | Model ID, usable as TTS reference_id |
type | string | Model type. tts is text-to-speech; svc is singing voice conversion |
title | string | Model title |
description | string | Model description. Defaults to an empty string |
cover_image | string | Cover image URL. Defaults to empty |
train_mode | string | Training mode. fast is ready immediately after creation; full is full training |
state | string | State. Enum: created, training, trained, failed |
tags | string[] | Tag list |
samples | object[] | Preview samples. Defaults to an empty array |
created_at | string | Created at, ISO 8601 |
updated_at | string | Updated at, ISO 8601 |
languages | string[] | Language list |
visibility | string | Visibility. Enum: public, unlist, private |
lock_visibility | boolean | Whether visibility is locked. Default false |
dmca_taken_down | boolean | null | Whether the model was taken down for DMCA |
takedown_category | string | null | Takedown category: dmca, policy |
default_text | string | Default preview text |
source | string | null | Source. May be voice_design when every uploaded voice verifies |
licensed | boolean | Whether this is a Fish Audio licensed voice |
quality | object | null | Audio quality evaluation |
like_count | integer | Like count |
mark_count | integer | Mark count |
shared_count | integer | Share count |
task_count | integer | Usage count |
liked | boolean | Whether the current user liked it |
marked | boolean | Whether the current user marked it |
unliked | boolean | Whether the current user unliked it |
author | object | Author information |
authorobject(Required)
Author information.
Author user ID.
Author nickname.
Author avatar URL.
samplesobject[](Optional)
List of preview samples. Defaults to an empty array.
Sample title.
Text corresponding to the sample.
Task ID that generated this sample.
Sample audio URL.
Error Handling
HTTP 401 / 403 Auth Errors
401 Unauthorized: API Key is invalid or expired403 Forbidden: API Key cannot access this model (check the token model allowlist)
HTTP 402 Insufficient Balance
Returns insufficient user quota. Top up in the AutoRouter console.
HTTP 503 Service Overloaded
The server is too busy to process the request. Please retry later.