API клонирования голоса и генерации с заданным голосом (не рекомендуется)

Обновлено 2026-09-18 · команда Suno-API

⛔ Старая цепочка, не рекомендуется для новых интеграций. Эта страница описывает раннюю цепочку persona (voice_task_id / generate-with-voice). Она по-прежнему работает, но клиентам больше не рекомендуется; в навигации слева она помечена как «не рекомендуется».

Для новых интеграций используйте 【Рекомендуется】 API голосового профиля: создайте голосовой профиль из одного образца голоса (POST /api/music/voice-profile/create), а затем применяйте его, чтобы сделать кавер на выбранную песню или спеть новую. Голосовой профиль — полноценный ресурс: его можно перечислить, запросить и удалить, а исходное аудио сохраняется навсегда.

Если вашему продукту нужен полный цикл «создать голос → долго переиспользовать → делать каверы», выбирайте новую цепочку.

Важно: клонированный голос может истечь.

voice_id / voice_task_id, созданные клонированием голоса, — не вечный ресурс: они могут перестать работать из-за срока действия, состояния аккаунта или изменения состояния голоса. Интегратор не должен один раз клонировать голос и затем вечно переиспользовать сохранённый локально идентификатор.

Рекомендуемая практика:

  • Храните voice_task_id, voice_id, is_available, updated_at и время последней успешной генерации.
  • Перед каждой генерацией с клонированным голосом вызывайте GET /api/voice/clone/tasks/{voice_task_id} или POST /api/voice/clone/tasks/{voice_task_id}/check и убеждайтесь, что is_available=true.
  • Если эндпоинт сообщает, что голос недоступен, задача не существует или возвращает selected voice is not ready, предложите пользователю клонировать заново или выбрать другой доступный голос.
  • Не обещайте конечным пользователям, что клонированный голос — «вечный актив»; покажите в интерфейсе продукта, что «голос может истечь и потребовать повторной проверки или повторного клонирования».

Описание эндпоинта

Эта группа эндпоинтов создаёт переиспользуемый голос и генерирует с ним песни. Вызывающей стороне нужен только API Key, выданный платформой; сервер сам отвечает за постановку задач, синхронизацию статусов, биллинг и скачивание.

Аутентификация: Authorization: Bearer YOUR_API_KEY

Оплата:

Порядок вызовов

  1. Вызовите POST /api/voice/clone/validate, чтобы загрузить исходный голос и получить voice_task_id.
  2. Дождитесь или опрашивайте GET /api/voice/clone/tasks/{voice_task_id}, пока не получите validate_info.
  3. Пользователь читает этот текст вслух и записывает проверочное аудио.
  4. Вызовите POST /api/voice/clone/tasks/{voice_task_id}/generate, чтобы отправить проверочное аудио.
  5. Вызывайте POST /api/voice/clone/tasks/{voice_task_id}/check или продолжайте опрашивать задачу, пока не получите is_available=true.
  6. Вызовите POST /api/music/generate-with-voice, чтобы сгенерировать песню этим голосом.
  7. Эндпоинт генерации сначала возвращает задачи-заполнители; когда генерация завершится и у вас появится настоящий song_id, эндпоинты скачивания позволят получить один файл или архив.
  8. (Необязательно) Когда голос больше не нужен, вызовите DELETE /api/voice/clone/voices/{voice_task_id}, чтобы удалить его; семантика — в разделе 6.

Есть также одношаговое клонирование: на первой странице записи/загрузки исходного голоса в рабочем пространстве можно выбрать завершение в один шаг — система выполнит проверку и создание голоса сразу, так что второе проверочное аудио записывать не придётся; стоит 5 ¥ за вызов, при неудаче деньги возвращаются.

Поля задачи голоса

Поле Тип Описание
voice_task_id number ID задачи голоса внутри платформы; все последующие эндпоинты используют этот ID
voice_id string ID голоса, который можно использовать для генерации песен; возвращается, когда задача готова к работе
voice_name string Название голоса
description string Описание голоса
style string Стиль голоса
singer_skill_level string Уровень вокала; обычные значения: beginner, intermediate, professional
language string Язык исходного голоса, например zh, en
validate_info string Текст проверки, который нужно прочитать вслух
validate_status string Статус задачи проверки
voice_status string Статус создания голоса
is_available boolean Готов ли голос к генерации песен
status string Статус задачи на платформе
stage string Текущий этап
error_code string Код ошибки при неудаче
error_message string Причина неудачи
source_duration_seconds number Длительность исходного аудио в секундах
created_at number Метка времени создания
updated_at number Метка времени обновления
completed_at number Метка времени завершения

