POST /voices /fishaudio /clones
Клонирует голос по образцу записи. Образец — base64 (можно data URI) в поле
reference_audio JSON-тела, до 20 МБ. Согласие: consent_biometric: true (на обработку
биометрии — образца голоса) и voice_owner (self — ваш голос, third_party — чужой, есть
согласие владельца) пишутся в журнал согласий вместе с id клона; прежний
consent_confirmed: true принимается вместо них, пока согласия не стали обязательными.
Клонирование асинхронное. Ответ 201 приходит сразу с клоном в статусе pending
(или сразу failed с error.reason: dispatch_failed, если очередь недоступна —
тогда повторите через POST /voices/fishaudio/clones/{voiceClone}/retry). Дальше
pending → cloning → ready (или failed). Ход приходит WS-событием
voice_clone.updated на канале private-fishaudio-voice-clones.{userId}; без WS —
опрашивайте GET /voices/fishaudio/clones.
Проверки по порядку: доступ к сервису (404 service_not_found), подписка (402 no_subscription) — живая подписка с правом Fish Audio нужна, только если сервис
закрыт для оплаты с баланса; иначе клонировать можно и без подписки, — потолок
клонов (422 voice_clone_quota_exceeded, поле max — потолок): без подписки
доступно 2 клона (запасной потолок), с подпиской — лимит тарифа. Те же правила,
что у Cartesia. Исчерпанная квота токенов клону не мешает.
Требуемое право ключа: voices.write.
На этой странице(3)
Тело запроса
Новый клон голоса Fish Audio: образец записи в base64 и согласие на использование
голоса. Принимается как application/json.
{
"display_name": "My voice",
"reference_audio": "UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAIA+AAACABAAZGF0YQAAAAA=",
"language": "ru",
"description": "Audiobook narrator",
"consent_biometric": true,
"voice_owner": "self"
}Поля
Название клона — видно только вам, до 128 символов.
Образец голоса в base64; data URI (data:audio/wav;base64,…) тоже подходит.
До 20 МБ после декодирования; формат — обычная аудиозапись (WAV, MP3 и т. п.).
Нужна чистая речь одного человека без музыки и шума.
Прежняя галочка «это ваш голос или у вас есть право его использовать». Нужна, только если не передан consent_biometric: true; когда согласия станут обязательными, вместо неё — consent_biometric и voice_owner.
Справочная метка клона, двухбуквенный код ISO 639-1 (ru, en, …). У голоса Fish Audio своего языка нет, провайдеру метка не передаётся.
Ваше описание клона, до 500 символов.
Согласие на обработку биометрических данных — образца голоса (https://lumean.app/consent/biometric). Пишется в журнал согласий вместе с id клона. true — согласие дано.
Чей голос в образце: self — ваш, third_party — чужой, и у вас есть согласие его владельца.
Возможные ответы
201Клон поставлен в очередь
Клон поставлен в очередь
{
"success": true,
"message": "Success",
"data": {
"id": "01a10e08-27fe-716f-b428-6bc739602ca7",
"provider": "fishaudio",
"display_name": "My voice",
"language": "ru",
"description": null,
"status": "pending",
"voice_id": null,
"attempts": 1,
"error": null,
"created_at": "2026-10-14T09:15:00+00:00",
"completed_at": null,
"failed_at": null,
"banned_at": null,
"ban_reason": null
}
}Признак успеха. Решение принимайте по HTTP-коду: у любого ответа 2xx здесь true, а ошибка приходит телом другой формы, где этого поля может не быть вовсе.
Пояснение для человека, на языке аккаунта. Показать пользователю можно; разбирать программно — нет: формулировки меняются без предупреждения и кодом ошибки не являются.
dataобязательноеСозданный клон — в статусе pending (или сразу failed с error.reason: dispatch_failed, если очередь недоступна).
FishAudioVoiceCloneFishAudioVoiceClone
Созданный клон — в статусе pending (или сразу failed с error.reason: dispatch_failed, если очередь недоступна).
UUID клона. Его подставляют в пути /voices/fishaudio/clones/{voiceClone}/…; в шаблон он НЕ идёт — туда идёт voice_id.
Провайдер клона — всегда fishaudio.
Название клона, заданное при создании.
Справочная метка языка (ISO 639-1) либо null, если не передавалась. На клонирование не влияет.
Ваше описание клона либо null.
Статус: pending → cloning → ready либо failed; archived — снят владельцем; banned — заблокирован модератором. Озвучивать можно только ready.
Идентификатор голоса Fish Audio (строка из 32 hex-символов, не UUID) — значение для tts_settings.voice_id шаблона с service_key: fishaudio. Есть только у ready, иначе null.
Номер попытки клонирования: 1 при создании, +1 за каждый повтор.
errorобязательноеПричина отказа последней попытки; null, пока отказа не было.
может быть nullobject
Причина отказа последней попытки; null, пока отказа не было.
Машинный код отказа: processing_error, max_retries, network, timeout, dispatch_failed, unbanned (клон разбанен, но голоса у него не было). Повторить попытку — POST /voices/fishaudio/clones/{voiceClone}/retry; если processing_error повторяется, смените образец.
Пояснение к отказу для человека либо null. Ветвитесь по reason, а не по тексту.
Когда клон создан.
Когда клон стал ready; null до этого.
Когда последняя попытка завершилась отказом; null, если отказа нет.
Когда клон заблокирован модератором (status = banned); null, если блокировки нет.
Причина блокировки от модератора либо null. Заблокированный клон нельзя ни использовать, ни архивировать.
401Невалидный или отсутствующий X-API-KEY
Невалидный или отсутствующий X-API-KEY
{
"success": false,
"message": "API key is missing. Provide it in the X-API-KEY header.",
"data": null
}Всегда false в ответах об ошибке.
Текст ошибки на языке ключа (задаётся заголовком X-Locale).
Всегда null, когда запрос отклонён до обработки.
402Нет живой подписки с правом Fish Audio (no_subscription) — только если сервис закрыт для оплаты с баланса
Нет живой подписки с правом Fish Audio (no_subscription) — только если сервис закрыт для оплаты с баланса
{
"success": false,
"message": "An active subscription is required.",
"reason": "no_subscription",
"error_code": "no_subscription"
}Всегда false у ошибок.
Причина отказа словами, на языке аккаунта. Для показа пользователю; ветвиться по ней нельзя — формулировки меняются.
Машиночитаемая причина бизнес-отказа (например, input_expired, insufficient_balance). Ветвите обработку по ней, а не по тексту message.
Тот же машинный код, что в reason, — второе имя поля. Значения всегда совпадают.
403У ключа нет права voices.write
У ключа нет права voices.write
{
"success": false,
"message": "This API key does not have permission to perform this action."
}Всегда false в ответах об ошибке.
Текст ошибки на языке ключа (задаётся заголовком X-Locale).
404Сервис Fish Audio закрыт для владельца ключа (service_not_found)
Сервис Fish Audio закрыт для владельца ключа (service_not_found)
{
"success": false,
"message": "Service not found.",
"reason": "service_not_found",
"error_code": "service_not_found"
}Всегда false у ошибок.
Причина отказа словами, на языке аккаунта. Для показа пользователю; ветвиться по ней нельзя — формулировки меняются.
Машиночитаемая причина бизнес-отказа (например, input_expired, insufficient_balance). Ветвите обработку по ней, а не по тексту message.
Тот же машинный код, что в reason, — второе имя поля. Значения всегда совпадают.
422Под этим кодом два разных тела. Ошибка валидации: {success: false, message, errors: {поле: [текст]}} без reason (нет обязательного поля, нет согласия consent_biometric/consent_confirmed, language не двухбуквенный код ISO 639-1, образец не base64, больше 20 МБ или не WAV/MP3/M4A/AAC/OGG/WebM/FLAC). Потолок клонов тарифа: {success: false, message, reason: "voice_clone_quota_exceeded", error_code, max} — max это потолок; заархивируйте клон (DELETE) или перейдите на старший тариф. Различайте по наличию reason
Под этим кодом два разных тела. Ошибка валидации: {success: false, message, errors: {поле: [текст]}} без reason (нет обязательного поля, нет согласия consent_biometric/consent_confirmed, language не двухбуквенный код ISO 639-1, образец не base64, больше 20 МБ или не WAV/MP3/M4A/AAC/OGG/WebM/FLAC). Потолок клонов тарифа: {success: false, message, reason: "voice_clone_quota_exceeded", error_code, max} — max это потолок; заархивируйте клон (DELETE) или перейдите на старший тариф. Различайте по наличию reason
{
"success": false,
"message": "Validation error",
"errors": {
"consent_confirmed": [
"The consent confirmed field must be accepted."
],
"reference_audio": [
"The file is too large: 20 MB at most."
]
}
}Errors overview.
errorsобязательноеA detailed description of each field that failed validation.
object
A detailed description of each field that failed validation.
429Превышен лимит частоты клонирования (rate_limit_exceeded): по умолчанию 6 попыток в минуту и 60 в сутки на пользователя, общий с веб-кабинетом и LumVoice; считается каждая попытка, в том числе отклонённая валидацией. Ждать retry_after секунд (заголовок Retry-After)
Превышен лимит частоты клонирования (rate_limit_exceeded): по умолчанию 6 попыток в минуту и 60 в сутки на пользователя, общий с веб-кабинетом и LumVoice; считается каждая попытка, в том числе отклонённая валидацией. Ждать retry_after секунд (заголовок Retry-After)
{
"success": false,
"message": "Too many attempts. Please wait a moment and try again.",
"reason": "rate_limit_exceeded",
"error_code": "rate_limit_exceeded",
"retry_after": 30
}Всегда false в ответах об ошибке.
Текст ошибки на языке ключа (задаётся заголовком X-Locale).
Машиночитаемая причина отказа — по ней ветвите обработку, а не по тексту сообщения.
Тот же машинный код, что в reason, — второе имя поля. Значения всегда совпадают; ветвитесь по любому из них.
Через сколько секунд имеет смысл повторить запрос (то же значение — в заголовке Retry-After).
Рядом
Об этом словами
Объекты
Скормить страницу ИИ
спека 0.0.1