Синхронизирует движение губ в видео с новой аудиодорожкой, чтобы человек в кадре выглядел так, будто говорит именно этот текст. Цена - 6 ₽ за секунду аудио.
Общая документация Public API · API-ключ можно создать в настройках аккаунта
Volcengine Lip Sync меняет движения губ в готовом видео под новую аудиодорожку: человек в кадре произносит текст из вашей записи. Нейросеть подходит для дубляжа, замены реплик в рекламе и обучающих роликах, озвучки видео с ведущим. Длина ролика задаётся аудио: лишнее видео обрезается, а если видео короче, его можно зациклить.
Каждый вызов создаёт асинхронную операцию. Сохраните id из ответа и проверяйте статус, пока видео не будет готово.
POST /api/v1/operationsAuthorization: Bearer brth_...id операции и стартовый статус queued.Режимы (mode):
lite - простой ролик: один человек анфас. Обрабатывается быстрее, умеет зацикливать видео под длинное аудио и начинать с нужной секунды исходника.basic - сложная сцена: смена планов, несколько людей в кадре. Умеет определять сцены и говорящего (open_scenedet).В обоих режимах можно включить очистку голоса от шума (separate_vocal).
{
"tool": "volcengine-lip-sync",
"input": {
"mode": "lite",
"video_url": "https://cdn.example.com/source-video-1.mp4",
"audio_url": "https://cdn.example.com/source-audio-1.mp3"
}
}
tool - slug нейросети, всегда "volcengine-lip-sync".input - параметры запуска. Поля передаются прямо внутри этого объекта, без дополнительной вложенности.| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
mode | enum | Нет | lite - простой ролик с одним человеком анфас, basic - сложная сцена. Если не передать, используется lite. |
video_url | string (url) | Да | Ссылка на исходное видео. Один файл, форматы: mp4, mov, hdr. Разрешение от 360p до 1080p. |
audio_url | string (url) | Да | Ссылка на запись речи. Один файл до 10 МБ и длительностью от 1 до 600 секунд. Форматы: mp3, wav, aac, m4a, ogg. От длины записи зависят длина ролика и цена. |
separate_vocal | boolean | Нет | Очистить голос от фонового шума перед синхронизацией. По умолчанию false. |
open_scenedet | boolean | Нет | Только для mode: "basic". Определять смену сцен и говорящего. По умолчанию false. В режиме lite не используется. |
align_audio | boolean | Нет | Только для mode: "lite". Если аудио длиннее видео, зациклить видео, чтобы его хватило на всю запись. По умолчанию true. |
align_audio_reverse | boolean | Нет | Только для mode: "lite" и align_audio: true. При зацикливании проигрывать каждый следующий проход видео задом наперёд, чтобы стык был незаметнее. По умолчанию false. |
templ_start_seconds | number | Нет | Только для mode: "lite". С какой секунды исходного видео начать, шаг 0,1, не меньше 0. По умолчанию 0. |
Параметры, которые не относятся к выбранному режиму, сервер отбрасывает и модели не передаёт. Длительность файлов сервер определяет сам, передавать её в запросе не нужно.
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "volcengine-lip-sync",
"input": {
"mode": "lite",
"video_url": "https://cdn.example.com/source-video-1.mp4",
"audio_url": "https://cdn.example.com/source-audio-1.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: 'volcengine-lip-sync',
input: {
mode: 'lite',
video_url: 'https://cdn.example.com/source-video-1.mp4',
audio_url: 'https://cdn.example.com/source-audio-1.mp3',
},
}),
})
const data = await response.json()
console.log(data.id, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'volcengine-lip-sync',
'input': {
'mode': 'lite',
'video_url': 'https://cdn.example.com/source-video-1.mp4',
'audio_url': 'https://cdn.example.com/source-audio-1.mp3',
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "volcengine-lip-sync",
"input": {
"mode": "lite",
"video_url": "https://cdn.example.com/presenter-1.mp4",
"audio_url": "https://cdn.example.com/long-voice-1.mp3",
"align_audio": true,
"align_audio_reverse": true,
"templ_start_seconds": 2,
"separate_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: 'volcengine-lip-sync',
input: {
mode: 'lite',
video_url: 'https://cdn.example.com/presenter-1.mp4',
audio_url: 'https://cdn.example.com/long-voice-1.mp3',
align_audio: true,
align_audio_reverse: true,
templ_start_seconds: 2,
separate_vocal: true,
},
}),
})
const data = await response.json()
console.log(data.id, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'volcengine-lip-sync',
'input': {
'mode': 'lite',
'video_url': 'https://cdn.example.com/presenter-1.mp4',
'audio_url': 'https://cdn.example.com/long-voice-1.mp3',
'align_audio': True,
'align_audio_reverse': True,
'templ_start_seconds': 2,
'separate_vocal': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
curl -X POST https://bratuha.ru/api/v1/operations \
-H "Authorization: Bearer brth_ваш_ключ" \
-H "Content-Type: application/json" \
-d '{
"tool": "volcengine-lip-sync",
"input": {
"mode": "basic",
"video_url": "https://cdn.example.com/dialog-scene-1.mov",
"audio_url": "https://cdn.example.com/dialog-voice-1.wav",
"open_scenedet": 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: 'volcengine-lip-sync',
input: {
mode: 'basic',
video_url: 'https://cdn.example.com/dialog-scene-1.mov',
audio_url: 'https://cdn.example.com/dialog-voice-1.wav',
open_scenedet: true,
},
}),
})
const data = await response.json()
console.log(data.id, data.cost)
import requests
response = requests.post(
'https://bratuha.ru/api/v1/operations',
headers={
'Authorization': 'Bearer brth_ваш_ключ',
'Content-Type': 'application/json',
},
json={
'tool': 'volcengine-lip-sync',
'input': {
'mode': 'basic',
'video_url': 'https://cdn.example.com/dialog-scene-1.mov',
'audio_url': 'https://cdn.example.com/dialog-voice-1.wav',
'open_scenedet': True,
},
},
timeout=30,
)
print(response.status_code)
print(response.json())
Пример для аудио длиной 9,2 секунды: длительность округляется вверх до 10 секунд, 10 × 6 ₽ = 60 ₽.
{
"id": "op_uuid-123",
"status": "queued",
"tool": "volcengine-lip-sync",
"cost": 60,
"balance_after": 440,
"created_at": "2026-10-01T19:51:14.649001+00:00"
}
{
"id": "op_uuid-123",
"status": "completed",
"tool": "volcengine-lip-sync",
"cost": 60,
"created_at": "2026-10-01T19:51:14.649001+00:00",
"completed_at": "2026-10-01T19:52:50.31+00:00",
"result": {
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/volcengine-lip-sync/lip-sync-1.mp4"
]
},
"error_message": null
}
Если аудио длиннее 10 минут или его длительность не удалось прочитать, API отвечает validation_error. Операция не создаётся, деньги не списываются:
{
"error": {
"code": "validation_error",
"message": "Длительность аудио должна быть от 1 до 600 секунд.",
"request_id": "9b2f6c1e-4d7a-4f0e-8c3b-2a5d7e9f1c40"
}
}
Сохраните 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))
}
}
Сколько ждать: ролик на 5-15 секунд обычно готов за полторы-три минуты, сложная сцена и длинная запись - до пяти минут и дольше.
Опрашивать одну операцию можно не чаще раза в секунду, иначе API ответит 429.
После завершения в поле result приходит видео:
{
"type": "video",
"urls": [
"https://storage.bratuha.ru/results/volcengine-lip-sync/lip-sync-1.mp4"
]
}
type - всегда "video".urls - массив ссылок на готовые видео. Для этой нейросети в нём одна ссылка на MP4.Если операция завершилась с ошибкой, result будет null, а причина придёт в error_message.
Ролик идёт со звуком из вашей записи и длится столько же, сколько аудио: из видео на 10 секунд и записи на 9,2 секунды получается ролик на 9,2 секунды. Если аудио длиннее видео, в режиме lite с align_audio: true видео повторяется по кругу.
Цена - 6 ₽ за каждую секунду аудио, в любом режиме. Длина видео и настройки на цену не влияют.
Как считается итог:
audio_url.| Длина аудио | Цена |
|---|---|
| 5 секунд | 30 ₽ |
| 9,2 секунды | 60 ₽ |
| 32,7 секунды | 198 ₽ |
| 1 минута | 360 ₽ |
| 10 минут (максимум) | 3600 ₽ |
Итоговая сумма приходит в поле cost сразу в ответе на создание операции и списывается с баланса в этот момент. Если операция завершилась ошибкой, деньги возвращаются на баланс, а cost в ответе остаётся суммой запуска.
POST /api/v1/operations не идемпотентен: каждый повторный запрос создаёт новую операцию и списывает деньги заново.queued, результат забираете по id.http/https URL, доступными без авторизации, размером до 128 МБ. Расширение в ссылке должно совпадать с одним из допустимых форматов. Локальные адреса и приватные сети не принимаются.validation_error, операция не создастся и деньги не спишутся.align_audio, а запись длиннее видео, лучше заранее обрезать аудио под видео.lite лучше всего работает с одним человеком, который смотрит в камеру. Для смены планов и нескольких людей выбирайте basic и open_scenedet: true.separate_vocal.