1. Отправить исходный голос на проверку

Эндпоинт: POST /api/voice/clone/validate

Параметры тела

Параметр Тип Обязателен По умолчанию Описание
voice_url string Нет - URL аудио исходного голоса. Либо он, либо file_base64
file_base64 string Нет - Аудио в base64. Либо он, либо voice_url
file_name string Нет - Имя файла; рекомендуется при использовании file_base64
voice_name string Нет создаётся автоматически Название голоса
description string Нет - Описание голоса
style string Нет - Стиль голоса
singer_skill_level string Нет beginner Уровень вокала
language string Нет zh Язык исходного голоса
vocal_start_s number Да - Секунда начала полезного вокала
vocal_end_s number Да - Секунда конца полезного вокала
source_duration_seconds number Нет - Общая длительность исходного аудио в секундах

vocal_end_s - vocal_start_s должно удовлетворять минимальному требованию к вокальному фрагменту. Загружайте чистую запись вокала без заметного сопровождения и шума.

Пример запроса

curl -X POST https://www.suno-api.io/api/voice/clone/validate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "voice_url": "https://example.com/source-voice.wav",
    "voice_name": "Мой китайский женский голос",
    "description": "Чистый и естественный китайский женский голос",
    "style": "Mandopop",
    "singer_skill_level": "intermediate",
    "language": "zh",
    "vocal_start_s": 1.2,
    "vocal_end_s": 18.5,
    "source_duration_seconds": 20
  }'

Пример ответа

{
  "success": true,
  "message": "",
  "data": {
    "voice": {
      "voice_task_id": 123,
      "voice_name": "Мой китайский женский голос",
      "language": "zh",
      "validate_status": "submitted",
      "is_available": false,
      "status": "validate_submitted",
      "stage": "validate_submitted",
      "created_at": 1780480000,
      "updated_at": 1780480000
    }
  }
}

2. Запросить задачу голоса

Эндпоинт: GET /api/voice/clone/tasks/{voice_task_id}

Пример запроса

curl https://www.suno-api.io/api/voice/clone/tasks/123 \
  -H "Authorization: Bearer YOUR_API_KEY"

Пример ответа

{
  "success": true,
  "message": "",
  "data": {
    "voice": {
      "voice_task_id": 123,
      "voice_name": "Мой китайский женский голос",
      "validate_info": "Прочитайте вслух текст проверки, возвращённый здесь",
      "validate_status": "success",
      "is_available": false,
      "status": "validate_ready",
      "stage": "validate_callback"
    }
  }
}

3. Пересоздать текст проверки

Эндпоинт: POST /api/voice/clone/tasks/{voice_task_id}/regenerate

Вызывайте, когда текст проверки неудобно читать вслух или нужно пройти проверку заново.

curl -X POST https://www.suno-api.io/api/voice/clone/tasks/123/regenerate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

4. Отправить проверочное аудио и создать голос

Эндпоинт: POST /api/voice/clone/tasks/{voice_task_id}/generate

Параметры тела

Параметр Тип Обязателен По умолчанию Описание
verify_url string Нет - URL аудио, прочитанного по тексту проверки. Либо он, либо file_base64
file_base64 string Нет - Проверочное аудио в base64. Либо он, либо verify_url
file_name string Нет - Имя файла; рекомендуется при использовании file_base64
voice_name string Нет название задачи Название голоса
description string Нет описание задачи Описание голоса
style string Нет стиль задачи Стиль голоса
singer_skill_level string Нет настройка задачи Уровень вокала

Пример запроса

curl -X POST https://www.suno-api.io/api/voice/clone/tasks/123/generate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "verify_url": "https://example.com/verify-voice.wav",
    "voice_name": "Мой китайский женский голос"
  }'

5. Проверить, доступен ли голос

Эндпоинт: POST /api/voice/clone/tasks/{voice_task_id}/check

