Озвучивает видео любой длины до 10 минут: убирает лишнюю музыку, сохраняет речь и создаёт синхронные с действием звуковые эффекты и атмосферу, а ещё делает звуковые эффекты по текстовому описанию. Цена — 2,5 ₽ за секунду.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Mirelo SFX 2.0 делает звук для видео и звуковые эффекты по описанию. Главный сценарий - ролик, сгенерированный нейросетью: модель смотрит, что происходит в кадре, убирает случайную музыку и шум, оставляет речь и собирает вокруг неё звуковой дизайн - шаги, двери, воду, улицу, атмосферу, синхронно с действием. Ролики до 10 минут обрабатываются целиком, звук остаётся связным между склейками.
Типичные задачи:
Цена - за секунды: длина ролика в видеорежимах или заданная длительность в текстовом. Вызов создаёт асинхронную операцию: сначала приходит id, затем вы проверяете статус, пока не будет готов файл.
POST /api/v1/operationsAuthorization: Bearer brth_...id и стартовый статус queued.Режим выбирается параметром generation_type:
generation_type | Что на входе | Что на выходе |
|---|---|---|
video_to_video | Видео от 1 секунды до 10 минут и, по желанию, описание | То же видео с новой звуковой дорожкой |
video_to_audio | Видео от 1 секунды до 10 минут и, по желанию, описание | Только звуковая дорожка, аудиофайл той же длины |
text_to_audio | Описание звука и длительность | Аудиофайл |
Если generation_type не передать, будет video_to_video. У каждого режима свой набор полей, смотрите колонку «Описание» в таблице параметров. Поля другого режима передавать не нужно, они не учитываются.
{
"tool": "mirelo-sfx-2-0",
"input": {
"generation_type": "video_to_video",
"...": "..."
}
}
tool - slug нейросети, всегда "mirelo-sfx-2-0".input - параметры запуска. Все поля передаются прямо внутри этого объекта, вложенных объектов нет.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
generation_type | enum | Да | Режим: video_to_video - видео с новым звуком, video_to_audio - только звуковая дорожка для видео, text_to_audio - звуковой эффект по описанию. По умолчанию video_to_video. |
video_url | string (url) | Да, в режимах video_to_video и video_to_audio | Ссылка на видео длиной от 1 секунды до 10 минут. Только внешние http/https URL с расширением .mp4, .mov или .webm, файл до 128 МБ. По длине ролика считается цена. |
text_prompt_required | string | Да, в режиме text_to_audio | Описание звука: что звучит, где и как. От 1 до 2000 символов, можно по-русски. Только для text_to_audio. |
text_prompt_optional | string | Нет | Подсказка для видеорежимов: что должно звучать, если модель должна учесть что-то, чего не видно в кадре. До 2000 символов. Можно не передавать - модель ориентируется на само видео. Используется в video_to_video и video_to_audio. |
audio_duration | number | Да, в режиме text_to_audio | Длительность звука в секундах, целое число от 1 до 300. По нему считается цена. Если не передать, будет 10 секунд. Только для text_to_audio. |
preserve_speech | boolean | Нет | true - речь из исходной дорожки сохраняется, а эффекты и атмосфера строятся вокруг неё; музыка и посторонний шум при этом убираются. false - только новые звуковые эффекты, речь подавляется. По умолчанию true. Для video_to_video и video_to_audio; в текстовом режиме не учитывается. |
use_negative_prompt | boolean | Нет | true - учитывать negative_prompt. По умолчанию false. |
video_to_video)Ролик, в котором бариста говорит «Ваш кофе готов»: реплика останется, вокруг неё появятся звуки кофейни. Для 8-секундного видео стоимость - 20 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "mirelo-sfx-2-0",
"input": {
"generation_type": "video_to_video",
"video_url": "https://cdn.example.com/source-video-1.mp4",
"preserve_speech": true,
"text_prompt_optional": "Утренняя кофейня: шипение кофемашины, звон чашки о блюдце, тихий разговор за соседним столиком"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'mirelo-sfx-2-0',
input: {
generation_type: 'video_to_video',
video_url: 'https://cdn.example.com/source-video-1.mp4',
preserve_speech: true,
text_prompt_optional: 'Утренняя кофейня: шипение кофемашины, звон чашки о блюдце, тихий разговор за соседним столиком',
},
}),
})
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': 'mirelo-sfx-2-0',
'input': {
'generation_type': 'video_to_video',
'video_url': 'https://cdn.example.com/source-video-1.mp4',
'preserve_speech': True,
'text_prompt_optional': 'Утренняя кофейня: шипение кофемашины, звон чашки о блюдце, тихий разговор за соседним столиком',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
video_to_video с preserve_speech: false)Ролик без реплик - машина на пустынной дороге. Речь не нужна, музыку исключаем негативным промптом. Для 5-секундного видео стоимость - 12,5 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "mirelo-sfx-2-0",
"input": {
"generation_type": "video_to_video",
"video_url": "https://cdn.example.com/source-video-2.mp4",
"preserve_speech": false,
"text_prompt_optional": "Старый автомобиль проезжает мимо: рокот мотора, шины по гравию, порыв ветра",
"use_negative_prompt": true,
"negative_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: 'mirelo-sfx-2-0',
input: {
generation_type: 'video_to_video',
video_url: 'https://cdn.example.com/source-video-2.mp4',
preserve_speech: false,
text_prompt_optional: 'Старый автомобиль проезжает мимо: рокот мотора, шины по гравию, порыв ветра',
use_negative_prompt: true,
negative_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': 'mirelo-sfx-2-0',
'input': {
'generation_type': 'video_to_video',
'video_url': 'https://cdn.example.com/source-video-2.mp4',
'preserve_speech': False,
'text_prompt_optional': 'Старый автомобиль проезжает мимо: рокот мотора, шины по гравию, порыв ветра',
'use_negative_prompt': True,
'negative_prompt': 'музыка, голоса',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
video_to_audio)То же самое, но назад приходит не видео, а аудиофайл той же длины - для сведения в монтажной программе. Для 10-секундного видео стоимость - 25 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "mirelo-sfx-2-0",
"input": {
"generation_type": "video_to_audio",
"video_url": "https://cdn.example.com/source-video-3.mp4",
"preserve_speech": true,
"upload_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: 'mirelo-sfx-2-0',
input: {
generation_type: 'video_to_audio',
video_url: 'https://cdn.example.com/source-video-3.mp4',
preserve_speech: true,
upload_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': 'mirelo-sfx-2-0',
'input': {
'generation_type': 'video_to_audio',
'video_url': 'https://cdn.example.com/source-video-3.mp4',
'preserve_speech': True,
'upload_audio_format': 'wav',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
text_to_audio)Скрип и хлопок двери, 4 секунды, MP3. Стоимость - 10 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "mirelo-sfx-2-0",
"input": {
"generation_type": "text_to_audio",
"text_prompt_required": "Тяжёлая деревянная дверь медленно открывается со скрипом, пауза, затем захлопывается с глухим ударом",
"audio_duration": 4,
"upload_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: 'mirelo-sfx-2-0',
input: {
generation_type: 'text_to_audio',
text_prompt_required: 'Тяжёлая деревянная дверь медленно открывается со скрипом, пауза, затем захлопывается с глухим ударом',
audio_duration: 4,
upload_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': 'mirelo-sfx-2-0',
'input': {
'generation_type': 'text_to_audio',
'text_prompt_required': 'Тяжёлая деревянная дверь медленно открывается со скрипом, пауза, затем захлопывается с глухим ударом',
'audio_duration': 4,
'upload_audio_format': 'mp3',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
text_to_audio с негативным промптом)60 секунд ночного леса без музыки и голосов. Стоимость - 150 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "mirelo-sfx-2-0",
"input": {
"generation_type": "text_to_audio",
"text_prompt_required": "Ночной лес летом: сверчки, редкие крики совы, лёгкий ветер в листве, далёкий ручей",
"audio_duration": 60,
"use_negative_prompt": true,
"negative_prompt": "музыка, голоса, шаги",
"upload_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: 'mirelo-sfx-2-0',
input: {
generation_type: 'text_to_audio',
text_prompt_required: 'Ночной лес летом: сверчки, редкие крики совы, лёгкий ветер в листве, далёкий ручей',
audio_duration: 60,
use_negative_prompt: true,
negative_prompt: 'музыка, голоса, шаги',
upload_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': 'mirelo-sfx-2-0',
'input': {
'generation_type': 'text_to_audio',
'text_prompt_required': 'Ночной лес летом: сверчки, редкие крики совы, лёгкий ветер в листве, далёкий ручей',
'audio_duration': 60,
'use_negative_prompt': True,
'negative_prompt': 'музыка, голоса, шаги',
'upload_audio_format': 'wav',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "mirelo-sfx-2-0",
"cost": 20,
"balance_after": 480,
"created_at": "2026-10-16T13:50:00Z"
}
cost - сколько списано за операцию, в рублях.balance_after - баланс после списания.video_to_video{
"id": "op_uuid-123",
"status": "completed",
"tool": "mirelo-sfx-2-0",
"cost": 20,
"created_at": "2026-10-16T13:50:00Z",
"completed_at": "2026-10-16T13:50:31Z",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/mirelo-sfx-2-0/video-1.mp4"
]
},
"error_message": null
}
video_to_audio и text_to_audio{
"id": "op_uuid-123",
"status": "completed",
"tool": "mirelo-sfx-2-0",
"cost": 10,
"created_at": "2026-10-16T13:50:00Z",
"completed_at": "2026-10-16T13:50:28Z",
"result": {
"type": "audio",
"urls": [
"https://storage.bratuha.ru/results/mirelo-sfx-2-0/sound-1.mp3"
],
"files": [
{
"url": "https://storage.bratuha.ru/results/mirelo-sfx-2-0/sound-1.mp3",
"name": "result"
}
]
},
"error_message": null
}
{
"id": "op_uuid-123",
"status": "failed",
"tool": "mirelo-sfx-2-0",
"cost": 20,
"created_at": "2026-10-16T13:50:00Z",
"completed_at": "2026-10-16T13:50:40Z",
"result": null,
"error_message": "Текст ошибки"
}
Деньги за операцию со статусом failed возвращаются на баланс.
Сохраните 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 секунд, ролики 5-15 секунд - за 30 секунд. Длинные ролики обрабатываются дольше, закладывайте несколько минут. Опрашивать одну операцию можно не чаще раза в секунду, иначе придёт 429.
Тип результата зависит от режима:
generation_type | result.type | Файл |
|---|---|---|
video_to_video | video | MP4 с исходной картинкой и новой звуковой дорожкой AAC |
video_to_audio | audio | Аудиофайл в формате из upload_audio_format, длина равна видео |
text_to_audio | audio | Аудиофайл в формате из upload_audio_format, длина равна audio_duration |
Для видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/mirelo-sfx-2-0/video-1.mp4"
]
}
Для аудио:
{
"type": "audio",
"urls": [
"https://storage.bratuha.ru/results/mirelo-sfx-2-0/sound-1.wav"
],
"files": [
{
"url": "https://storage.bratuha.ru/results/mirelo-sfx-2-0/sound-1.wav",
"name": "result"
}
]
}
type - "video" или "audio", смотрите таблицу выше.urls - массив из одной ссылки на готовый файл. Это поле есть всегда, берите ссылку отсюда.files - для аудио дополнительно приходит та же ссылка в виде объекта с url и name.В проверочных запусках 16 октября 2026 года video_to_video на роликах 5-15 секунд возвращал MP4 той же длины с исходной картинкой и звуком AAC 48 кГц моно. Аудиорежимы отдавали ровно тот формат, что указан в upload_audio_format: WAV 48 кГц 16 бит моно, MP3 128 кбит/с, AAC. Длина аудио в text_to_audio совпала с audio_duration с точностью до кадра.
Все режимы стоят одинаково - 2,5 ₽ за секунду. Что считается секундами, зависит от режима:
generation_type | За что платите | Пример |
|---|---|---|
video_to_video | Длина видео | 5 с - 12,5 ₽, 8 с - 20 ₽, 60 с - 150 ₽, 10 мин - 1500 ₽ |
video_to_audio | Длина видео | 10 с - 25 ₽, 60 с - 150 ₽ |
text_to_audio | audio_duration | 4 с - 10 ₽, 30 с - 75 ₽, 300 с - 750 ₽ |
Минимум - 1 секунда, 2,5 ₽. Длительность видео сервер сам определяет по файлу и округляет до целых секунд.
Описание, preserve_speech, негативный промпт и upload_audio_format на цену не влияют. Точная сумма приходит в поле cost ответа на создание операции и сразу списывается с баланса.
POST /api/v1/operations не идемпотентен: каждый запрос создаёт новую операцию и списывает деньги. Чтобы безопасно повторять запрос при обрыве связи, передайте UUID в заголовке Idempotency-Key: повтор в течение 24 часов вернёт исходную операцию без нового списания.max_price в теле запроса, если хотите, чтобы сервер отклонил запуск дороже согласованной суммы ещё до списания. Полезно для длинных роликов: 10 минут видео стоят 1500 ₽.queued, результат нужно забирать запросом статуса по id.http/https URL с расширением .mp4, .mov или .webm. Ссылка должна открываться без авторизации, файл - до 128 МБ.400, операция не создастся и деньги не спишутся.audio_duration принимает только целые числа от 1 до 300.preserve_speech имеет смысл только для видео, в котором есть речь: при true реплики остаются на месте, а музыка и шум исходной дорожки заменяются новым звуком. Если в ролике речи нет, ставьте false - так модель не будет пытаться сохранить то, чего нет.use_negative_prompt: true. Самое частое применение - «музыка», чтобы в атмосфере не появилась случайная мелодия.negative_prompt |
string |
| Нет |
Чего в звуке быть не должно, коротким списком через запятую: «музыка, голоса, ветер». До 1000 символов. Работает только вместе с use_negative_prompt: true. |
upload_audio_format | enum | Да, в режимах video_to_audio и text_to_audio | Формат аудиофайла: wav, mp3, aac или flac. По умолчанию wav. В режиме video_to_video не учитывается - там результат всегда MP4. |