Генерирует звуковую дорожку для видео по самому ролику и текстовому описанию, чтобы добавить эффекты, фоновые шумы и нужную атмосферу. Цена - 0,2 ₽ за 1 секунду аудио.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
MMaudio v2 озвучивает немое видео: смотрит, что происходит в кадре, и по вашему описанию создаёт подходящие шумы, звуковые эффекты и атмосферу. На выходе - тот же ролик уже со звуковой дорожкой.
Типичные задачи:
Звук строится по видео и тексту prompt, а платите вы за секунды из duration. Вызов создаёт асинхронную операцию: сначала приходит id, затем вы проверяете статус, пока не будет готов файл.
POST /api/v1/operationsAuthorization: Bearer brth_...id и стартовый статус queued.Режим у нейросети один: видео плюс текстовое описание звука. Негативный промпт и настройки генерации необязательны.
{
"tool": "mmaudio-v2",
"input": {
"video": "https://cdn.example.com/source-video-1.mp4",
"prompt": "Шум дождя по асфальту, шаги по лужам",
"duration": 5
}
}
tool - slug нейросети, всегда "mmaudio-v2".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
video | string (url) | Да | Ссылка на видео, которое нужно озвучить. Только внешние http/https URL с расширением .mp4, .mov или .webm. |
prompt | string | Да | Какие звуки нужны: источники, обстановка, характер. Например: «дождь по асфальту, шаги по лужам, машины вдали». |
use_negative_prompt | boolean | Нет | true - учитывать negative_prompt. По умолчанию false. |
negative_prompt | string | Нет | Чего в звуке быть не должно: «music, voices, noise». Передавайте вместе с use_negative_prompt: true. Если негативный промпт не нужен, просто не передавайте это поле. |
duration | number | Да | Длительность звуковой дорожки в секундах, целое число от 1 до 30. По этому значению считается цена. Если не передать, будет 8 секунд. Ставьте равной длине ролика, округлённой вверх (подробности в «Ограничениях»). |
num_inference_steps | number | Да | Число шагов генерации, целое от 4 до 50. Больше шагов - обычно аккуратнее звук, но дольше обработка. На цену не влияет. Если не передать, будет 25. |
guidance_scale | number | Да | Насколько строго модель следует тексту prompt, число от 0 до 10, можно дробное, например 4.5. Больше значение - ближе к описанию, меньше - свободнее. Если не передать, будет 4,5. |
mask_away_clip | boolean | Нет | true - модель перестаёт опираться на содержание кадра и подбирает звук в основном по тексту prompt. Полезно, когда нужен звук, которого в кадре не видно. По умолчанию false. |
Поля с «Да» в колонке «Обязательный», у которых есть значение по умолчанию, можно не передавать - подставится значение по умолчанию. Но duration лучше указывать всегда: от него зависит цена.
Во всех примерах используется ролик длиной 5 секунд.
Базовый вызов: видео, описание и длительность, равная длине ролика. Стоимость - 1 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "mmaudio-v2",
"input": {
"video": "https://cdn.example.com/source-video-1.mp4",
"prompt": "Шум дождя по асфальту, шаги по лужам, редкие машины вдали",
"duration": 5,
"num_inference_steps": 25,
"guidance_scale": 4.5
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'mmaudio-v2',
input: {
video: 'https://cdn.example.com/source-video-1.mp4',
prompt: 'Шум дождя по асфальту, шаги по лужам, редкие машины вдали',
duration: 5,
num_inference_steps: 25,
guidance_scale: 4.5,
},
}),
})
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': 'mmaudio-v2',
'input': {
'video': 'https://cdn.example.com/source-video-1.mp4',
'prompt': 'Шум дождя по асфальту, шаги по лужам, редкие машины вдали',
'duration': 5,
'num_inference_steps': 25,
'guidance_scale': 4.5,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Убираем музыку и голоса, усиливаем следование тексту. Для 10-секундного ролика с duration: 10 стоимость - 2 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "mmaudio-v2",
"input": {
"video": "https://cdn.example.com/source-video-1.mp4",
"prompt": "Heavy rain on asphalt, footsteps splashing through puddles, distant city traffic",
"use_negative_prompt": true,
"negative_prompt": "music, voices, speech",
"duration": 10,
"num_inference_steps": 30,
"guidance_scale": 6,
"mask_away_clip": false
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'mmaudio-v2',
input: {
video: 'https://cdn.example.com/source-video-1.mp4',
prompt: 'Heavy rain on asphalt, footsteps splashing through puddles, distant city traffic',
use_negative_prompt: true,
negative_prompt: 'music, voices, speech',
duration: 10,
num_inference_steps: 30,
guidance_scale: 6,
mask_away_clip: false,
},
}),
})
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': 'mmaudio-v2',
'input': {
'video': 'https://cdn.example.com/source-video-1.mp4',
'prompt': 'Heavy rain on asphalt, footsteps splashing through puddles, distant city traffic',
'use_negative_prompt': True,
'negative_prompt': 'music, voices, speech',
'duration': 10,
'num_inference_steps': 30,
'guidance_scale': 6,
'mask_away_clip': False,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "mmaudio-v2",
"cost": 1,
"balance_after": 499,
"created_at": "2026-09-30T19:49:45Z"
}
cost - сколько списано за операцию, в рублях.balance_after - баланс после списания.{
"id": "op_uuid-123",
"status": "completed",
"tool": "mmaudio-v2",
"cost": 1,
"created_at": "2026-09-30T19:49:45Z",
"completed_at": "2026-09-30T19:50:13Z",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/mmaudio-v2/video-1.mp4"
]
},
"error_message": null
}
{
"id": "op_uuid-123",
"status": "failed",
"tool": "mmaudio-v2",
"cost": 1,
"created_at": "2026-09-30T19:49:45Z",
"completed_at": "2026-09-30T19:49:47Z",
"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.Обычно результат готов за 20 секунд - 2 минуты, иногда до 5 минут. Опрашивать одну операцию можно не чаще раза в секунду, иначе придёт 429.
В result приходит видео - исходный ролик с новой звуковой дорожкой:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/mmaudio-v2/video-1.mp4"
]
}
type - всегда "video".urls - массив из одной ссылки на MP4.Отдельного аудиофайла нет: если нужна только дорожка, извлеките её из MP4 (например, ffmpeg -i video-1.mp4 -vn -c:a copy sound.m4a).
В тестовом запуске на 5-секундном ролике 864×496 с duration: 8 пришёл MP4 длиной 5 секунд, того же размера, со звуком AAC 44,1 кГц, моно.
0,2 ₽ за секунду из параметра duration.
duration | Цена |
|---|---|
| 1 с (минимум) | 0,2 ₽ |
| 5 с | 1 ₽ |
| 8 с (по умолчанию) | 1,6 ₽ |
| 10 с | 2 ₽ |
| 20 с | 4 ₽ |
| 30 с (максимум модели) | 6 ₽ |
Длина видео, текст, негативный промпт, num_inference_steps, guidance_scale и mask_away_clip на цену не влияют. Точная сумма приходит в поле cost ответа на создание операции и сразу списывается с баланса.
POST /api/v1/operations не идемпотентен: каждый запрос создаёт новую операцию и списывает деньги. Не повторяйте запрос автоматически при обрыве связи.queued, результат нужно забирать запросом статуса по id.http/https URL с расширением .mp4, .mov или .webm. Ссылка должна открываться без авторизации, файл - до 128 МБ.duration больше длины ролика не удлиняет результат: в тесте 5-секундное видео с duration: 8 вернулось длиной 5 секунд, а списано было за 8. Чтобы не переплачивать, ставьте duration равным длине ролика, округлённой вверх до целой секунды.duration не больше 30 секунд. При большем значении операция создаётся, но завершается ошибкой. Для роликов длиннее 30 секунд режьте видео на части.num_inference_steps меньше 4 модель тоже отклоняет с ошибкой.