curl -X POST https://www.suno-api.io/api/voice/clone/tasks/123/check \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Когда задача доступна, is_available в ответе равен true и возвращается voice_id.

6. Удалить голос

Эндпоинт: DELETE /api/voice/clone/voices/{voice_task_id}

Оплата: бесплатно.

curl -X DELETE https://www.suno-api.io/api/voice/clone/voices/123 \
  -H "Authorization: Bearer YOUR_API_KEY"

Пример ответа

{
  "success": true,
  "message": "",
  "data": {
    "voice_task_id": 123,
    "deleted": true
  }
}
Поле Тип Описание
voice_task_id number ID удалённой задачи голоса
deleted boolean Всегда true: запрос на удаление принят

Что происходит после удаления

7. Генерация песни клонированным голосом

Эндпоинт: POST /api/music/generate-with-voice

Оплата: 1,2 ¥ за вызов.

Параметры тела

Параметр Тип Обязателен По умолчанию Описание
voice_task_id number Да - ID уже доступной задачи голоса
voice_id string Нет - Необязательное поле проверки; если передаёте, оно должно совпадать с voice_id задачи
customMode boolean Нет false false — режим вдохновения, true — расширенный режим
prompt string Да - В режиме вдохновения это описание песни, в расширенном — текст песни. Ни то, ни другое не может быть пустым
style string Да в расширенном режиме - Теги стиля; не может быть пустым при customMode=true
title string Да в расширенном режиме - Название песни; не может быть пустым при customMode=true
negativeTags string Нет - Исключаемый стиль
instrumental boolean Нет false Поле совместимости; генерация клонированным голосом всегда считается вокальной песней
waitAudio boolean Нет false Поле совместимости; эндпоинт всегда асинхронно возвращает задачи-заполнители и не ждёт аудио
model string Нет suno-v6 Модель обычной генерации песен; доступны suno-v6, suno-v6-wild, suno-v6-mini
vocalGender string Нет - Предпочтение по полу вокала
lyricsMode string Нет - Поле совместимости; текущая цепочка отправки клонированного голоса сама по себе не меняет режим текста
weirdnessConstraint number Нет - Сила креативности
styleWeight number Нет - Вес стиля
audioWeight number Нет значение платформы по умолчанию Audio Influence (насколько важен референсный аудиофайл), диапазон 0.0-1.0. Если не передавать, применяется значение платформы по умолчанию (эквивалент 25 % в официальном интерфейсе); 0 — допустимое значение, означающее совсем не приближаться к референсу. Оно тесно связано с sourceClipId из следующей строки: с источником он указывает на референсное аудио, без источника — на клонированный голос; у платформы для обоих случаев есть только этот один ползунок, поэтому не делите его на два параметра по сценариям
sourceClipId string Нет - Реальный id клипа рабочего пространства для песни-источника. Если передать, включается кавер клонированным голосом; если не передавать — обычная генерация клонированным голосом
sourceAudioUrl string Нет - Поле отображения источника; не участвует в определении владения и аккаунта, сервер опирается на свою запись в базе данных
sourceTitle string Нет - Поле отображения источника; не участвует в определении владения и аккаунта
clientSubmissionId string Нет - Поле совместимости Create UI; для надёжной дедупликации в клиентском API нужно использовать заголовок Idempotency-Key

Поддерживаются suno-v6, suno-v6-wild и suno-v6-mini; пустое значение модели трактуется как suno-v6. Старые модели V5/V5.5 выведены, но в исторических задачах могут остаться старые имена моделей.

Общая структура запроса также разбирает поля совместимости Create UI: task, soundType, soundLoop, soundBpm, soundKey, voiceTaskId, voiceId, но они не являются допустимыми клиентскими параметрами этого эндпоинта: задача голоса должна передаваться как voice_task_id, необязательная проверка голоса — как voice_id, а генерация музыки голосом никогда не читает поля sound.

Как заполнять параметры генерации

Параметры заголовков

Заголовок Обязателен Описание
Authorization: Bearer ... Да Клиентский API-токен
Content-Type: application/json Да Тело запроса в формате JSON
Idempotency-Key Нет, настоятельно рекомендуется До 128 символов. При одинаковых пользователе, токене, эндпоинте, ключе и теле запроса списание и создание задачи происходят только один раз

