Démarrer la traduction
curl --request POST \
--url https://api.voicecheap.ai/v1/translate \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"targetLanguage": "<string>",
"originalLanguage": "<string>",
"projectName": "<string>",
"webhookUrl": "<string>",
"numberOfSpeakers": "<string>",
"brandVocabulary": "<string>",
"removeFillerWords": true,
"sourceSrt": "<string>",
"translatedSrt": "<string>",
"keepBackgroundMusic": true,
"keepOriginalVoice": true,
"originalVoiceVolume": 123,
"voiceIsolatorOption": "<string>",
"subtitles": true,
"subtitlesSource": "<string>",
"lipSyncMode": "<string>",
"activeSpeakerDetectionEnabled": true,
"lipsyncPro": true,
"voiceMode": "<string>",
"voiceId": "<string>",
"voiceCloningSettings": {
"stability": 123,
"similarity": 123
},
"translationTimeSkips": "<string>"
}
'import requests
url = "https://api.voicecheap.ai/v1/translate"
payload = {
"targetLanguage": "<string>",
"originalLanguage": "<string>",
"projectName": "<string>",
"webhookUrl": "<string>",
"numberOfSpeakers": "<string>",
"brandVocabulary": "<string>",
"removeFillerWords": True,
"sourceSrt": "<string>",
"translatedSrt": "<string>",
"keepBackgroundMusic": True,
"keepOriginalVoice": True,
"originalVoiceVolume": 123,
"voiceIsolatorOption": "<string>",
"subtitles": True,
"subtitlesSource": "<string>",
"lipSyncMode": "<string>",
"activeSpeakerDetectionEnabled": True,
"lipsyncPro": True,
"voiceMode": "<string>",
"voiceId": "<string>",
"voiceCloningSettings": {
"stability": 123,
"similarity": 123
},
"translationTimeSkips": "<string>"
}
headers = {
"x-api-key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
targetLanguage: '<string>',
originalLanguage: '<string>',
projectName: '<string>',
webhookUrl: '<string>',
numberOfSpeakers: '<string>',
brandVocabulary: '<string>',
removeFillerWords: true,
sourceSrt: '<string>',
translatedSrt: '<string>',
keepBackgroundMusic: true,
keepOriginalVoice: true,
originalVoiceVolume: 123,
voiceIsolatorOption: '<string>',
subtitles: true,
subtitlesSource: '<string>',
lipSyncMode: '<string>',
activeSpeakerDetectionEnabled: true,
lipsyncPro: true,
voiceMode: '<string>',
voiceId: '<string>',
voiceCloningSettings: {stability: 123, similarity: 123},
translationTimeSkips: '<string>'
})
};
fetch('https://api.voicecheap.ai/v1/translate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.voicecheap.ai/v1/translate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'targetLanguage' => '<string>',
'originalLanguage' => '<string>',
'projectName' => '<string>',
'webhookUrl' => '<string>',
'numberOfSpeakers' => '<string>',
'brandVocabulary' => '<string>',
'removeFillerWords' => true,
'sourceSrt' => '<string>',
'translatedSrt' => '<string>',
'keepBackgroundMusic' => true,
'keepOriginalVoice' => true,
'originalVoiceVolume' => 123,
'voiceIsolatorOption' => '<string>',
'subtitles' => true,
'subtitlesSource' => '<string>',
'lipSyncMode' => '<string>',
'activeSpeakerDetectionEnabled' => true,
'lipsyncPro' => true,
'voiceMode' => '<string>',
'voiceId' => '<string>',
'voiceCloningSettings' => [
'stability' => 123,
'similarity' => 123
],
'translationTimeSkips' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.voicecheap.ai/v1/translate"
payload := strings.NewReader("{\n \"targetLanguage\": \"<string>\",\n \"originalLanguage\": \"<string>\",\n \"projectName\": \"<string>\",\n \"webhookUrl\": \"<string>\",\n \"numberOfSpeakers\": \"<string>\",\n \"brandVocabulary\": \"<string>\",\n \"removeFillerWords\": true,\n \"sourceSrt\": \"<string>\",\n \"translatedSrt\": \"<string>\",\n \"keepBackgroundMusic\": true,\n \"keepOriginalVoice\": true,\n \"originalVoiceVolume\": 123,\n \"voiceIsolatorOption\": \"<string>\",\n \"subtitles\": true,\n \"subtitlesSource\": \"<string>\",\n \"lipSyncMode\": \"<string>\",\n \"activeSpeakerDetectionEnabled\": true,\n \"lipsyncPro\": true,\n \"voiceMode\": \"<string>\",\n \"voiceId\": \"<string>\",\n \"voiceCloningSettings\": {\n \"stability\": 123,\n \"similarity\": 123\n },\n \"translationTimeSkips\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<x-api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.voicecheap.ai/v1/translate")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"targetLanguage\": \"<string>\",\n \"originalLanguage\": \"<string>\",\n \"projectName\": \"<string>\",\n \"webhookUrl\": \"<string>\",\n \"numberOfSpeakers\": \"<string>\",\n \"brandVocabulary\": \"<string>\",\n \"removeFillerWords\": true,\n \"sourceSrt\": \"<string>\",\n \"translatedSrt\": \"<string>\",\n \"keepBackgroundMusic\": true,\n \"keepOriginalVoice\": true,\n \"originalVoiceVolume\": 123,\n \"voiceIsolatorOption\": \"<string>\",\n \"subtitles\": true,\n \"subtitlesSource\": \"<string>\",\n \"lipSyncMode\": \"<string>\",\n \"activeSpeakerDetectionEnabled\": true,\n \"lipsyncPro\": true,\n \"voiceMode\": \"<string>\",\n \"voiceId\": \"<string>\",\n \"voiceCloningSettings\": {\n \"stability\": 123,\n \"similarity\": 123\n },\n \"translationTimeSkips\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.voicecheap.ai/v1/translate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"targetLanguage\": \"<string>\",\n \"originalLanguage\": \"<string>\",\n \"projectName\": \"<string>\",\n \"webhookUrl\": \"<string>\",\n \"numberOfSpeakers\": \"<string>\",\n \"brandVocabulary\": \"<string>\",\n \"removeFillerWords\": true,\n \"sourceSrt\": \"<string>\",\n \"translatedSrt\": \"<string>\",\n \"keepBackgroundMusic\": true,\n \"keepOriginalVoice\": true,\n \"originalVoiceVolume\": 123,\n \"voiceIsolatorOption\": \"<string>\",\n \"subtitles\": true,\n \"subtitlesSource\": \"<string>\",\n \"lipSyncMode\": \"<string>\",\n \"activeSpeakerDetectionEnabled\": true,\n \"lipsyncPro\": true,\n \"voiceMode\": \"<string>\",\n \"voiceId\": \"<string>\",\n \"voiceCloningSettings\": {\n \"stability\": 123,\n \"similarity\": 123\n },\n \"translationTimeSkips\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"projectId": "<string>",
"estimatedDuration": 123
}Traduction et doublage
Démarrer la traduction
Téléchargez un fichier vidéo ou audio et démarrez un nouveau projet de traduction
Démarrer la traduction
curl --request POST \
--url https://api.voicecheap.ai/v1/translate \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"targetLanguage": "<string>",
"originalLanguage": "<string>",
"projectName": "<string>",
"webhookUrl": "<string>",
"numberOfSpeakers": "<string>",
"brandVocabulary": "<string>",
"removeFillerWords": true,
"sourceSrt": "<string>",
"translatedSrt": "<string>",
"keepBackgroundMusic": true,
"keepOriginalVoice": true,
"originalVoiceVolume": 123,
"voiceIsolatorOption": "<string>",
"subtitles": true,
"subtitlesSource": "<string>",
"lipSyncMode": "<string>",
"activeSpeakerDetectionEnabled": true,
"lipsyncPro": true,
"voiceMode": "<string>",
"voiceId": "<string>",
"voiceCloningSettings": {
"stability": 123,
"similarity": 123
},
"translationTimeSkips": "<string>"
}
'import requests
url = "https://api.voicecheap.ai/v1/translate"
payload = {
"targetLanguage": "<string>",
"originalLanguage": "<string>",
"projectName": "<string>",
"webhookUrl": "<string>",
"numberOfSpeakers": "<string>",
"brandVocabulary": "<string>",
"removeFillerWords": True,
"sourceSrt": "<string>",
"translatedSrt": "<string>",
"keepBackgroundMusic": True,
"keepOriginalVoice": True,
"originalVoiceVolume": 123,
"voiceIsolatorOption": "<string>",
"subtitles": True,
"subtitlesSource": "<string>",
"lipSyncMode": "<string>",
"activeSpeakerDetectionEnabled": True,
"lipsyncPro": True,
"voiceMode": "<string>",
"voiceId": "<string>",
"voiceCloningSettings": {
"stability": 123,
"similarity": 123
},
"translationTimeSkips": "<string>"
}
headers = {
"x-api-key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
targetLanguage: '<string>',
originalLanguage: '<string>',
projectName: '<string>',
webhookUrl: '<string>',
numberOfSpeakers: '<string>',
brandVocabulary: '<string>',
removeFillerWords: true,
sourceSrt: '<string>',
translatedSrt: '<string>',
keepBackgroundMusic: true,
keepOriginalVoice: true,
originalVoiceVolume: 123,
voiceIsolatorOption: '<string>',
subtitles: true,
subtitlesSource: '<string>',
lipSyncMode: '<string>',
activeSpeakerDetectionEnabled: true,
lipsyncPro: true,
voiceMode: '<string>',
voiceId: '<string>',
voiceCloningSettings: {stability: 123, similarity: 123},
translationTimeSkips: '<string>'
})
};
fetch('https://api.voicecheap.ai/v1/translate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.voicecheap.ai/v1/translate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'targetLanguage' => '<string>',
'originalLanguage' => '<string>',
'projectName' => '<string>',
'webhookUrl' => '<string>',
'numberOfSpeakers' => '<string>',
'brandVocabulary' => '<string>',
'removeFillerWords' => true,
'sourceSrt' => '<string>',
'translatedSrt' => '<string>',
'keepBackgroundMusic' => true,
'keepOriginalVoice' => true,
'originalVoiceVolume' => 123,
'voiceIsolatorOption' => '<string>',
'subtitles' => true,
'subtitlesSource' => '<string>',
'lipSyncMode' => '<string>',
'activeSpeakerDetectionEnabled' => true,
'lipsyncPro' => true,
'voiceMode' => '<string>',
'voiceId' => '<string>',
'voiceCloningSettings' => [
'stability' => 123,
'similarity' => 123
],
'translationTimeSkips' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.voicecheap.ai/v1/translate"
payload := strings.NewReader("{\n \"targetLanguage\": \"<string>\",\n \"originalLanguage\": \"<string>\",\n \"projectName\": \"<string>\",\n \"webhookUrl\": \"<string>\",\n \"numberOfSpeakers\": \"<string>\",\n \"brandVocabulary\": \"<string>\",\n \"removeFillerWords\": true,\n \"sourceSrt\": \"<string>\",\n \"translatedSrt\": \"<string>\",\n \"keepBackgroundMusic\": true,\n \"keepOriginalVoice\": true,\n \"originalVoiceVolume\": 123,\n \"voiceIsolatorOption\": \"<string>\",\n \"subtitles\": true,\n \"subtitlesSource\": \"<string>\",\n \"lipSyncMode\": \"<string>\",\n \"activeSpeakerDetectionEnabled\": true,\n \"lipsyncPro\": true,\n \"voiceMode\": \"<string>\",\n \"voiceId\": \"<string>\",\n \"voiceCloningSettings\": {\n \"stability\": 123,\n \"similarity\": 123\n },\n \"translationTimeSkips\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<x-api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.voicecheap.ai/v1/translate")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"targetLanguage\": \"<string>\",\n \"originalLanguage\": \"<string>\",\n \"projectName\": \"<string>\",\n \"webhookUrl\": \"<string>\",\n \"numberOfSpeakers\": \"<string>\",\n \"brandVocabulary\": \"<string>\",\n \"removeFillerWords\": true,\n \"sourceSrt\": \"<string>\",\n \"translatedSrt\": \"<string>\",\n \"keepBackgroundMusic\": true,\n \"keepOriginalVoice\": true,\n \"originalVoiceVolume\": 123,\n \"voiceIsolatorOption\": \"<string>\",\n \"subtitles\": true,\n \"subtitlesSource\": \"<string>\",\n \"lipSyncMode\": \"<string>\",\n \"activeSpeakerDetectionEnabled\": true,\n \"lipsyncPro\": true,\n \"voiceMode\": \"<string>\",\n \"voiceId\": \"<string>\",\n \"voiceCloningSettings\": {\n \"stability\": 123,\n \"similarity\": 123\n },\n \"translationTimeSkips\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.voicecheap.ai/v1/translate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"targetLanguage\": \"<string>\",\n \"originalLanguage\": \"<string>\",\n \"projectName\": \"<string>\",\n \"webhookUrl\": \"<string>\",\n \"numberOfSpeakers\": \"<string>\",\n \"brandVocabulary\": \"<string>\",\n \"removeFillerWords\": true,\n \"sourceSrt\": \"<string>\",\n \"translatedSrt\": \"<string>\",\n \"keepBackgroundMusic\": true,\n \"keepOriginalVoice\": true,\n \"originalVoiceVolume\": 123,\n \"voiceIsolatorOption\": \"<string>\",\n \"subtitles\": true,\n \"subtitlesSource\": \"<string>\",\n \"lipSyncMode\": \"<string>\",\n \"activeSpeakerDetectionEnabled\": true,\n \"lipsyncPro\": true,\n \"voiceMode\": \"<string>\",\n \"voiceId\": \"<string>\",\n \"voiceCloningSettings\": {\n \"stability\": 123,\n \"similarity\": 123\n },\n \"translationTimeSkips\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"projectId": "<string>",
"estimatedDuration": 123
}Démarrer la traduction
Créez un nouveau projet de traduction en téléchargeant un fichier vidéo ou audio. Le processus de traduction s’exécute de manière asynchrone en arrière-plan. Utilisez le point de terminaison de statut pour suivre la progression et récupérer les résultats. Utilisez Obtenir les détails du projet lorsque vous avez besoin de l’historique des versions traduites ou de l’historique de la synchronisation labiale.Limite de concurrence
La création de projets, la traduction et le doublage vérifient tous la limite de traductions actives de votre compte (10 au maximum, parfois moins). Seules les traductions ou les opérations de doublage en cours occupent des places ; les projets limités à la transcription n’en occupent pas. Lorsque cette limite est atteinte, l’API renvoieCONCURRENT_TRANSLATION_LIMIT_REACHED (HTTP 429). La limite appliquée figure dans details.limit.
Requête
Ce point de terminaison acceptemultipart/form-data avec un téléchargement de fichier.
En-têtes
string
requis
Votre clé API VoiceCheap. Obtenez-en une sur app.voicecheap.ai/page-api.
Paramètres du corps de la requête
file
requis
Le fichier vidéo ou audio à traduire.Formats vidéo pris en charge :
video/mp4, video/quicktime, video/x-matroska, video/webm, video/mpegFormats audio pris en charge : audio/mpeg, audio/wav, audio/mp4, audio/x-m4a, audio/flac, audio/ogg, audio/aac, audio/webmTaille maximale de fichier par forfait : Beginner 5 Go, Starter 10 Go, Creator 20 Go, Pro 30 Go, Scale 40 Go et Enterprise 60 Go.string
requis
La langue vers laquelle traduire le contenu. Doit être en minuscules.Valeurs autorisées (70+) :
afrikaans, albanian, amharic, arabic, armenian, assamese, azerbaijani, basque, belarusian, bengali, bosnian, bulgarian, catalan, croatian, czech, danish, dutch, english, british english, estonian, finnish, french, french canadian, galician, german, greek, gujarati, hebrew, hindi, hungarian, icelandic, indonesian, irish, italian, japanese, kannada, kazakh, khmer, korean, lao, latvian, lithuanian, macedonian, malay, malayalam, mandarin, marathi, mongolian, nepali, norwegian, persian, polish, portuguese, brazilian portuguese, pt_brazil, punjabi, romanian, russian, serbian, slovak, slovenian, spanish, swahili, swedish, tagalog, tamil, telugu, thai, turkish, ukrainian, urdu, vietnamese, welsh, yoruba, zulustring
La langue source du contenu en utilisant les codes de langue ISO (par ex. Par défaut :
en, es, fr, de, ja, zh).Fortement recommandé : Laissez ce champ vide pour la détection automatique.Ne fournissez ce paramètre que si vous êtes sûr à 100 % que le code de langue est correct et au format ISO valide. Des codes de langue incorrects entraîneront des échecs de transcription. Notre détection automatique prend en charge plus de 80 langues et est très précise.
auto-detectstring
Un nom personnalisé pour le projet. Utile pour identifier les projets dans votre tableau de bord.Par défaut : L’ID du projet sera utilisé s’il n’est pas fourni.
string
Un point de terminaison https qui reçoit les événements webhook pour ce projet,
remplaçant le point de terminaison configuré sur votre compte.Par défaut : Le point de terminaison webhook du compte, lorsqu’il est configuré.
string
auto-detect ou un entier de 1 à 32. Un nombre de locuteurs connu peut améliorer la diarisation.Par défaut : auto-detectstring
Un tableau de chaînes JSON contenant des noms, marques, acronymes ou termes spécialisés spécifiques à la requête. Ces termes sont fusionnés avec le vocabulaire enregistré du compte ou de l’équipe.
boolean
Supprimez les mots de remplissage courants de la transcription source avant la traduction.Par défaut :
truestring
Une transcription SRT existante dans la langue source.
originalLanguage doit être explicite lorsque ce champ est fourni.string
Le SRT final dans la langue cible, rédigé par vous. Lorsqu’il est fourni, VoiceCheap ignore son moteur de traduction et génère seulement les voix, puis mélange la sortie à partir de ce texte. Voir le mode doublage seul pour les règles d’alignement. Maximum 1 000 000 caractères.
boolean
Indique s’il faut conserver l’audio d’arrière-plan dans la sortie.Lorsqu’il est activé, conserve la musique d’arrière-plan, l’ambiance, les rires, les applaudissements et les sons de foule tout en supprimant uniquement la voix originale (séparation des pistes). Désactivez cette option si votre source ne contient pas d’audio d’arrière-plan.Par défaut :
trueboolean
Gardez la voix du locuteur original en sourdine sous la voix traduite.Par défaut :
falsenumber
Volume de la voix originale de
1 à 70 lorsque keepOriginalVoice est activé.Par défaut : 30string
Mode d’isolation vocale lorsque
Valeurs autorisées :
keepBackgroundMusic est activé. Contrôle la qualité et les caractéristiques de la séparation vocale.Studio (Recommandé)
Studio (Recommandé)
Notre traitement vocal par défaut, conçu pour une qualité audio professionnelle :
- Supprime les échos et les réverbérations
- Nettoie les imperfections techniques
- Produit une voix claire et nette
Réaliste
Réaliste
Préserve les caractéristiques naturelles de l’environnement d’enregistrement :
- Maintient un son plus proche de l’enregistrement original
- Préserve les caractéristiques environnementales
Cette option peut créer des artefacts ou des effets inattendus dans certains cas en raison de la préservation des éléments d’arrière-plan.
studio, realisticPar défaut : studioboolean
Indique s’il faut générer des sous-titres pour la vidéo traduite.Lorsque cette option est activée, elle ajoute des sous-titres noirs et blancs lisibles. Utilisez
subtitlesSource pour choisir le texte original (langue source) ou traduit (langue cible). Les sous-titres sont automatiquement synchronisés pour faciliter la lecture.Par défaut : falsestring
Choisissez la source du texte des sous-titres lorsque
subtitles est activé.Valeurs autorisées : translated, originalPar défaut : translatedRemarque : Si original est sélectionné mais que la transcription originale n’est pas disponible, les sous-titres basculent sur translated.string
Déclencher le traitement de la synchronisation labiale une fois la traduction terminée.
standard= Lip Syncpro= Lip Sync Prostudio= Lip Sync Studio
boolean
Activer la détection du locuteur actif pour l’exécution de la synchronisation labiale demandée.Par défaut :
falseboolean
Sélecteur de synchronisation labiale hérité conservé pour la compatibilité ascendante.Par défaut : non activé (omettez le champ pour ignorer la synchronisation labiale)Form-data : Envoyez les valeurs booléennes sous forme de chaînes
false= Synchronisation labiale standard (4 minutes de crédits par minute de vidéo)true= Lip Sync Pro (9 minutes de crédits par minute de vidéo)
Durée maximale : 180 minutes par vidéo.Latence : Le traitement de la synchronisation labiale ajoute généralement 2x à 4x la durée de la vidéo originale.
Les e-mails de fin et d’échec de la synchronisation labiale ne sont pas envoyés pour les demandes déclenchées par l’API. Utilisez le point de terminaison de statut pour
suivre la progression.
true ou false (par ex., -F "lipsyncPro=false").Ne combinez pas
lipsyncPro avec un lipSyncMode contradictoire.string
Stratégie vocale :
cloning ou custom.Par défaut : cloningstring
Requis lorsque
voiceMode est custom. Utilisez un identifiant de dubbing_voices_list : une voix du catalogue ou une voix personnalisée
enregistrée par le compte authentifié. La facturation en équipe ne donne pas accès aux voix enregistrées des autres membres.object
Affinez les paramètres de clonage vocal pour un contrôle avancé sur la voix générée. Transmettez sous forme de chaîne JSON lors de l’utilisation de form-data. Toutes les valeurs doivent être comprises entre 0 et 1 (avec un pas de 0,01). Une valeur
Valeurs par défaut (équilibrées) :
speakerBoost envoyée par d’anciennes intégrations est toujours acceptée, mais n’a plus aucun effet.Ces paramètres ne s’appliquent que lorsque
voiceMode est cloning.Afficher propriétés voiceCloningSettings
Afficher propriétés voiceCloningSettings
number
défaut:"0.60"
Stabilité de la voix (0,00 - 1,00)Détermine la stabilité de la voix et le caractère aléatoire entre chaque génération.
- Des valeurs plus faibles permettent une gamme émotionnelle plus large mais peuvent causer une élocution étrange ou précipitée
- Des valeurs plus élevées produisent un résultat plus cohérent mais peuvent sembler monotones
0.60 (studio) / 0.65 (realistic)number
défaut:"0.80"
Similitude de la voix (0,00 - 1,00)Contrôle à quel point l’IA adhère à la voix originale.
- Des valeurs plus élevées rendent la voix clonée plus similaire à l’originale
- Si l’audio original est bruyant et que la similitude est trop élevée, des artefacts ou du bruit de fond peuvent être transférés dans la voix générée
0.80 (studio) / 0.75 (realistic){
"stability": 0.6,
"similarity": 0.8
}
string
Un tableau JSON de plages temporelles sources qui doivent rester dans la langue originale.Les sauts temporels nécessitent une entrée vidéo et
[
{ "startTime": 10.2, "endTime": 12.8 }
]
keepBackgroundMusic=true. Ils ne peuvent pas être combinés avec keepOriginalVoice et ne peuvent pas chevaucher les segments de transcription.Mode doublage seul (apportez votre traduction)
EnvoyeztranslatedSrt lorsque vous avez déjà la traduction et que VoiceCheap ne doit générer que les voix et mixer la sortie.
Dans ce mode :
- Pas de traduction par IA ni de reformulation SmartSync. Chaque réplique est lue telle quelle. Les règles de glossaire enregistrées et les instructions de traduction personnalisées ne s’appliquent pas non plus, car elles ne s’exécutent que sur le moteur de traduction.
- Le minutage vient de la source. Chaque segment conserve le début, la fin et le locuteur de la transcription source ; les codes temporels de votre SRT servent uniquement à associer les répliques aux segments. La voix générée est accélérée ou ralentie pour tenir dans la fenêtre du segment, sans reformulation.
- Les mêmes crédits qu’une traduction. L’exécution est facturée exactement comme une traduction standard du même média.
- Les options de voix, d’arrière-plan, de sous-titres et de synchronisation labiale s’appliquent sans changement.
voiceMode,keepBackgroundMusic,subtitles,lipSyncModeet les autres options de doublage se comportent comme documenté ci-dessus.
message de la réponse confirme le mode, et la version traduite indique dubbingMode: "dub-only" dans
Obtenir les détails du projet.
Règles d’alignement
| Requête | Mode | Règle |
|---|---|---|
translatedSrt + sourceSrt | index | Les deux fichiers doivent contenir le même nombre de répliques ; la réplique n de la traduction est lue sur la réplique n de la source. Un écart de nombre est rejeté avant le téléversement avec TRANSLATED_SRT_CUE_COUNT_MISMATCH. |
translatedSrt seul | timestamps | Le média est d’abord transcrit, puis chaque réplique traduite est associée au segment qui commence à moins de 50 ms du début de la réplique, ou à celui qui a le plus grand chevauchement. Plusieurs répliques sur un même segment sont jointes. Une réplique sans segment ou un segment sans réplique fait échouer l’exécution. |
timestamps ne sont connus qu’après la transcription et sont signalés de façon asynchrone. Le point de terminaison de statut répond en HTTP 200 avec status: "failed" et un error contenant code et message ; le webhook project.translation.failed porte le même code et le même message. TRANSLATED_SRT_UNMATCHED_CUES indique dans le message les numéros de répliques sans correspondance, tandis que TRANSLATED_SRT_MISSING_SEGMENTS indique les index des segments sans réplique. Ces réponses ne contiennent pas de champ details structuré. Pour une correspondance déterministe, envoyez sourceSrt avec translatedSrt, ou créez d’abord le projet avec Créer un projet, exportez sa transcription, traduisez-la réplique par réplique et appelez Doubler le projet.
Vérifier le rythme
Les phrases longues doivent être accélérées pour tenir dans leur segment. Exportez la transcription traduite avec Exporter la transcription du projet : chaque segment traduit portefinalSpeedFactor, le
rapport entre la voix générée et la fenêtre du segment avant l’ajustement final du tempo. Raccourcissez les répliques qui dépassent environ
1.3, puis relancez le doublage avec le SRT révisé.
translatedSrt est aussi accepté par le point de terminaison JSON Doubler le projet, qui double un
projet déjà transcrit sans téléverser à nouveau le média.Réponse
boolean
requis
Toujours
true pour les demandes réussiesstring
requis
Un message lisible par l’homme décrivant le résultat
string
requis
L’identifiant unique du projet de traduction créé. Utilisez cet ID pour vérifier le statut.
number
requis
Estimation approximative du traitement en minutes. L’estimation actuelle est de cinq minutes de traitement par minute de média source lancée.
Exemples
Les règles de glossaire enregistrées et les instructions de traduction personnalisées du compte ou de l’équipe effective sont appliquées automatiquement.
curl -X POST https://api.voicecheap.ai/v1/translate \
-H "x-api-key: vc_your-api-key" \
-F "file=@video.mp4" \
-F "targetLanguage=spanish" \
-F "projectName=My Spanish Translation" \
-F "numberOfSpeakers=2" \
-F 'brandVocabulary=["VoiceCheap","SmartSync"]' \
-F "removeFillerWords=true" \
-F "keepBackgroundMusic=true" \
-F "keepOriginalVoice=false" \
-F "voiceIsolatorOption=studio" \
-F "subtitles=true" \
-F "subtitlesSource=translated" \
-F "lipSyncMode=standard" \
-F "activeSpeakerDetectionEnabled=true"
interface StartTranslationResponse {
success: boolean;
message: string;
projectId: string;
estimatedDuration: number;
}
interface VoiceCloningSettings {
stability: number; // 0.00 - 1.00
similarity: number; // 0.00 - 1.00
}
interface StartTranslationRequest {
targetLanguage: string;
originalLanguage?: string;
projectName?: string;
numberOfSpeakers?: 'auto-detect' | string;
brandVocabulary?: string[];
removeFillerWords?: boolean;
sourceSrt?: string;
translatedSrt?: string;
keepBackgroundMusic?: boolean;
keepOriginalVoice?: boolean;
originalVoiceVolume?: number;
voiceMode?: 'cloning' | 'custom';
voiceId?: string;
voiceIsolatorOption?: 'studio' | 'realistic';
subtitles?: boolean;
subtitlesSource?: 'translated' | 'original';
lipSyncMode?: 'standard' | 'pro' | 'studio';
activeSpeakerDetectionEnabled?: boolean;
voiceCloningSettings?: VoiceCloningSettings;
translationTimeSkips?: Array<{ startTime: number; endTime: number }>;
}
async function startTranslation(
file: File,
targetLanguage: string,
options?: {
originalLanguage?: string;
projectName?: string;
numberOfSpeakers?: 'auto-detect' | string;
brandVocabulary?: string[];
removeFillerWords?: boolean;
sourceSrt?: string;
translatedSrt?: string;
keepBackgroundMusic?: boolean;
keepOriginalVoice?: boolean;
originalVoiceVolume?: number;
voiceMode?: 'cloning' | 'custom';
voiceId?: string;
voiceIsolatorOption?: 'studio' | 'realistic';
subtitles?: boolean;
subtitlesSource?: 'translated' | 'original';
lipSyncMode?: 'standard' | 'pro' | 'studio';
activeSpeakerDetectionEnabled?: boolean;
voiceCloningSettings?: VoiceCloningSettings;
translationTimeSkips?: Array<{ startTime: number; endTime: number }>;
},
): Promise<StartTranslationResponse> {
const formData = new FormData();
formData.append('file', file);
formData.append('targetLanguage', targetLanguage);
if (options?.projectName) {
formData.append('projectName', options.projectName);
}
if (options?.originalLanguage) {
formData.append('originalLanguage', options.originalLanguage);
}
if (options?.numberOfSpeakers) {
formData.append('numberOfSpeakers', options.numberOfSpeakers);
}
if (options?.brandVocabulary) {
formData.append('brandVocabulary', JSON.stringify(options.brandVocabulary));
}
if (options?.removeFillerWords !== undefined) {
formData.append('removeFillerWords', String(options.removeFillerWords));
}
if (options?.sourceSrt) {
formData.append('sourceSrt', options.sourceSrt);
}
if (options?.translatedSrt) {
formData.append('translatedSrt', options.translatedSrt);
}
if (options?.keepBackgroundMusic !== undefined) {
formData.append('keepBackgroundMusic', String(options.keepBackgroundMusic));
}
if (options?.keepOriginalVoice !== undefined) {
formData.append('keepOriginalVoice', String(options.keepOriginalVoice));
}
if (options?.originalVoiceVolume !== undefined) {
formData.append('originalVoiceVolume', String(options.originalVoiceVolume));
}
if (options?.voiceMode) {
formData.append('voiceMode', options.voiceMode);
}
if (options?.voiceId) {
formData.append('voiceId', options.voiceId);
}
if (options?.voiceIsolatorOption) {
formData.append('voiceIsolatorOption', options.voiceIsolatorOption);
}
if (options?.subtitles !== undefined) {
formData.append('subtitles', String(options.subtitles));
}
if (options?.subtitlesSource) {
formData.append('subtitlesSource', options.subtitlesSource);
}
if (options?.lipSyncMode) {
formData.append('lipSyncMode', options.lipSyncMode);
}
if (options?.activeSpeakerDetectionEnabled !== undefined) {
formData.append('activeSpeakerDetectionEnabled', String(options.activeSpeakerDetectionEnabled));
}
if (options?.voiceCloningSettings) {
formData.append('voiceCloningSettings', JSON.stringify(options.voiceCloningSettings));
}
if (options?.translationTimeSkips) {
formData.append('translationTimeSkips', JSON.stringify(options.translationTimeSkips));
}
const response = await fetch('https://api.voicecheap.ai/v1/translate', {
method: 'POST',
headers: {
'x-api-key': 'vc_your-api-key',
},
body: formData,
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.message || 'Translation failed');
}
return response.json();
}
// Usage example
const file = document.querySelector<HTMLInputElement>('#fileInput')?.files?.[0];
if (file) {
const result = await startTranslation(file, 'spanish', {
projectName: 'My Spanish Translation',
keepBackgroundMusic: true,
voiceIsolatorOption: 'studio',
subtitles: true,
subtitlesSource: 'translated',
voiceCloningSettings: {
stability: 0.6,
similarity: 0.85,
},
});
console.log('Project ID:', result.projectId);
}
const formData = new FormData();
formData.append('file', videoFile);
formData.append('targetLanguage', 'spanish');
formData.append('projectName', 'My Spanish Translation');
formData.append('keepBackgroundMusic', 'true');
formData.append('voiceIsolatorOption', 'studio');
formData.append('subtitles', 'true');
formData.append('subtitlesSource', 'translated');
formData.append(
'voiceCloningSettings',
JSON.stringify({
stability: 0.6,
similarity: 0.85,
}),
);
const response = await fetch('https://api.voicecheap.ai/v1/translate', {
method: 'POST',
headers: {
'x-api-key': 'vc_your-api-key',
},
body: formData,
});
const data = await response.json();
console.log('Project ID:', data.projectId);
import requests
import json
files = {'file': open('video.mp4', 'rb')}
data = {
'targetLanguage': 'spanish',
'projectName': 'My Spanish Translation',
'keepBackgroundMusic': 'true',
'voiceIsolatorOption': 'studio',
'subtitles': 'true',
'subtitlesSource': 'translated',
'voiceCloningSettings': json.dumps({
'stability': 0.60,
'similarity': 0.85
})
}
headers = {'x-api-key': 'vc_your-api-key'}
response = requests.post(
'https://api.voicecheap.ai/v1/translate',
headers=headers,
files=files,
data=data
)
result = response.json()
print(f"Project ID: {result['projectId']}")
<?php
$curl = curl_init();
$voiceCloningSettings = json_encode([
'stability' => 0.60,
'similarity' => 0.85
]);
$postFields = [
'file' => new CURLFile('video.mp4'),
'targetLanguage' => 'spanish',
'projectName' => 'My Spanish Translation',
'keepBackgroundMusic' => 'true',
'voiceIsolatorOption' => 'studio',
'subtitles' => 'true',
'subtitlesSource' => 'translated',
'voiceCloningSettings' => $voiceCloningSettings
];
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.voicecheap.ai/v1/translate',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postFields,
CURLOPT_HTTPHEADER => [
'x-api-key: vc_your-api-key'
]
]);
$response = curl_exec($curl);
$result = json_decode($response, true);
echo "Project ID: " . $result['projectId'];
Exemple de réponse
{
"success": true,
"message": "Translation started successfully. Use the status endpoint to track progress.",
"projectId": "abc123-def456-ghi789",
"estimatedDuration": 15
}
Erreurs
| Statut | Code | Description |
|---|---|---|
| 400 | FILE_REQUIRED | Aucun fichier n’a été téléchargé avec la requête |
| 400 | INVALID_FILE_TYPE | Le type de fichier téléchargé n’est pas pris en charge |
| 400 | DURATION_DETECTION_FAILED | Impossible de détecter la durée du fichier téléchargé |
| 400 | INVALID_MULTIPART_REQUEST | Les données de formulaire multipart sont mal formées ou dépassent les limites de champ |
| 400 | INVALID_BOOLEAN_VALUE | Un paramètre booléen a une valeur invalide (utilisez “true” ou “false”) |
| 400 | INVALID_JSON_FORMAT | Le JSON voiceCloningSettings est mal formé |
| 400 | INVALID_BRAND_VOCABULARY | Une entrée de vocabulaire spécifique à la requête est invalide |
| 400 | INVALID_SOURCE_SRT | Le fichier SRT source fourni est mal formé |
| 400 | SOURCE_LANGUAGE_REQUIRED_FOR_SRT | sourceSrt nécessite un originalLanguage explicite |
| 400 | INVALID_TRANSLATED_SRT | Le SRT traduit fourni est mal formé |
| 400 | TRANSLATED_SRT_CUE_COUNT_MISMATCH | translatedSrt et sourceSrt ne contiennent pas le même nombre de répliques |
| 400 | VOICE_ID_REQUIRED | Le mode voix personnalisées a été sélectionné sans ID de voix |
| 400 | VOICE_ID_NOT_ALLOWED_WITH_CLONING | Un ID de voix a été combiné avec le clonage vocal |
| 400 | VOICE_CLONING_SETTINGS_NOT_ALLOWED | Les paramètres de clonage ont été combinés avec le mode voix personnalisées |
| 400 | CONFLICTING_LIPSYNC_OPTIONS | lipSyncMode est en conflit avec l’ancien lipsyncPro |
| 400 | TRANSLATION_TIME_SKIP_CONFLICT | Les sauts temporels sont en conflit avec une autre option audio |
| 400 | TRANSLATION_TIME_SKIP_REQUIRES_BACKGROUND | Les sauts temporels nécessitent un audio d’arrière-plan |
| 400 | TRANSLATION_TIME_SKIP_OUT_OF_RANGE | Un saut temporel dépasse la durée du média |
| 400 | INVALID_TRANSLATION_TIME_SKIPS | Un saut temporel chevauche un segment de transcription |
| 400 | SUBTITLES_NOT_AVAILABLE_FOR_AUDIO | Des sous-titres incrustés ont été demandés pour une entrée audio |
| 400 | LIPSYNC_NOT_AVAILABLE_FOR_AUDIO | Une synchronisation labiale a été demandée pour une entrée audio |
| 400 | TRANSLATION_TIME_SKIP_NOT_AVAILABLE_FOR_AUDIO | Des sauts temporels ont été demandés pour une entrée audio |
| 400 | LIPSYNC_VIDEO_TOO_LONG | Une synchronisation labiale a été demandée pour un média plus long que la durée prise en charge |
| 413 | FILE_TOO_LARGE | Le fichier téléchargé dépasse la limite du forfait de l’utilisateur |
| 401 | MISSING_API_KEY | La clé API est requise |
| 401 | INVALID_API_KEY_FORMAT | La clé API doit commencer par vc_ |
| 401 | INVALID_API_KEY | La clé API fournie est invalide |
| 403 | SUBSCRIPTION_REQUIRED | L’accès à l’API nécessite un forfait Starter ou supérieur |
| 403 | INSUFFICIENT_CREDITS | Crédits insuffisants pour traiter ce fichier |
| 403 | CUSTOM_VOICE_ACCESS_DENIED | La voix sélectionnée ne figure pas dans le catalogue et n’est pas une voix personnalisée enregistrée par le compte authentifié. |
| 403 | LIPSYNC_MODE_ACCESS_DENIED | Le mode de synchronisation labiale premium n’est pas disponible sur le forfait actuel |
| 429 | RATE_LIMIT_EXCEEDED | Trop de requêtes (limite : 10 requêtes par minute) |
| 429 | CONCURRENT_TRANSLATION_LIMIT_REACHED | Limite de traductions simultanées du compte atteinte ; voir details.limit |
Cette page vous a-t-elle été utile ?

