Iniciar traducción
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
}Traducción y doblaje
Iniciar traducción
Suba un archivo de video o audio e inicie un nuevo proyecto de traducción
Iniciar traducción
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
}Iniciar traducción
Cree un nuevo proyecto de traducción subiendo un archivo de video o audio. El proceso de traducción se ejecuta de forma asíncrona en segundo plano. Utilice el endpoint de estado para realizar un seguimiento del progreso y recuperar los resultados. Utilice Obtener detalles del proyecto cuando necesite el historial de versiones traducidas o el historial de sincronización labial.Límite de concurrencia
La creación de proyectos, la traducción y el doblaje comprueban el límite de traducciones activas de su cuenta (10 como máximo, posiblemente menos). Solo las traducciones o los doblajes en curso ocupan plazas; los proyectos de solo transcripción no. Al alcanzar el límite, la API devuelveCONCURRENT_TRANSLATION_LIMIT_REACHED (HTTP 429). El límite aplicado aparece en details.limit.
Solicitud
Este endpoint aceptamultipart/form-data con una subida de archivo.
Encabezados
string
requerido
Tu clave de API VoiceCheap. Obtén una en app.voicecheap.ai/page-api.
Parámetros del cuerpo
file
requerido
El archivo de video o audio a traducir.Formatos de video admitidos:
video/mp4, video/quicktime, video/x-matroska, video/webm, video/mpegFormatos de audio admitidos: audio/mpeg, audio/wav, audio/mp4, audio/x-m4a, audio/flac, audio/ogg, audio/aac, audio/webmTamaño máximo de archivo por plan: Beginner 5 GB, Starter 10 GB, Creator 20 GB, Pro 30 GB, Scale 40 GB y Enterprise 60 GB.string
requerido
El idioma al que traducir el contenido. Debe estar en minúsculas.Valores permitidos (más de 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
El idioma de origen del contenido utilizando códigos de idioma ISO (p. ej., Predeterminado:
en, es, fr, de, ja, zh).Altamente recomendado: Déjalo vacío para la detección automática.Solo proporciona este parámetro si estás 100% seguro de que el código de idioma es correcto y tiene un formato ISO válido. Los códigos de idioma incorrectos provocarán fallos en la transcripción. Nuestra detección automática admite más de 80 idiomas y es altamente precisa.
auto-detectstring
Un nombre personalizado para el proyecto. Útil para identificar proyectos en tu panel de control.Predeterminado: Se utilizará el ID del proyecto si no se proporciona.
string
Un endpoint https que recibe los eventos de webhook para este proyecto,
anulando el endpoint configurado en tu cuenta.Predeterminado: El endpoint de webhook de la cuenta, cuando hay uno configurado.
string
auto-detect o un número entero de 1 a 32. Un número conocido de hablantes puede mejorar la diarización.Predeterminado: auto-detectstring
Una matriz de cadenas JSON de nombres, marcas, acrónimos o términos especializados específicos de la solicitud. Estos términos se combinan con el glosario guardado de la cuenta o del equipo.
boolean
Elimina las muletillas comunes de la transcripción original antes de la traducción.Predeterminado:
truestring
Una transcripción SRT existente en el idioma de origen.
originalLanguage debe ser explícito cuando se proporciona este campo.string
El SRT final en el idioma de destino, escrito por usted. Si se envía, VoiceCheap omite su motor de traducción y solo genera las voces y mezcla la salida a partir de este texto. Consulte el modo solo doblaje para las reglas de alineación. Máximo 1.000.000 de caracteres.
boolean
Si se debe conservar el audio de fondo en la salida.Cuando está habilitado, mantiene la música de fondo, el ambiente, las risas, los aplausos y los sonidos de la multitud mientras elimina solo la voz original (separación de pistas). Desactívalo si tu fuente no tiene audio de fondo.Predeterminado:
trueboolean
Mantén al hablante original en un volumen bajo debajo de la voz traducida.Predeterminado:
falsenumber
Volumen de la voz original de
1 a 70 cuando keepOriginalVoice está habilitado.Predeterminado: 30string
Modo de aislamiento de voz cuando
Valores permitidos:
keepBackgroundMusic está habilitado. Controla la calidad y las características de la separación de voz.Estudio (Recomendado)
Estudio (Recomendado)
Nuestro procesamiento de voz predeterminado, diseñado para una calidad de audio profesional:
- Elimina ecos y reverberaciones
- Limpia imperfecciones técnicas
- Produce una voz clara y nítida
Realista
Realista
Conserva las características naturales del entorno de grabación:
- Mantiene un sonido más cercano a la grabación original
- Preserva las características ambientales
Esta opción puede crear artefactos o efectos inesperados en algunos casos debido a la preservación de elementos de fondo.
studio, realisticPredeterminado: studioboolean
Si se deben generar subtítulos para el video traducido.Cuando se activa, añade subtítulos claros en blanco y negro. Use
subtitlesSource para elegir el texto original (idioma de origen) o el traducido (idioma de destino). Los subtítulos se sincronizan automáticamente para facilitar la lectura.Predeterminado: falsestring
Elija la fuente del texto de los subtítulos cuando
subtitles esté habilitado.Valores permitidos: translated, originalPredeterminado: translatedNota: Si se selecciona original pero la transcripción original no está disponible, los subtítulos recurrirán a translated.string
Activa el procesamiento de sincronización labial una vez completada la traducción.
standard= Lip Syncpro= Lip Sync Prostudio= Lip Sync Studio
boolean
Habilite la detección de hablante activo para la ejecución de sincronización labial solicitada.Predeterminado:
falseboolean
Selector de sincronización labial heredado conservado para compatibilidad con versiones anteriores.Predeterminado: no habilitado (omita el campo para omitir la sincronización labial)Form-data: Envíe valores booleanos como cadenas
false= Sincronización labial estándar (4 minutos de créditos por 1 minuto de video)true= Lip Sync Pro (9 minutos de créditos por 1 minuto de video)
Duración máxima: 180 minutos por video.Latencia: El procesamiento de sincronización labial suele añadir 2x-4x la duración del video original.
Los correos electrónicos de finalización y error de sincronización labial no se envían para las solicitudes activadas por API. Utilice el endpoint de estado para
realizar un seguimiento del progreso.
true o false (p. ej., -F "lipsyncPro=false").No combine
lipsyncPro con un lipSyncMode conflictivo.string
Estrategia de voz:
cloning o custom.Predeterminado: cloningstring
Obligatorio cuando
voiceMode es custom. Usa un ID de dubbing_voices_list: una voz del catálogo o una voz personalizada guardada por la cuenta
autenticada. La facturación del equipo no da acceso a las voces guardadas de otro miembro.object
Ajuste los parámetros de clonación de voz para un control avanzado sobre la voz generada. Pase como una cadena JSON al usar form-data. Todos los valores deben estar entre 0 y 1 (con un incremento de 0.01). Un valor
Valores predeterminados (equilibrados):
speakerBoost enviado por integraciones anteriores se sigue aceptando, pero ya no tiene ningún efecto.Estos ajustes solo se aplican cuando
voiceMode es cloning.Mostrar propiedades de voiceCloningSettings
Mostrar propiedades de voiceCloningSettings
number
predeterminado:"0.60"
Estabilidad de voz (0.00 - 1.00)Determina qué tan estable es la voz y la aleatoriedad entre cada generación.
- Los valores más bajos permiten un rango emocional más amplio, pero pueden causar un habla extraña o apresurada
- Los valores más altos producen una salida más consistente, pero pueden sonar monótonos
0.60 (studio) / 0.65 (realistic)number
predeterminado:"0.80"
Similitud de voz (0.00 - 1.00)Controla qué tan fielmente se adhiere la IA a la voz original.
- Los valores más altos hacen que la voz clonada sea más similar a la original
- Si el audio original tiene ruido y la similitud es demasiado alta, los artefactos o el ruido de fondo pueden trasladarse a la voz generada
0.80 (studio) / 0.75 (realistic){
"stability": 0.6,
"similarity": 0.8
}
string
Una matriz JSON de rangos de tiempo de origen que deben permanecer en el idioma original.Los saltos de tiempo requieren entrada de video y
[
{ "startTime": 10.2, "endTime": 12.8 }
]
keepBackgroundMusic=true. No se pueden combinar con keepOriginalVoice y no pueden superponerse a los segmentos de transcripción.Modo solo doblaje (traiga su propia traducción)
EnvíetranslatedSrt cuando ya tenga la traducción y solo necesite VoiceCheap para generar las voces y mezclar la salida.
En este modo:
- Sin traducción por IA ni reformulación SmartSync. Cada cue se locuta tal cual. Las reglas del glosario guardadas y las instrucciones de traducción personalizadas tampoco se aplican, porque solo se ejecutan en el motor de traducción.
- El tiempo viene de la fuente. Cada segmento conserva el inicio, el fin y el locutor de la transcripción de origen; los códigos de tiempo de su SRT solo sirven para emparejar cues con segmentos. El habla generada se estira o se comprime para caber en la ventana del segmento, sin reformularla.
- Los mismos créditos que una traducción. La ejecución se factura exactamente como una traducción estándar del mismo medio.
- Las opciones de voz, fondo, subtítulos y sincronización labial se aplican igual.
voiceMode,keepBackgroundMusic,subtitles,lipSyncModey las demás opciones de doblaje se comportan como se documenta arriba.
message de la respuesta confirma el modo, y la versión traducida informa dubbingMode: "dub-only" en
Obtener detalles del proyecto.
Reglas de alineación
| Solicitud | Modo | Regla |
|---|---|---|
translatedSrt + sourceSrt | index | Ambos archivos deben contener el mismo número de cues; el cue n de la traducción se locuta sobre el cue n de la fuente. Una diferencia de recuento se rechaza antes de la carga con TRANSLATED_SRT_CUE_COUNT_MISMATCH. |
solo translatedSrt | timestamps | El medio se transcribe primero y después cada cue traducido se empareja con el segmento de la transcripción que empieza dentro de 50 ms del inicio del cue, o con el de mayor solapamiento. Varios cues en un mismo segmento se unen. Un cue sin segmento o un segmento sin cue hace fallar la ejecución. |
timestamps se detectan solo después de la transcripción y se notifican de forma asíncrona. El endpoint de estado devuelve HTTP 200 con status: "failed" y un error con code y message; el webhook project.translation.failed lleva el mismo código y mensaje. TRANSLATED_SRT_UNMATCHED_CUES indica los números de cue sin correspondencia en el mensaje, mientras que TRANSLATED_SRT_MISSING_SEGMENTS indica los índices de segmento sin cue. Estas respuestas no incluyen un campo details estructurado. Para una correspondencia determinista, envíe sourceSrt con translatedSrt o cree primero el proyecto con Crear proyecto, exporte la transcripción, tradúzcala cue por cue y llame a Doblar proyecto.
Comprobar el ritmo
Las frases largas deben acelerarse para caber en su segmento. Exporte la transcripción traducida con Exportar transcripción del proyecto: cada segmento traducido incluyefinalSpeedFactor, la
relación entre el habla generada y la ventana del segmento antes del ajuste final de tempo. Acorte los cues que queden por encima de aproximadamente
1.3 y vuelva a ejecutar el doblaje con el SRT revisado.
translatedSrt también se acepta en el endpoint JSON Doblar el proyecto, que dobla un
proyecto ya transcrito sin volver a subir el medio.Respuesta
boolean
requerido
Siempre
true para solicitudes exitosasstring
requerido
Un mensaje legible por humanos que describe el resultado
string
requerido
El identificador único para el proyecto de doblaje creado. Utilice este ID para comprobar el estado.
number
requerido
Estimación aproximada del procesamiento en minutos. La estimación actual es de cinco minutos de procesamiento por cada minuto iniciado de medio de origen.
Ejemplos
Las reglas de glosario guardadas y las instrucciones de doblaje personalizadas de la cuenta o equipo efectivo se aplican automáticamente.
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'];
Ejemplo de respuesta
{
"success": true,
"message": "Translation started successfully. Use the status endpoint to track progress.",
"projectId": "abc123-def456-ghi789",
"estimatedDuration": 15
}
Errores
| Estado | Código | Descripción |
|---|---|---|
| 400 | FILE_REQUIRED | No se cargó ningún archivo con la solicitud |
| 400 | INVALID_FILE_TYPE | El tipo de archivo cargado no es compatible |
| 400 | DURATION_DETECTION_FAILED | No se pudo detectar la duración del archivo cargado |
| 400 | INVALID_MULTIPART_REQUEST | Los datos del formulario multipart están mal formados o exceden los límites de campo |
| 400 | INVALID_BOOLEAN_VALUE | Un parámetro booleano tiene un valor no válido (use “true” o “false”) |
| 400 | INVALID_JSON_FORMAT | El JSON de voiceCloningSettings está mal formado |
| 400 | INVALID_BRAND_VOCABULARY | Una entrada de vocabulario específica de la solicitud no es válida |
| 400 | INVALID_SOURCE_SRT | El SRT de origen proporcionado está mal formado |
| 400 | SOURCE_LANGUAGE_REQUIRED_FOR_SRT | sourceSrt requiere un originalLanguage explícito |
| 400 | INVALID_TRANSLATED_SRT | El SRT traducido enviado está mal formado |
| 400 | TRANSLATED_SRT_CUE_COUNT_MISMATCH | translatedSrt y sourceSrt no contienen el mismo número de cues |
| 400 | VOICE_ID_REQUIRED | Se seleccionó el modo de voces personalizadas sin un ID de voz |
| 400 | VOICE_ID_NOT_ALLOWED_WITH_CLONING | Se combinó un ID de voz con clonación de voz |
| 400 | VOICE_CLONING_SETTINGS_NOT_ALLOWED | Se combinaron los ajustes de clonación con el modo de voces personalizadas |
| 400 | CONFLICTING_LIPSYNC_OPTIONS | lipSyncMode entra en conflicto con el lipsyncPro heredado |
| 400 | TRANSLATION_TIME_SKIP_CONFLICT | Los saltos de tiempo entran en conflicto con otra opción de audio |
| 400 | TRANSLATION_TIME_SKIP_REQUIRES_BACKGROUND | Los saltos de tiempo requieren audio de fondo |
| 400 | TRANSLATION_TIME_SKIP_OUT_OF_RANGE | Un salto de tiempo se extiende más allá de la duración del medio |
| 400 | INVALID_TRANSLATION_TIME_SKIPS | Un salto de tiempo se superpone a un segmento de transcripción |
| 400 | SUBTITLES_NOT_AVAILABLE_FOR_AUDIO | Se solicitaron subtítulos incrustados para la entrada de audio |
| 400 | LIPSYNC_NOT_AVAILABLE_FOR_AUDIO | Se solicitó sincronización labial para la entrada de audio |
| 400 | TRANSLATION_TIME_SKIP_NOT_AVAILABLE_FOR_AUDIO | Se solicitaron saltos de tiempo para la entrada de audio |
| 400 | LIPSYNC_VIDEO_TOO_LONG | Se solicitó sincronización labial para medios de mayor duración que la admitida |
| 413 | FILE_TOO_LARGE | El archivo cargado excede el límite del plan del usuario |
| 401 | MISSING_API_KEY | Se requiere una clave API |
| 401 | INVALID_API_KEY_FORMAT | La clave API debe comenzar con vc_ |
| 401 | INVALID_API_KEY | La clave API proporcionada no es válida |
| 403 | SUBSCRIPTION_REQUIRED | El acceso a la API requiere un plan Starter o superior |
| 403 | INSUFFICIENT_CREDITS | No hay suficientes créditos para procesar este archivo |
| 403 | CUSTOM_VOICE_ACCESS_DENIED | La voz seleccionada no es una voz del catálogo ni una voz personalizada guardada por la cuenta autenticada. |
| 403 | LIPSYNC_MODE_ACCESS_DENIED | El modo de sincronización labial premium no está disponible en el plan actual |
| 429 | RATE_LIMIT_EXCEEDED | Demasiadas solicitudes (límite: 10 solicitudes por minuto) |
| 429 | CONCURRENT_TRANSLATION_LIMIT_REACHED | Se alcanzó el límite de simultaneidad de la cuenta; consulte details.limit |
¿Esta página le ayudó?