Поведение Idempotency-Key:

Условия кавера через sourceClipId

Кавер из источника в клиентском API полностью обрабатывается на сервере: доступ к песне-источнику решает сервер, и клиент не передаёт данные аккаунта. Возможность определяется фактическим ответом эндпоинта.

Источник должен принадлежать текущему пользователю API, быть завершённой песней рабочего пространства, не pending:, и иметь доступное аудио. Поддерживаются обычная генерация, источники обычной загрузки и финальная песня усиленной загрузки; промежуточные записи усиленной загрузки отклоняются до списания. Сервер принимает только переданный клиентом id песни-источника и никогда не принимает id аккаунта; недоступный или незавершённый источник даёт ошибку до списания.

Пример запроса

curl -X POST https://www.suno-api.io/api/music/generate-with-voice \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "voice_task_id": 123,
    "customMode": true,
    "prompt": "Напиши китайскую поп-песню о морском береге летней ночью",
    "style": "Mandopop, warm piano, emotional",
    "title": "Морской бриз летней ночью",
    "negativeTags": "noise, low quality",
    "instrumental": false,
    "model": "suno-v6"
  }'

Пример ответа

{
  "success": true,
  "message": "",
  "data": {
    "client_request_id": "cu_1780480000_abcd1234",
    "items": [
      {
        "placeholder_id": "pending:cu_1780480000_abcd1234:0",
        "client_request_id": "cu_1780480000_abcd1234",
        "client_request_index": 0,
        "status": "submitted",
        "type": "voice_generate",
        "title": "Морской бриз летней ночью",
        "prompt": "Напиши китайскую поп-песню о морском береге летней ночью"
      },
      {
        "placeholder_id": "pending:cu_1780480000_abcd1234:1",
        "client_request_id": "cu_1780480000_abcd1234",
        "client_request_index": 1,
        "status": "submitted",
        "type": "voice_generate",
        "title": "Морской бриз летней ночью",
        "prompt": "Напиши китайскую поп-песню о морском береге летней ночью"
      }
    ],
    "pre_consumed_quota": 600000,
    "billing_source": "wallet"
  }
}

О задачах-заполнителях и итоговом song_id

generate-with-voice — асинхронный эндпоинт генерации. Успешный ответ означает лишь, что задача генерации отправлена, а не что песня готова.

Смысл ключевых полей ответа:

Поле Описание
client_request_id Идентификатор отслеживания этого запроса генерации. Один запрос обычно создаёт 2 песни, и оба результата используют один и тот же client_request_id.
items[].placeholder_id Локальный заполнитель платформы, обычно в форме pending:{client_request_id}:{index}. Это не итоговый id песни.
items[].client_request_index Номер результата внутри одного запроса, обычно 0 и 1.
items[].status Начальный статус после отправки, например submitted. Дальнейший успех или неудача определяются итоговой записью задачи.

Внимание: placeholder_id, начинающийся с pending:, нельзя использовать как итоговый song_id и нельзя передавать в /api/music/query или эндпоинты скачивания. Если вызвать /api/music/query только со значениями pending:*, может вернуться пустой массив [], потому что настоящая песня ещё не готова или задача-заполнитель ещё не заменена итоговым id песни.

Неверный пример:

{
  "song_ids": "pending:cu_1780480000_abcd1234:0"
}

Правильный порядок:

  1. Вызовите POST /api/music/generate-with-voice, чтобы отправить задачу генерации голосом.
  2. Сохраните client_request_id, items[].placeholder_id и items[].client_request_index из ответа.
  3. Опрашивайте GET /api/music/generate-with-voice/results?client_request_id=cu_xxx.
  4. Когда items[].song_id получит значение, не начинающееся с pending:, вызывайте /api/music/query, /api/music/download-file или /api/music/download-all.

Текущая версия добавляет публичный эндпоинт запроса:

GET /api/music/generate-with-voice/results?client_request_id=cu_xxx

Он возвращает результаты задач с тем же client_request_id у текущего пользователя, чтобы клиент сам мог узнать итоговый song_id. В возвращаемом списке:

Если вы сохранили только client_request_id или заполнитель pending:*, сначала вызовите этот эндпоинт результатов; если настоящий song_id всё ещё не найден, передайте client_request_id в техподдержку для локализации.

