Эндпоинты API

Замена фрагмента

API замены фрагмента

POST
https://udioapi.pro/api/v2/replace-section

Перегенерируйте одну часть уже созданной песни, например несколько секунд с дефектом или строку, которую нужно спеть иначе, и получите всю песню с обновлённым фрагментом.

Как это работает

  • Выберите временное окно в завершённой песне. Песня перерисовывается вокруг этого окна и возвращается в виде полных треков (обычно два варианта) через тот же процесс задач, что и генерация музыки.
  • Примерно по 10 секунд с каждой стороны окна тоже перерисовываются, чтобы новая часть звучала естественно. Всё за пределами этого диапазона остаётся прежним, меняется только кодирование аудио.
  • Правила окна, проверяются до списания кредитов: не менее 10 секунд, не более 50% песни и не более 480 секунд, а infill_end_s не может превышать длительность песни.
  • Если lyrics не передан, текст, звучащий внутри окна, подставляется автоматически по пословным таймкодам песни. Передайте его сами, если нужны другие слова.
  • Результат, длительность которого отличается от оригинала более чем на 15 секунд, отбрасывается. Если результатов не осталось, задача завершается со статусом FAILED и кредиты возвращаются; обычно помогает сдвинуть начало или конец окна на несколько секунд.
  • 5 кредитов за запрос, списываются при принятии запроса. Запросы, отклонённые при проверке, и неудавшиеся задачи возвращаются автоматически.
  • Редактировать можно только песни, созданные через /v2/generate или /v2/extend с тем же API-ключом. Загруженное аудио и предыдущие результаты замены не поддерживаются как источник.

Быстрый старт

{
  "origin_task_id": "gen2cd84c4e3ecb94ed6a9137a8f12138ca1bksv",
  "audio_id": "24015dc4-1b81-4033-9f41-cf47a3fae958",
  "infill_start_s": 70,
  "infill_end_s": 85,
  "prompt": "Same melody and arrangement, cleaner vocal in this part"
}

style, title и full_lyrics необязательны. Если они не указаны, используются значения исходной песни.

Ответ

{
  "code": 200,
  "message": "success",
  "workId": "rep2a15b5bbc14304ca89fcc7b7eae29c8a7bksv",
  "data": {
    "task_id": "rep2a15b5bbc14304ca89fcc7b7eae29c8a7bksv"
  }
}

Опрашивайте полученный workId каждые 5–10 секунд, пока статус не станет SUCCESS или FAILED, с помощью API статуса задачи

Параметры

Обязательные параметры

origin_task_idобязательныйstring

task_id завершённой песни, которую нужно изменить, полученный от /v2/generate или /v2/extend.

audio_idобязательныйstring

id песни внутри этой задачи (response_data[].id). Обычно задача возвращает две песни; выберите нужную.

infill_start_sобязательныйnumber

Начало фрагмента в секундах: 0 или больше, до двух знаков после запятой.

infill_end_sобязательныйnumber

Конец фрагмента в секундах. Должен быть как минимум на 10 секунд позже infill_start_s и не выходить за конец песни.

promptобязательныйstring

Как должен измениться фрагмент, до 1000 символов, например "Same melody and arrangement, cleaner vocal in this part".

Необязательные параметры

lyricsнеобязательныйstring

Текст, который нужно спеть внутри фрагмента, до 5000 символов. По умолчанию используется текст, звучащий сейчас в окне.

styleнеобязательныйstring

Музыкальный стиль результата, до 1000 символов. По умолчанию стиль исходной песни.

titleнеобязательныйstring

Название результата, до 80 символов. По умолчанию исходное название.

full_lyricsнеобязательныйstring

Полный текст изменённой песни, до 5000 символов. По умолчанию исходный текст.

callback_urlнеобязательныйstring

Публичный URL, получающий итоговый результат с теми же элементами, что и response_data в статусе задачи. Опрос работает и без него.

Результаты

При успешном выполнении response_data содержит новые песни полной длины. У каждого элемента свои id, audio_url и duration. Если исходную длительность сохранил только один вариант, возвращается только он.

