Создавайте видео с синхронизацией губ через мощный REST API
Управляйте ключами аутентификации
Дайте ключу запоминающееся имя (необязательно)
Требуется вход
Войдите, чтобы создавать и управлять API-ключами.
Начните с гибких и конкурентных тарифов
Примечание: кредиты API и пользователя независимы и не взаимозаменяемы.
Защитите свои API-запросы
Всегда передавайте API-ключ в заголовке Authorization:
Authorization: Bearer sk_XXXX_YYYY
RESTful эндпоинты
/api/v1/lipsync-videoВидео-видео с заменой аудио (сохранение синхронизации губ)
/api/v1/lipsync-imageИзображение + аудио → говорящий аватар (один спикер)
/api/v1/talking-avatarИзображение + аудио + prompt -> говорящий аватар с управляемой мимикой и движением
/api/v1/lipsync-image-multiИзображение + два аудио → многоспикерный аватар (беседа/диалог)
/api/v1/jobs/{requestId}Запрос статуса задания и получение результата
Входные данные, приватность, покрытие моделей и заметки для продакшена
Публичный API сейчас принимает URL медиа в JSON. Прямая multipart-загрузка файлов и endpoints для загрузки assets пока недоступны. Подписанные или временные URL поддерживаются, если наши worker и провайдер генерации могут получить их во время выполнения задачи.
API-задачи сохраняются с приватной видимостью. Веб-переключатель Public не применяется к API-запросам, и сейчас нет API-параметра для публикации генерации.
Выберите workflow по endpoint: lipsync-image, lipsync-video или lipsync-image-multi. Используйте talking-avatar для модели изображения с управлением выражением и движением.
Эта страница является текущей справкой API. Машиночитаемая спецификация OpenAPI/Swagger пока не опубликована.
Aspect ratio, guidance scale и audio guidance не доступны как API-параметры для текущих lip-sync endpoints.
Отправляйте один API-запрос на одну генерацию. Для больших продакшен-пакетов сохраняйте входные URL действительными до завершения и свяжитесь с поддержкой перед очень высокой конкуррентностью.
Полные спецификации эндпоинтов
Все эндпоинты имеют общую структуру: необязательный webhook и параметры formState, зависящие от модели.
Заменяет аудиодорожку в существующем видео с сохранением синхронизации губ
webhookнеобязательноВаш URL обратного вызова (HTTPS). По завершении отправим результат методом POST.
formStateобязательноОбъект со всеми параметрами генерации (см. ниже).
videoобязательноПубличный URL исходного видео (MP4, MOV и т. д.)
audioобязательноПубличный URL аудио (MP3, WAV и т. д.)
resolutionобязательно"360p", "480p", "720p", "1080p", "2k" или "4k"
mask_imageнеобязательноПубличный URL маски (ограничивает область синхронизации губ)
promptнеобязательноТекст для стилистических подсказок
seedнеобязательноЦелочисленное зерно для воспроизводимости
Выберите, как получать результаты
Все API-вызовы асинхронны. Есть два способа получить результаты:
Для задач 1080p, 2k и 4k ответы webhook и polling возвращают только итоговое видео после upscale.
Укажите URL вебхука в JSON. По завершении отправим результат методом POST.
Webhook URL должны быть публичными HTTPS URL. Если доставка не удалась, мы повторяем попытку до 5 раз с экспоненциальной задержкой.
Пропустите webhook и используйте возвращённый requestId для опроса GET /api/v1/jobs/{requestId} каждые 5–10 с до статуса "completed".
POST /api/v1/lipsync-image
Authorization: Bearer sk_XXXX_YYYY
Content-Type: application/json
{
"webhook": "https://your-app.example.com/webhooks/lipsync",
"formState": {
"image": "https://.../face.png",
"audio": "https://.../voice.mp3",
"resolution": "720p",
"seed": 42
}
}
// Immediate Response:
{
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"message": "Task submitted successfully. Use requestId to query job status."
}
// Later, when job completes, we POST to your webhook:
POST https://your-app.example.com/webhooks/lipsync
Content-Type: application/json
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "lipsync-image",
"status": "completed",
"output": "https://.../result.mp4",
"error": "",
"executionTime": 12345,
"timings": null
}POST /api/v1/talking-avatar
Authorization: Bearer sk_XXXX_YYYY
Content-Type: application/json
{
"webhook": "https://your-app.example.com/webhooks/lipsync",
"formState": {
"image": "https://.../character.png",
"audio": "https://.../speech.mp3",
"prompt": "Warm presentation style, natural facial expression, subtle head motion",
"resolution": "1080p"
}
}
// Completed webhook or polling response:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "talking-avatar",
"status": "completed",
"output": "https://.../result.mp4",
"error": "",
"executionTime": 12345,
"timings": null
}// Step 1: Submit job (no webhook parameter)
POST /api/v1/lipsync-image
Authorization: Bearer sk_XXXX_YYYY
Content-Type: application/json
{
"formState": {
"image": "https://.../face.png",
"audio": "https://.../voice.mp3",
"resolution": "720p"
}
}
// Immediate Response:
{
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"message": "Task submitted successfully. Use requestId to query job status."
}
// Step 2: Poll for status (repeat every 5-10 seconds)
GET /api/v1/jobs/550e8400-e29b-41d4-a716-446655440000
Authorization: Bearer sk_XXXX_YYYY
// Response while processing:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "lipsync-image",
"status": "processing",
"output": null,
"error": "",
"executionTime": null,
"timings": null
}
// Response when completed:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "lipsync-image",
"status": "completed",
"output": "https://.../result.mp4",
"error": "",
"executionTime": 12345,
"timings": null
}
// Response if failed:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "lipsync-image",
"status": "failed",
"output": null,
"error": "Generation failed. Please try again later.",
"executionTime": null,
"timings": null
}Готовые примеры интеграции
import fetch from 'node-fetch';
import express from 'express';
const API_KEY = 'Bearer sk_XXXX_YYYY';
const BASE_URL = 'https://lipsync.studio/api/v1';
// Set up webhook server to receive results
const app = express();
app.use(express.json());
app.post('/webhooks/lipsync', (req, res) => {
const { id, status, output, error, model } = req.body;
console.log('Job update received.');
console.log('Job ID:', id);
console.log('Model:', model);
console.log('Status:', status);
if (status === 'completed') {
console.log('Video URL:', output);
} else if (status === 'failed') {
console.error('Error:', error);
}
// TODO: Save output URL to your database, send notification, etc.
res.status(200).json({ received: true });
});
app.listen(3000, () => {
console.log('Webhook server listening on port 3000');
});
// Submit job with webhook
async function submitJobWithWebhook() {
const webhookUrl = 'https://your-public-domain.com/webhooks/lipsync';
const res = await fetch(`${BASE_URL}/lipsync-image`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': API_KEY
},
body: JSON.stringify({
webhook: webhookUrl,
formState: {
image: 'https://example.com/portrait.jpg',
audio: 'https://example.com/speech.mp3',
resolution: '720p'
}
})
});
const data = await res.json();
console.log('Job submitted:', data.requestId);
console.log('Waiting for webhook callback...');
// You don't need to poll! The result will be POSTed to your webhook.
}
submitJobWithWebhook();