Создавайте видео с синхронизацией губ через мощный REST API
Управляйте ключами аутентификации
Дайте ключу запоминающееся имя (необязательно)
Требуется вход
Войдите, чтобы создавать и управлять API-ключами.
Начните с гибких и конкурентных тарифов
Примечание: кредиты API и пользователя независимы и не взаимозаменяемы.
Защитите свои API-запросы
Всегда передавайте API-ключ в заголовке Authorization:
Authorization: Bearer sk_XXXX_YYYY
RESTful эндпоинты
/api/v1/lipsync-videoВидео-видео с заменой аудио (сохранение синхронизации губ)
/api/v1/lipsync-imageИзображение + аудио → говорящий аватар (один спикер)
/api/v1/lipsync-image-multiИзображение + два аудио → многоспикерный аватар (беседа/диалог)
/api/v1/jobs/{requestId}Запрос статуса задания и получение результата
Полные спецификации эндпоинтов
Все эндпоинты имеют общую структуру: необязательный webhook и параметры formState, зависящие от модели.
Заменяет аудиодорожку в существующем видео с сохранением синхронизации губ
webhookнеобязательноВаш URL обратного вызова (HTTPS). По завершении отправим результат методом POST.
formStateобязательноОбъект со всеми параметрами генерации (см. ниже).
videoобязательноПубличный URL исходного видео (MP4, MOV и т. д.)
audioобязательноПубличный URL аудио (MP3, WAV и т. д.)
resolutionнеобязательно"480p" или "720p" (по умолчанию: 480p)
mask_imageнеобязательноПубличный URL маски (ограничивает область синхронизации губ)
promptнеобязательноТекст для стилистических подсказок
seedнеобязательноЦелочисленное зерно для воспроизводимости
Choose how to receive your results
All API calls are asynchronous. You have two options to retrieve results:
Provide a webhook URL in the JSON body. We will POST the result to your endpoint when the job completes.
Omit the webhook parameter and use the returned requestId to poll GET /api/v1/jobs/{requestId} every 5-10 seconds until status is "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:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing"
}
// 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
}// 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:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing"
}
// 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",
"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": "Invalid audio format",
"executionTime": null,
"timings": null
}Ready-to-use integration examples
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.id);
console.log('Waiting for webhook callback...');
// You don't need to poll! The result will be POSTed to your webhook.
}
submitJobWithWebhook();