Создаёт музыку и звуковые эффекты по тексту или сразу под видео, а в некоторых режимах может вернуть уже готовое видео с новым звуком. Цена - 1,5 ₽ за секунду генерации.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Sonilo 1.1 делает музыку и звуковые эффекты. Звук можно получить по текстовому описанию или сразу под готовое видео: модель смотрит на ролик и подбирает музыку или шумы под то, что происходит в кадре. В видеорежимах можно получить либо отдельную звуковую дорожку, либо сам ролик уже с новым звуком.
Типичные задачи:
Каждый вызов создаёт асинхронную операцию: сначала вы получаете id, затем проверяете статус, пока не придёт готовый файл.
POST /api/v1/operationsAuthorization: Bearer brth_...id и стартовый статус queued.Режим выбирается параметром generation_type. Всего режимов шесть:
generation_type | Что на входе | Что на выходе |
|---|---|---|
text_to_music | Текстовое описание и длительность | Аудио с музыкой |
video_to_music | Видео и, по желанию, описание | Аудио с музыкой под это видео |
video_to_video_music | Видео и, по желанию, описание | То же видео с новой музыкой |
text_to_sound_effects | Текстовое описание и длительность | Аудио со звуковым эффектом |
video_to_sound_effects | Видео и, по желанию, описание | Аудио со звуками под это видео |
video_to_video_sound_effects | Видео и, по желанию, описание | То же видео с новыми звуками |
У каждого режима свои поля: описание, длительность и ссылка на видео называются по-разному, поэтому смотрите колонку «Описание» в таблице параметров. Поля другого режима передавать не нужно, они не учитываются.
{
"tool": "sonilo-1-1",
"input": {
"generation_type": "text_to_music",
"...": "..."
}
}
tool - slug нейросети, всегда "sonilo-1-1".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
generation_type | enum | Да | Режим работы: text_to_music, video_to_music, video_to_video_music, text_to_sound_effects, video_to_sound_effects, video_to_video_sound_effects. Что делает каждый - в таблице выше. Если поле не передать, будет text_to_music. |
text_music_prompt | string | Да, в режиме text_to_music | Описание музыки: жанр, настроение, инструменты, темп. От 3 до 4000 символов. Только для text_to_music. |
text_music_duration | number | Да, в режиме text_to_music | Длительность музыки в секундах, целое число от 1 до 600. Если не передать, будет 90 секунд. Только для text_to_music. |
video_music_video_url | string (url) | Да, в режиме video_to_music | Ссылка на видео, под которое нужна музыка. Только внешние http/https URL с расширением .mp4, .mov или .webm. Только для video_to_music. |
video_music_prompt | string | Нет | Уточнение стиля и настроения музыки, до 4000 символов. Можно не передавать - модель подберёт музыку по видео. Только для video_to_music. |
video_video_music_video_url | string (url) | Да, в режиме video_to_video_music | Ссылка на видео, к которому нужно добавить музыку. Только внешние http/https URL с расширением .mp4, .mov или .webm. Только для video_to_video_music. |
video_video_music_prompt | string | Нет | Уточнение стиля и настроения музыки, до 4000 символов. Только для video_to_video_music. |
keep_speech_vocal | boolean |
Во всех примерах с видео используется ролик длиной 10 секунд.
text_to_music)30 секунд фоновой музыки. Стоимость - 45 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "sonilo-1-1",
"input": {
"generation_type": "text_to_music",
"text_music_prompt": "Спокойный лоу-фай для фона: мягкие клавишные, тёплый бас, неторопливый ритм, уютное вечернее настроение",
"text_music_duration": 30
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'sonilo-1-1',
input: {
generation_type: 'text_to_music',
text_music_prompt: 'Спокойный лоу-фай для фона: мягкие клавишные, тёплый бас, неторопливый ритм, уютное вечернее настроение',
text_music_duration: 30,
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'sonilo-1-1',
'input': {
'generation_type': 'text_to_music',
'text_music_prompt': 'Спокойный лоу-фай для фона: мягкие клавишные, тёплый бас, неторопливый ритм, уютное вечернее настроение',
'text_music_duration': 30,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
video_to_music)Модель смотрит ролик и возвращает отдельную дорожку с музыкой под него. Стоимость для 10-секундного видео - 15 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "sonilo-1-1",
"input": {
"generation_type": "video_to_music",
"video_music_video_url": "https://cdn.example.com/source-video-1.mp4",
"video_music_prompt": "Лёгкая акустическая гитара, светлое настроение"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'sonilo-1-1',
input: {
generation_type: 'video_to_music',
video_music_video_url: 'https://cdn.example.com/source-video-1.mp4',
video_music_prompt: 'Лёгкая акустическая гитара, светлое настроение',
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'sonilo-1-1',
'input': {
'generation_type': 'video_to_music',
'video_music_video_url': 'https://cdn.example.com/source-video-1.mp4',
'video_music_prompt': 'Лёгкая акустическая гитара, светлое настроение',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
video_to_video_music)На выходе тот же ролик, но уже с музыкой. С keep_speech_vocal: true речь из исходника остаётся, а музыка звучит под ней тише. Стоимость для 10-секундного видео - 15 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "sonilo-1-1",
"input": {
"generation_type": "video_to_video_music",
"video_video_music_video_url": "https://cdn.example.com/source-video-1.mp4",
"video_video_music_prompt": "Негромкая эмбиент-музыка без ударных",
"keep_speech_vocal": true
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'sonilo-1-1',
input: {
generation_type: 'video_to_video_music',
video_video_music_video_url: 'https://cdn.example.com/source-video-1.mp4',
video_video_music_prompt: 'Негромкая эмбиент-музыка без ударных',
keep_speech_vocal: true,
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'sonilo-1-1',
'input': {
'generation_type': 'video_to_video_music',
'video_video_music_video_url': 'https://cdn.example.com/source-video-1.mp4',
'video_video_music_prompt': 'Негромкая эмбиент-музыка без ударных',
'keep_speech_vocal': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
text_to_sound_effects)Пятисекундный звук костра в MP3. Стоимость - 7,5 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "sonilo-1-1",
"input": {
"generation_type": "text_to_sound_effects",
"text_sfx_prompt": "Потрескивание костра в тихом лесу, иногда щёлкают сухие ветки",
"text_sfx_duration": 5,
"audio_format": "mp3"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'sonilo-1-1',
input: {
generation_type: 'text_to_sound_effects',
text_sfx_prompt: 'Потрескивание костра в тихом лесу, иногда щёлкают сухие ветки',
text_sfx_duration: 5,
audio_format: 'mp3',
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'sonilo-1-1',
'input': {
'generation_type': 'text_to_sound_effects',
'text_sfx_prompt': 'Потрескивание костра в тихом лесу, иногда щёлкают сухие ветки',
'text_sfx_duration': 5,
'audio_format': 'mp3',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
video_to_sound_effects)Отдельная дорожка с шумами под происходящее в кадре, в формате WAV. Стоимость для 10-секундного видео - 15 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "sonilo-1-1",
"input": {
"generation_type": "video_to_sound_effects",
"video_sfx_video_url": "https://cdn.example.com/source-video-1.mp4",
"video_sfx_prompt": "Шум дождя по асфальту и шаги по лужам",
"audio_format": "wav"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'sonilo-1-1',
input: {
generation_type: 'video_to_sound_effects',
video_sfx_video_url: 'https://cdn.example.com/source-video-1.mp4',
video_sfx_prompt: 'Шум дождя по асфальту и шаги по лужам',
audio_format: 'wav',
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'sonilo-1-1',
'input': {
'generation_type': 'video_to_sound_effects',
'video_sfx_video_url': 'https://cdn.example.com/source-video-1.mp4',
'video_sfx_prompt': 'Шум дождя по асфальту и шаги по лужам',
'audio_format': 'wav',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
video_to_video_sound_effects)Немой ролик возвращается уже со звуком. Стоимость для 10-секундного видео - 15 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "sonilo-1-1",
"input": {
"generation_type": "video_to_video_sound_effects",
"video_video_sfx_video_url": "https://cdn.example.com/source-video-1.mp4",
"video_video_sfx_prompt": "Шум дождя по асфальту, шаги по лужам, редкие машины вдали",
"audio_format": "mp3"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'sonilo-1-1',
input: {
generation_type: 'video_to_video_sound_effects',
video_video_sfx_video_url: 'https://cdn.example.com/source-video-1.mp4',
video_video_sfx_prompt: 'Шум дождя по асфальту, шаги по лужам, редкие машины вдали',
audio_format: 'mp3',
},
}),
})
const data = await response.json()
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'sonilo-1-1',
'input': {
'generation_type': 'video_to_video_sound_effects',
'video_video_sfx_video_url': 'https://cdn.example.com/source-video-1.mp4',
'video_video_sfx_prompt': 'Шум дождя по асфальту, шаги по лужам, редкие машины вдали',
'audio_format': 'mp3',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "sonilo-1-1",
"cost": 7.5,
"balance_after": 492.5,
"created_at": "2026-09-30T12:46:26Z"
}
cost - сколько списано за операцию, в рублях.balance_after - баланс после списания.Так выглядит ответ для video_to_video_music и video_to_video_sound_effects:
{
"id": "op_uuid-123",
"status": "completed",
"tool": "sonilo-1-1",
"cost": 7.5,
"created_at": "2026-09-30T12:46:26Z",
"completed_at": "2026-09-30T12:46:53Z",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/sonilo-1-1/video-1.mp4"
]
},
"error_message": null
}
Так выглядит ответ для text_to_music, video_to_music, text_to_sound_effects и video_to_sound_effects:
{
"id": "op_uuid-123",
"status": "completed",
"tool": "sonilo-1-1",
"cost": 7.5,
"created_at": "2026-09-30T12:46:26Z",
"completed_at": "2026-09-30T12:46:40Z",
"result": {
"type": "audio",
"urls": [
"https://storage.bratuha.ru/results/sonilo-1-1/sound-1.mp3"
],
"files": [
{
"url": "https://storage.bratuha.ru/results/sonilo-1-1/sound-1.mp3",
"name": "result"
}
]
},
"error_message": null
}
{
"id": "op_uuid-123",
"status": "failed",
"tool": "sonilo-1-1",
"cost": 7.5,
"created_at": "2026-09-30T12:46:26Z",
"completed_at": "2026-09-30T12:46:45Z",
"result": null,
"error_message": "Текст ошибки"
}
Сохраните id из ответа на создание и запрашивайте статус операции по нему:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
async function waitForResult(id) {
while (true) {
const response = await fetch(`https://bratuha.ru/api/v1/operations/${id}`, {
headers: { Authorization: 'Bearer brth_ваш_ключ' },
})
const operation = await response.json()
if (operation.status === 'completed' || operation.status === 'failed') {
return operation
}
await new Promise((resolve) => setTimeout(resolve, 5000))
}
}
Статус операции:
queued - операция создана и ждёт запуска;processing - звук генерируется;completed - готово, ссылка лежит в result;failed - не получилось, причина в error_message.Обычно результат готов за время от 10 секунд до 1-2 минут, длинные видео и длинная музыка обрабатываются дольше. Опрашивать одну операцию можно не чаще раза в секунду, иначе придёт 429.
Тип результата зависит от режима:
generation_type | result.type | Файл |
|---|---|---|
text_to_music | audio | M4A (AAC) |
video_to_music | audio | M4A (AAC) |
video_to_video_music | video | MP4 со звуковой дорожкой AAC |
text_to_sound_effects | audio | Формат из audio_format |
video_to_sound_effects | audio | Формат из audio_format |
video_to_video_sound_effects | video | MP4 со звуковой дорожкой AAC |
Для видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/sonilo-1-1/video-1.mp4"
]
}
Для аудио:
{
"type": "audio",
"urls": [
"https://storage.bratuha.ru/results/sonilo-1-1/sound-1.mp3"
],
"files": [
{
"url": "https://storage.bratuha.ru/results/sonilo-1-1/sound-1.mp3",
"name": "result"
}
]
}
type - "audio" или "video", смотрите таблицу выше.urls - массив из одной ссылки на готовый файл. Это поле есть всегда, берите ссылку отсюда.files - для аудио дополнительно приходит та же ссылка в виде объекта с url и name.В тестовом запуске video_to_video_sound_effects на 5-секундном видео 864×496 пришёл MP4 той же длины и размера, со звуком AAC 44,1 кГц.
Все режимы стоят одинаково - 1,5 ₽ за секунду результата. От чего считаются секунды:
text_to_music - от text_music_duration;text_to_sound_effects - от text_sfx_duration;| Длительность | Цена |
|---|---|
| 1 с (минимум) | 1,5 ₽ |
| 5 с | 7,5 ₽ |
| 8 с (эффект по умолчанию) | 12 ₽ |
| 10 с | 15 ₽ |
| 30 с | 45 ₽ |
| 60 с | 90 ₽ |
| 90 с (музыка по умолчанию) | 135 ₽ |
| 600 с (максимум для текстовых режимов) | 900 ₽ |
Описание, audio_format и keep_speech_vocal на цену не влияют. Точная сумма приходит в поле cost ответа на создание операции и сразу списывается с баланса.
Обратите внимание на значения по умолчанию: если в text_to_music не передать text_music_duration, будет сгенерировано 90 секунд за 135 ₽. Всегда указывайте длительность явно.
POST /api/v1/operations не идемпотентен: каждый запрос создаёт новую операцию и списывает деньги. Не повторяйте запрос автоматически при обрыве связи.queued, результат нужно забирать запросом статуса по id.http/https URL с расширением .mp4, .mov или .webm. Адреса localhost и внутренних сетей не принимаются.400, операция не создастся и деньги не спишутся.*_prompt необязателен, но короткая подсказка вроде «только шум дождя, без музыки» помогает получить именно то, что нужно.video_to_video_music с keep_speech_vocal: true. В остальных видеорежимах такого параметра нет.| Нет |
true - сохранить речь или вокал из исходного видео, а музыку мягко приглушать под голос. По умолчанию false. Только для video_to_video_music. |
text_sfx_prompt | string | Да, в режиме text_to_sound_effects | Описание звука: источник, обстановка, характер. От 3 до 4000 символов. Только для text_to_sound_effects. |
text_sfx_duration | number | Да, в режиме text_to_sound_effects | Длительность эффекта в секундах, целое число от 1 до 600. Если не передать, будет 8 секунд. Только для text_to_sound_effects. |
video_sfx_video_url | string (url) | Да, в режиме video_to_sound_effects | Ссылка на видео, под которое нужны звуки. Только внешние http/https URL с расширением .mp4, .mov или .webm. Только для video_to_sound_effects. |
video_sfx_prompt | string | Нет | Уточнение, какие звуки нужны, до 4000 символов. Только для video_to_sound_effects. |
video_video_sfx_video_url | string (url) | Да, в режиме video_to_video_sound_effects | Ссылка на видео, которое нужно озвучить шумами. Только внешние http/https URL с расширением .mp4, .mov или .webm. Только для video_to_video_sound_effects. |
video_video_sfx_prompt | string | Нет | Уточнение, какие звуки нужны, до 4000 символов. Только для video_to_video_sound_effects. |
audio_format | enum | Да, в режимах звуковых эффектов | Формат аудиофайла для звуковых эффектов: wav, mp3, aac, flac. Если не передать, будет aac. Используется только в режимах text_to_sound_effects, video_to_sound_effects и video_to_video_sound_effects. В режиме video_to_video_sound_effects результат всё равно приходит видеофайлом MP4. |