{
  "code": 200,
  "message": "success",
  "data": {
    "type": "SUCCESS",
    "request_body": {
      "origin_task_id": "gen2cd84c4e3ecb94ed6a9137a8f12138ca1bksv",
      "audio_id": "24015dc4-1b81-4033-9f41-cf47a3fae958",
      "infill_start_s": 70,
      "infill_end_s": 85,
      "prompt": "Same melody and arrangement, cleaner vocal in this part"
    },
    "response_data": [
      {
        "id": "3a8248e4-07b0-4ceb-92b7-34b7615d2552",
        "audio_url": "https://…/3a8248e4-07b0-4ceb-92b7-34b7615d2552.mp3",
        "image_url": "https://…/3a8248e4-07b0-4ceb-92b7-34b7615d2552.jpeg",
        "status": "complete",
        "title": "Harbor Lights",
        "duration": 119.6,
        "model_name": "chirp-v6-mini"
      },
      {
        "id": "eac654a1-5c07-4b6c-896a-59061d323e11",
        "audio_url": "https://…/eac654a1-5c07-4b6c-896a-59061d323e11.mp3",
        "image_url": "https://…/eac654a1-5c07-4b6c-896a-59061d323e11.jpeg",
        "status": "complete",
        "title": "Harbor Lights",
        "duration": 120.84,
        "model_name": "chirp-v6-mini"
      }
    ]
  }
}

Если все результаты изменили длительность песни или фрагмент не удалось отрисовать, задача получает статус FAILED, а кредиты возвращаются:

{
  "code": 200,
  "message": "success",
  "data": {
    "type": "FAILED",
    "response_data": [
      {
        "status": "FAILED",
        "fail_message": "Generation failed. Your credits have been refunded. The result changed the song length (119.6s -> 225.36s / 224.6s), so it was discarded. Try moving the section start or end by a few seconds.",
        "error_message": "Generation failed. Your credits have been refunded. The result changed the song length (119.6s -> 225.36s / 224.6s), so it was discarded. Try moving the section start or end by a few seconds."
      },
      {
        "status": "FAILED",
        "fail_message": "Generation failed. Your credits have been refunded. The result changed the song length (119.6s -> 225.36s / 224.6s), so it was discarded. Try moving the section start or end by a few seconds.",
        "error_message": "Generation failed. Your credits have been refunded. The result changed the song length (119.6s -> 225.36s / 224.6s), so it was discarded. Try moving the section start or end by a few seconds."
      }
    ]
  }
}

Примеры кода

cURL

curl -X POST "https://udioapi.pro/api/v2/replace-section" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "origin_task_id": "gen2cd84c4e3ecb94ed6a9137a8f12138ca1bksv",
    "audio_id": "24015dc4-1b81-4033-9f41-cf47a3fae958",
    "infill_start_s": 70,
    "infill_end_s": 85,
    "prompt": "Same melody and arrangement, cleaner vocal in this part"
  }'

JavaScript

const response = await fetch('https://udioapi.pro/api/v2/replace-section', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "origin_task_id": "gen2cd84c4e3ecb94ed6a9137a8f12138ca1bksv",
    "audio_id": "24015dc4-1b81-4033-9f41-cf47a3fae958",
    "infill_start_s": 70,
    "infill_end_s": 85,
    "prompt": "Same melody and arrangement, cleaner vocal in this part"
  })
});

const { workId } = await response.json();
// Poll https://udioapi.pro/api/v2/feed?workId=... every 5-10 seconds until SUCCESS or FAILED.

Python

import requests

response = requests.post(
    "https://udioapi.pro/api/v2/replace-section",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
      "origin_task_id": "gen2cd84c4e3ecb94ed6a9137a8f12138ca1bksv",
      "audio_id": "24015dc4-1b81-4033-9f41-cf47a3fae958",
      "infill_start_s": 70,
      "infill_end_s": 85,
      "prompt": "Same melody and arrangement, cleaner vocal in this part"
    },
)
work_id = response.json()["workId"]
# Poll https://udioapi.pro/api/v2/feed?workId=... every 5-10 seconds until SUCCESS or FAILED.

Ответы с ошибками

400 · Фрагмент короче 10 секунд
{
  "code": 400,
  "message": "The section must be at least 10 seconds long (requested 9.99s)."
}
400 · Фрагмент длиннее 50% песни
{
  "code": 400,
  "message": "The section can cover at most 50% of the song and 480s (max 59.8s for this song, requested 65s)."
}
400 · Фрагмент заканчивается после конца песни
{
  "code": 400,
  "message": "\"infill_end_s\" must not exceed the song length (119.6s)."
}
400 · Исходная задача не найдена или не завершена
{
  "code": 400,
  "message": "The provided \"origin_task_id\" is invalid or could not be found. Use the task_id of a completed song generated with your API key."
}
400 · audio_id не относится к задаче
{
  "code": 400,
  "message": "\"audio_id\" 1234 does not belong to this task. Use one of the song ids returned for \"origin_task_id\"."
}
400 · Загруженное аудио не поддерживается
{
  "code": 400,
  "message": "Only songs generated with this API can be edited: send \"origin_task_id\" and \"audio_id\", without \"upload_url\" or \"model\"."
}
402 · Недостаточно кредитов
{
  "code": 402,
  "message": "No available credits"
}
401 · Неверный API-ключ
{
  "code": 401,
  "message": "Invalid API key"
}