Оживляет портрет или персонажа по фото и аудиодорожке, чтобы получился говорящий видеоролик с синхронным движением губ. Цена - 20 ₽ за 1 секунду аудио.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Sync Lipsync 3 Avatar превращает портрет в говорящее видео по вашей аудиозаписи. Губы точно попадают в звуки, а сам человек ведёт себя живо: меняет выражение лица, моргает, наклоняется к камере, может показать руки в кадре. Длина ролика равна длине записи. Нейросеть берут для видеоответов от лица ведущего, озвучки персонажей, обращений в соцсетях и роликов, где нужна выразительная подача, а не просто движение губ.
Сценарий один: фото и аудио. Дополнительных настроек нет, манеру и эмоции модель берёт из голоса.
Каждый вызов создаёт асинхронную операцию. Сохраните id из ответа и проверяйте статус, пока видео не будет готово.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.{
"tool": "sync-lipsync-3-avatar",
"input": {
"image": "https://cdn.example.com/portrait.jpg",
"audio": "https://cdn.example.com/voice.mp3"
}
}
tool - slug нейросети, всегда "sync-lipsync-3-avatar".input - параметры запуска. Поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
image | string (url) | Да | Ссылка на портрет человека или персонажа. Одна картинка. Форматы: jpg, jpeg, png, webp. Лучше всего подходит чёткое фото, где лицо смотрит в камеру и хорошо освещено. |
audio | string (url) | Да | Ссылка на запись с речью или пением. Один файл. Форматы: mp3, wav, m4a, aac, flac, ogg, opus. От длительности записи зависят длина видео и цена. |
Ссылки на файлы должны открываться без авторизации по http/https, размер файла - до 128 МБ. Расширение в ссылке должно совпадать с одним из допустимых форматов, иначе API вернёт validation_error.
Текстового задания у этой нейросети нет: поведение в кадре задаёт сама запись. Если передать лишние поля, например prompt, они будут проигнорированы.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "sync-lipsync-3-avatar",
"input": {
"image": "https://cdn.example.com/portrait.jpg",
"audio": "https://cdn.example.com/voice.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: 'sync-lipsync-3-avatar',
input: {
image: 'https://cdn.example.com/portrait.jpg',
audio: 'https://cdn.example.com/voice.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': 'sync-lipsync-3-avatar',
'input': {
'image': 'https://cdn.example.com/portrait.jpg',
'audio': 'https://cdn.example.com/voice.mp3',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Тот же вызов с другим типом файлов: картинка в webp, звук в m4a, например запись с диктофона телефона.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "sync-lipsync-3-avatar",
"input": {
"image": "https://cdn.example.com/character.webp",
"audio": "https://cdn.example.com/dialogue.m4a"
}
}'
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-avatar',
input: {
image: 'https://cdn.example.com/character.webp',
audio: 'https://cdn.example.com/dialogue.m4a',
},
}),
})
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': 'sync-lipsync-3-avatar',
'input': {
'image': 'https://cdn.example.com/character.webp',
'audio': 'https://cdn.example.com/dialogue.m4a',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Пример для записи длиной 3,9 секунды: длительность округляется вверх до 4 секунд, 4 × 20 ₽ = 80 ₽.
{
"id": "op_uuid-123",
"status": "queued",
"tool": "sync-lipsync-3-avatar",
"cost": 80,
"balance_after": 920,
"created_at": "2026-09-30T21:34:08.211669+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "sync-lipsync-3-avatar",
"cost": 80,
"created_at": "2026-09-30T21:34:08.211669+00:00",
"completed_at": "2026-09-30T21:36:50.010529+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/sync-lipsync-3-avatar/avatar-1.mp4"
]
},
"error_message": null
}
{
"id": "op_uuid-123",
"status": "failed",
"tool": "sync-lipsync-3-avatar",
"cost": 80,
"created_at": "2026-09-30T21:34:08.211669+00:00",
"completed_at": "2026-09-30T21:35:40.000000+00:00",
"result": null,
"error_message": "Произошла ошибка, сервис временно недоступен. Попробуйте повторить запрос позже."
}
Сохраните id из ответа на создание и запрашивайте операцию, пока status не станет completed или failed:
GET /api/v1/operations/{id}
curl -H "Authorization: Bearer brth_ваш_ключ" \
https://bratuha.ru/api/v1/operations/op_uuid-123
async function waitForOperation(id: string) {
while (true) {
const res = await fetch(`https://bratuha.ru/api/v1/operations/${id}`, {
headers: { Authorization: 'Bearer brth_ваш_ключ' },
})
const op = await res.json()
if (op.status === 'completed' || op.status === 'failed') return op
await new Promise((resolve) => setTimeout(resolve, 10000))
}
}
Запись на 4 секунды обрабатывается около трёх минут, длинные записи - дольше. Опрашивать одну операцию можно не чаще раза в секунду, иначе API ответит 429.
После завершения в поле result приходит видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/sync-lipsync-3-avatar/avatar-1.mp4"
]
}
type - всегда "video".urls - массив ссылок на готовые видео. Для этой нейросети в нём одна ссылка на MP4.Видео идёт со звуком из вашей записи, его длина совпадает с длиной аудио: из записи на 3,9 секунды получился ролик на 3,9 секунды. Размер кадра повторяет фото: из портрета 1104×1472 получилось видео 1104×1472, 25 кадров в секунду.
Если операция завершилась с ошибкой, result будет null, а причина придёт в error_message.
Цена одна: 20 ₽ за секунду аудио.
Как считается итог:
audio. Передавать длительность в запросе не нужно.Примеры:
| Длина аудио | Цена |
|---|---|
| 3,9 секунды | 80 ₽ |
| 10 секунд | 200 ₽ |
| 1 минута | 1200 ₽ |
| 5 минут (максимум) | 6000 ₽ |
Фото на цену не влияет. Итоговая сумма приходит в поле cost сразу в ответе на создание операции и списывается с баланса в этот момент. Если операция завершилась ошибкой, деньги возвращаются на баланс, а cost в ответе остаётся суммой запуска.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую операцию и списывает деньги заново.queued, результат забираете по id.http/https URL, доступными без авторизации, размером до 128 МБ. Для image - jpg, jpeg, png, webp, для audio - mp3, wav, m4a, aac, flac, ogg, opus. Локальные адреса и приватные сети не принимаются.400 validation_error ещё до создания операции, деньги не спишутся. Минута видео стоит 1200 ₽, тишину в начале и в конце лучше обрезать заранее.validation_error, операция не создастся и деньги не спишутся.