Générez des vidéos lipsync via notre puissante API REST
Gérez vos clés d’authentification
Donnez un nom mémorisable (optionnel)
Connexion requise
Veuillez vous connecter pour créer et gérer des clés API.
Démarrez avec des plans flexibles et compétitifs
Note : Les crédits API et utilisateur sont indépendants et non interchangeables.
Sécurisez vos requêtes API
Incluez votre clé API dans l’en-tête Authorization :
Authorization: Bearer sk_XXXX_YYYY
Endpoints RESTful
/api/v1/lipsync-videoRemplacement audio vidéo-à-vidéo (lipsync conservé)
/api/v1/lipsync-imageImage + audio → avatar parlant (un seul locuteur)
/api/v1/talking-avatarImage + audio + prompt -> avatar parlant avec expression et mouvement contrôlés
/api/v1/lipsync-image-multiImage + double audio → avatar multi-locuteurs (conversation/dialogue)
/api/v1/jobs/{requestId}Interroger l’état d’un job et récupérer le résultat
Entrées, confidentialité, couverture des modèles et notes de production
L’API publique accepte actuellement des URL de médias dans le JSON. Le téléversement direct multipart et les endpoints de téléversement d’assets ne sont pas encore disponibles. Les URL signées ou temporaires sont prises en charge tant que nos workers et le fournisseur de génération peuvent les récupérer pendant l’exécution du job.
Les jobs API sont stockés en visibilité privée. Le bouton Public du web ne s’applique pas aux requêtes API et aucun paramètre API ne permet actuellement de publier une génération.
Sélectionnez le flux par endpoint : lipsync-image, lipsync-video ou lipsync-image-multi. Utilisez talking-avatar pour le modèle image avec contrôle de l’expression et du mouvement.
Cette page est la référence API actuelle. Aucune spécification OpenAPI/Swagger lisible par machine n’est actuellement publiée.
Le ratio d’aspect, guidance scale et audio guidance ne sont pas exposés comme paramètres API pour les endpoints lip-sync actuels.
Envoyez une requête API par génération. Pour les grands lots de production, gardez les URL d’entrée valides jusqu’à la fin et contactez le support avant une très forte concurrence.
Spécifications complètes des endpoints
Tous les endpoints partagent une structure commune : webhook optionnel et paramètres spécifiques au modèle dans formState.
Remplace la piste audio d’une vidéo existante en conservant la synchronisation labiale
webhookoptionnelVotre URL de callback (HTTPS). Résultat envoyé en POST à la fin.
formStaterequisObjet contenant tous les paramètres de génération (voir ci-dessous).
videorequisURL publique de la vidéo source (MP4, MOV, etc.)
audiorequisURL publique de l’audio (MP3, WAV, etc.)
resolutionrequis"360p", "480p", "720p", "1080p", "2k" ou "4k"
mask_imageoptionnelURL publique de l’image masque (limite la zone de lipsync)
promptoptionnelTexte d’orientation de style
seedoptionnelGraine entière pour la reproductibilité
Choisissez comment recevoir vos résultats
Tous les appels API sont asynchrones. Vous avez deux options pour récupérer les résultats :
Pour les jobs 1080p, 2k et 4k, les réponses webhook et polling renvoient uniquement le résultat vidéo final upscalé.
Fournissez une URL de webhook dans le JSON. Nous enverrons le résultat en POST une fois terminé.
Les URL de webhook doivent être des URL HTTPS publiques. En cas d’échec, nous réessayons jusqu’à 5 fois avec backoff exponentiel.
Omettez le webhook et utilisez le requestId renvoyé pour sonder GET /api/v1/jobs/{requestId} toutes les 5–10 s jusqu’à l’état "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
}Exemples d’intégration prêts à l’emploi
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();