Запрос результатов генерации голосом

Эндпоинт: GET /api/music/generate-with-voice/results

Оплата: бесплатно.

Параметры запроса

Параметр Тип Обязателен Описание
client_request_id string Да Идентификатор отслеживания, возвращённый generate-with-voice

Пример запроса

curl -X GET "https://www.suno-api.io/api/music/generate-with-voice/results?client_request_id=cu_1780480000_abcd1234" \
  -H "Authorization: Bearer YOUR_API_KEY"

Пример ответа во время генерации

{
  "success": true,
  "message": "",
  "data": {
    "client_request_id": "cu_1780480000_abcd1234",
    "status": "processing",
    "items": [
      {
        "song_id": "",
        "placeholder_id": "pending:cu_1780480000_abcd1234:0",
        "client_request_id": "cu_1780480000_abcd1234",
        "client_request_index": 0,
        "status": "processing",
        "type": "voice_generate",
        "title": "Морской бриз летней ночью"
      }
    ]
  }
}

Пример ответа после завершения

{
  "success": true,
  "message": "",
  "data": {
    "client_request_id": "cu_1780480000_abcd1234",
    "status": "completed",
    "items": [
      {
        "song_id": "song_abc123",
        "client_request_id": "cu_1780480000_abcd1234",
        "client_request_index": 0,
        "status": "completed",
        "type": "voice_generate",
        "title": "Морской бриз летней ночью",
        "audio_url": "https://...",
        "image_url": "https://...",
        "duration": 180.5
      }
    ]
  }
}

Значения верхнеуровневого status

Статус Описание
not_found У текущего пользователя ещё нет записи задачи с таким client_request_id
processing Как минимум один результат не завершён; продолжайте опрос
completed Все результаты завершены; можно запрашивать или скачивать по song_id
partial Часть завершена, часть неудачна; сначала обработайте завершённые song_id
failed Все результаты неудачны; смотрите items[].error_message

8. Скачать один файл

Эндпоинт: POST /api/music/download-file

Параметры тела

Параметр Тип Обязателен Описание
song_id string Да ID песни
kind string Да Тип скачивания: audio, cover, wav, video

Пример запроса

curl -X POST https://www.suno-api.io/api/music/download-file \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "song_id": "song_abc123",
    "kind": "audio"
  }' \
  --output song.mp3

Ответ — поток файла; Content-Type и имя файла соответствуют тому, что возвращает бэкенд.

9. Скачать ресурсы песни архивом

Эндпоинт: POST /api/music/download-all

Параметры тела

Параметр Тип Обязателен Описание
song_id string Да ID песни

Пример запроса

curl -X POST https://www.suno-api.io/api/music/download-all \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "song_id": "song_abc123"
  }' \
  --output song.zip

Архив обычно содержит аудио, обложку и metadata.json; если какой-то тип ресурса ещё не создан, он не попадает в архив.

Частые ошибки

message Описание
voice audio is required При отправке исходного голоса не указан ни voice_url, ни file_base64
invalid voice task id ID задачи голоса в пути недействителен
voice validation is not ready Текст проверки ещё не получен, поэтому проверочное аудио отправить нельзя
selected voice is not ready Выбранный голос пока не может генерировать песни (не готов, удалён или не принадлежит текущему аккаунту)
selected voice does not match voice task voice_id в запросе не совпадает с задачей
voice task is required При генерации песни голосом отсутствует voice_task_id
record not found Задача / песня не существует, не принадлежит аккаунту текущего API Key или уже удалена (если запросить эту задачу после удаления голоса, вы увидите то же самое)

Ошибки этой группы всегда возвращают HTTP 200: определяйте результат по полю success в теле ответа (false — неудача, причина в message), а не только по коду состояния HTTP. Полная семантика удаления голоса (можно ли им пользоваться дальше, можно ли восстановить) — в разделе 6.

Далее【Рекомендуется】 API голосового профиля

Получить API-ключ

Создайте API-ключ в консоли после регистрации. Одна генерация стоит 0,6 ¥ и возвращает 2 трека, загрузки не ограничены, номер телефона не нужен.

Получить API-ключ Вернуться к обзору