Синхронизирует движения губ в видео с загруженным аудио, чтобы речь выглядела естественно. Цена - 20 ₽ за секунду готового ролика: в «Обрезать лишнее» он по более короткому файлу, в «Тишине» - по более длинному, в остальных режимах - по аудио.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Sync Lipsync 3.0 - третье поколение модели для синхронизации губ. Она подгоняет речь человека в видео под новое аудио и бережнее держит лицо: мимику, зубы, освещение, повороты головы. Подходит для дубляжа роликов на другой язык, замены реплики в готовом видео, клипов под песню. На вход - видео с лицом и аудио, на выходе - то же видео с новой речью.
Каждый вызов создаёт асинхронную операцию. После запуска сохраните id и проверяйте статус отдельным запросом.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.На вход всегда нужны два файла - видео и аудио. Если они разной длины, поведение задаёт sync_mode:
cut_off - ролик по более короткому файлу, silence - по более длинному, цена по длине ролика;loop, bounce и remap - ролик длиной с аудио, цена по длине аудио. Так можно озвучить длинной речью короткий клип.{
"tool": "sync-lipsync-3",
"input": {
"...": "..."
}
}
tool - slug нейросети, всегда "sync-lipsync-3".input - параметры запуска. Все поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
video_url | string (url) | Да | Ссылка на исходное видео с лицом человека: mp4, mov или webm, от 1 до 600 секунд. |
audio_url | string (url) | Да | Ссылка на новую речь или песню: mp3, wav, m4a, aac, flac, ogg или opus, от 1 до 600 секунд. |
sync_mode | enum | Нет | Что делать, если видео и аудио разной длины. cut_off - обрезать лишнее: ролик получается длиной с более короткий файл. loop - зациклить видео под длину аудио. bounce - пинг-понг: видео идёт вперёд и назад, пока звучит аудио. remap - ускорить или замедлить видео ровно под длину аудио. silence - дополнить аудио тишиной до конца видео. Если не передать, используется cut_off. От режима зависит, по какому файлу считается цена - см. «Ценообразование». |
Видео и аудио примерно одной длины, лишнее обрезается (cut_off). Цена считается по более короткому файлу.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "sync-lipsync-3",
"input": {
"video_url": "https://cdn.example.com/source-video-1.mp4",
"audio_url": "https://cdn.example.com/source-audio-1.mp3",
"sync_mode": "cut_off"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'sync-lipsync-3',
input: {
video_url: 'https://cdn.example.com/source-video-1.mp4',
audio_url: 'https://cdn.example.com/source-audio-1.mp3',
sync_mode: 'cut_off',
},
}),
})
const data = await response.json()
console.log(data.id, data.status, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'sync-lipsync-3',
'input': {
'video_url': 'https://cdn.example.com/source-video-1.mp4',
'audio_url': 'https://cdn.example.com/source-audio-1.mp3',
'sync_mode': 'cut_off',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Видео на 8 секунд, песня на 40 секунд: в режиме loop видео повторяется с начала, пока звучит песня. Ролик получится длиной с аудио, цена считается по нему - здесь 40 секунд, 800 ₽.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "sync-lipsync-3",
"input": {
"video_url": "https://cdn.example.com/short-clip-1.mp4",
"audio_url": "https://cdn.example.com/song-1.mp3",
"sync_mode": "loop"
}
}'
const response = await fetch('https://bratuha.ru/api/v1/operations', {
method: 'POST',
headers: {
Authorization: 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tool: 'sync-lipsync-3',
input: {
video_url: 'https://cdn.example.com/short-clip-1.mp4',
audio_url: 'https://cdn.example.com/song-1.mp3',
sync_mode: 'loop',
},
}),
})
const data = await response.json()
console.log(data.id, data.status, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'sync-lipsync-3',
'input': {
'video_url': 'https://cdn.example.com/short-clip-1.mp4',
'audio_url': 'https://cdn.example.com/song-1.mp3',
'sync_mode': 'loop',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
{
"id": "op_uuid-123",
"status": "queued",
"tool": "sync-lipsync-3",
"cost": 100,
"balance_after": 950,
"created_at": "2026-10-01T16:16:03.864980+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "sync-lipsync-3",
"cost": 100,
"created_at": "2026-10-01T16:16:03.864980+00:00",
"completed_at": "2026-10-01T16:18:12.247493+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/sync-lipsync-3/video-1.mp4"
]
},
"error_message": null
}
Если модель не справилась, операция завершается со статусом failed, в result приходит null, а причина - в error_message. Списанная сумма возвращается на баланс.
{
"id": "op_uuid-123",
"status": "failed",
"tool": "sync-lipsync-3",
"cost": 100,
"created_at": "2026-10-01T16:16:03.864980+00:00",
"completed_at": "2026-10-01T16:18:12.247493+00:00",
"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: string) {
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, 10000))
}
}
Статус меняется так: queued - в очереди, processing - видео обрабатывается, затем completed или failed. Обычно ролик в несколько секунд готов за 1-4 минуты, длинные записи обрабатываются дольше. Одну операцию можно опрашивать не чаще раза в секунду, разумный интервал - 10-20 секунд.
После завершения в result приходит одно видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/sync-lipsync-3/video-1.mp4"
]
}
type - всегда "video".urls - массив с одной ссылкой на MP4 с вашей аудиодорожкой.sync_mode: cut_off - по более короткому файлу, loop, bounce, remap - по аудио, silence - по более длинному файлу.Цена - 20 ₽ за секунду. Других настроек, влияющих на цену, нет.
| Что оплачивается | Цена |
|---|---|
| 1 секунда | 20 ₽ |
Как считаются секунды:
cut_off - по более короткому из двух файлов;silence - по более длинному из двух файлов;loop, bounce и remap - по длине аудио, ведь ролик получается такой же длины.Длительность округляется вверх до целой секунды: видео 4,2 секунды оплачивается как 5 секунд. Минимум - 1 секунда, максимум - 600 секунд. Сумма списывается при создании операции и видна в поле cost.
Пример для видео 5 секунд и аудио 9,2 секунды: cut_off - 5 секунд (100 ₽), silence, loop, bounce и remap - 10 секунд (200 ₽).
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую платную операцию. Если ответ на создание потерялся, не отправляйте запрос вслепую ещё раз - сначала проверьте историю операций в личном кабинете.queued, результат забирайте через GET /api/v1/operations/{id}.http/https ссылками: видео - mp4, mov или webm, аудио - mp3, wav, m4a, aac, flac, ogg или opus. Ссылка должна открываться без авторизации, файл - до 128 МБ. Адреса localhost и внутренних сетей не принимаются.400 validation_error и деньги не спишутся.400 validation_error.