Эндпоинты API
Замена фрагмента
API замены фрагмента
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обязательныйstringtask_id завершённой песни, которую нужно изменить, полученный от /v2/generate или /v2/extend.
audio_idобязательныйstringid песни внутри этой задачи (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.Ответы с ошибками
{
"code": 400,
"message": "The section must be at least 10 seconds long (requested 9.99s)."
}{
"code": 400,
"message": "The section can cover at most 50% of the song and 480s (max 59.8s for this song, requested 65s)."
}{
"code": 400,
"message": "\"infill_end_s\" must not exceed the song length (119.6s)."
}{
"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."
}{
"code": 400,
"message": "\"audio_id\" 1234 does not belong to this task. Use one of the song ids returned for \"origin_task_id\"."
}{
"code": 400,
"message": "Only songs generated with this API can be edited: send \"origin_task_id\" and \"audio_id\", without \"upload_url\" or \"model\"."
}{
"code": 402,
"message": "No available credits"
}{
"code": 401,
"message": "Invalid API key"
}