Rozpocznij tłumaczenie
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
}Tłumaczenie i dubbing
Rozpocznij tłumaczenie
Prześlij plik wideo lub audio i rozpocznij nowy projekt tłumaczenia
Rozpocznij tłumaczenie
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
}Rozpocznij tłumaczenie
Utwórz nowy projekt tłumaczenia, przesyłając plik wideo lub audio. Proces tłumaczenia przebiega asynchronicznie w tle. Użyj punkt końcowy statusu, aby śledzić postępy i pobierać wyniki. Użyj Pobierz szczegóły projektu, gdy potrzebujesz historii przetłumaczonych wersji lub historii synchronizacji ruchu ust.Limit współbieżności
Tworzenie projektów, tłumaczenie i dubbing sprawdzają limit aktywnych tłumaczeń na koncie (najwyżej 10, ewentualnie mniej). Miejsca zajmują tylko trwające tłumaczenia lub dubbingi; projekty obejmujące wyłącznie transkrypcję ich nie zajmują. Po osiągnięciu limitu API zwracaCONCURRENT_TRANSLATION_LIMIT_REACHED (HTTP 429). Obowiązujący limit znajduje się w details.limit.
Żądanie
Ten punkt końcowy akceptujemultipart/form-data z przesłaniem pliku.
Nagłówki
string
wymagane
Twój klucz API VoiceCheap. Pobierz go z app.voicecheap.ai/page-api.
Parametry treści
file
wymagane
Plik wideo lub audio do przetłumaczenia.Obsługiwane formaty wideo:
video/mp4, video/quicktime, video/x-matroska, video/webm, video/mpegObsługiwane formaty audio: audio/mpeg, audio/wav, audio/mp4, audio/x-m4a, audio/flac, audio/ogg, audio/aac, audio/webmMaksymalny rozmiar pliku według planu: Beginner 5 GB, Starter 10 GB, Creator 20 GB, Pro 30 GB, Scale 40 GB oraz Enterprise 60 GB.string
wymagane
Język, na który ma zostać przetłumaczona treść. Musi być zapisany małymi literami.Dozwolone wartości (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
Język źródłowy treści przy użyciu kodów językowych ISO (np. Domyślnie:
en, es, fr, de, ja, zh).Zdecydowanie zalecane: Pozostaw to pole puste w celu automatycznego wykrywania.Podaj ten parametr tylko wtedy, gdy masz 100% pewności, że kod języka jest poprawny i zgodny z formatem ISO. Nieprawidłowe kody języków spowodują błędy transkrypcji. Nasze automatyczne wykrywanie obsługuje ponad 80 języków i jest wysoce dokładne.
auto-detectstring
Niestandardowa nazwa projektu. Przydatna do identyfikacji projektów w Twoim panelu.Domyślnie: Jeśli nie zostanie podana, użyty zostanie identyfikator projektu.
string
Punkt końcowy https, który odbiera zdarzenia webhook dla tego projektu,
zastępując punkt końcowy skonfigurowany na Twoim koncie.Domyślnie: Punkt końcowy webhook konta, jeśli został skonfigurowany.
string
auto-detect lub liczba całkowita od 1 do 32. Znana liczba mówców może poprawić diaryzację.Domyślnie: auto-detectstring
Tablica ciągów JSON zawierająca specyficzne dla żądania nazwy, marki, akronimy lub terminy specjalistyczne. Terminy te są łączone z zapisanym glosariuszem konta lub zespołu.
boolean
Usuń typowe słowa wypełniacze z transkrypcji źródłowej przed tłumaczeniem.Domyślnie:
truestring
Istniejąca transkrypcja SRT w języku źródłowym.
originalLanguage musi być jawnie określone, gdy podano to pole.string
Końcowy SRT w języku docelowym, napisany przez Ciebie. Gdy jest podany, VoiceCheap pomija silnik tłumaczenia i tylko generuje głosy oraz miksuje wynik z tego tekstu. Zasady dopasowania opisuje tryb samego dubbingu. Maksymalnie 1 000 000 znaków.
boolean
Czy zachować dźwięk w tle w danych wyjściowych.Po włączeniu zachowuje muzykę w tle, otoczenie, śmiech, oklaski i dźwięki tłumu, usuwając jednocześnie tylko oryginalny głos (separacja ścieżek). Wyłącz, jeśli źródło nie zawiera dźwięku w tle.Domyślnie:
trueboolean
Zachowaj oryginalnego mówcę cicho pod przetłumaczonym głosem.Domyślnie:
falsenumber
Głośność oryginalnego głosu od
1 do 70, gdy włączona jest opcja keepOriginalVoice.Domyślnie: 30string
Tryb izolacji głosu, gdy włączona jest opcja
Dozwolone wartości:
keepBackgroundMusic. Kontroluje jakość i charakterystykę separacji głosu.Studio (Zalecane)
Studio (Zalecane)
Nasze domyślne przetwarzanie głosu, zaprojektowane z myślą o profesjonalnej jakości dźwięku:
- Usuwa echa i pogłosy
- Czyści niedoskonałości techniczne
- Generuje czysty i wyraźny głos
Realistyczny
Realistyczny
Zachowuje naturalne cechy środowiska nagrania:
- Utrzymuje dźwięk zbliżony do oryginalnego nagrania
- Zachowuje charakterystykę środowiskową
Ta opcja może w niektórych przypadkach powodować artefakty lub nieoczekiwane efekty ze względu na zachowanie elementów tła.
studio, realisticDomyślnie: studioboolean
Czy generować napisy dla przetłumaczonego wideo.Po włączeniu dodaje czytelne czarno-białe napisy. Użyj
subtitlesSource, aby wybrać tekst oryginalny (język źródłowy) lub przetłumaczony (język docelowy). Napisy są automatycznie synchronizowane dla lepszej czytelności.Domyślnie: falsestring
Wybierz źródło tekstu napisów, gdy włączona jest opcja
subtitles.Dozwolone wartości: translated, originalDomyślnie: translatedUwaga: Jeśli wybrano original, ale oryginalna transkrypcja jest niedostępna, napisy zostaną zastąpione przez translated.string
Uruchom przetwarzanie synchronizacji ruchu ust po zakończeniu tłumaczenia.
standard= Lip Syncpro= Lip Sync Prostudio= Lip Sync Studio
boolean
Włącz wykrywanie aktywnego mówcy dla żądanego procesu synchronizacji ruchu ust.Domyślnie:
falseboolean
Starszy selektor synchronizacji ruchu ust zachowany dla kompatybilności wstecznej.Domyślnie: niewłączone (pomiń pole, aby pominąć synchronizację ruchu ust)Form-data: Wysyłaj wartości logiczne jako ciągi znaków
false= Standardowa synchronizacja ruchu ust (4 minuty kredytów na 1 minutę wideo)true= Lip Sync Pro (9 minut kredytów na 1 minutę wideo)
Maksymalny czas trwania: 180 minut na wideo.Opóźnienie: Przetwarzanie synchronizacji ruchu ust zazwyczaj dodaje 2x-4x czasu trwania oryginalnego wideo.
E-maile o zakończeniu lub błędzie synchronizacji ruchu ust nie są wysyłane dla żądań wyzwalanych przez API. Użyj punkt końcowy statusu, aby
śledzić postępy.
true lub false (np. -F "lipsyncPro=false").Nie łącz
lipsyncPro z wykluczającym się lipSyncMode.string
Strategia głosowa:
cloning lub custom.Domyślnie: cloningstring
Wymagane, gdy
voiceMode ma wartość custom. Użyj identyfikatora z dubbing_voices_list: głosu z katalogu lub głosu niestandardowego zapisanego
przez uwierzytelnione konto. Rozliczanie zespołowe nie daje dostępu do głosów zapisanych przez innych członków.object
Dostosuj parametry klonowania głosu, aby uzyskać zaawansowaną kontrolę nad generowanym głosem. Przekaż jako ciąg JSON podczas używania form-data. Wszystkie wartości muszą mieścić się w zakresie od 0 do 1 (z krokiem 0,01). Wartość
Wartości domyślne (zrównoważone):
speakerBoost wysyłana przez starsze integracje jest nadal akceptowana, ale nie ma już żadnego efektu.Te ustawienia mają zastosowanie tylko wtedy, gdy
voiceMode to cloning.Pokaż właściwości voiceCloningSettings
Pokaż właściwości voiceCloningSettings
number
domyślnie:"0.60"
Stabilność głosu (0,00 - 1,00)Określa, jak stabilny jest głos i jaka jest losowość między poszczególnymi generacjami.
- Niższe wartości pozwalają na szerszy zakres emocjonalny, ale mogą powodować dziwną lub przyspieszoną mowę
- Wyższe wartości dają bardziej spójny wynik, ale mogą brzmieć monotonnie
0.60 (studio) / 0.65 (realistic)number
domyślnie:"0.80"
Podobieństwo głosu (0,00 - 1,00)Kontroluje, jak ściśle AI trzyma się oryginalnego głosu.
- Wyższe wartości sprawiają, że sklonowany głos jest bardziej podobny do oryginału
- Jeśli oryginalny dźwięk jest zaszumiony, a podobieństwo jest zbyt wysokie, artefakty lub szum w tle mogą przenieść się do wygenerowanego głosu
0.80 (studio) / 0.75 (realistic){
"stability": 0.6,
"similarity": 0.8
}
string
Tablica JSON zawierająca zakresy czasowe źródła, które powinny pozostać w oryginalnym języku.Pominięcia czasowe wymagają wejścia wideo i
[
{ "startTime": 10.2, "endTime": 12.8 }
]
keepBackgroundMusic=true. Nie można ich łączyć z keepOriginalVoice i nie mogą nakładać się na segmenty transkrypcji.Tryb samego dubbingu (własne tłumaczenie)
WyślijtranslatedSrt, gdy tłumaczenie jest już gotowe, a VoiceCheap ma tylko wygenerować głosy i zmiksować wynik.
W tym trybie:
- Bez tłumaczenia AI i bez przeredagowania SmartSync. Każdy cue jest czytany dosłownie. Zapisane reguły glosariusza i własne instrukcje tłumaczenia też nie obowiązują, bo działają tylko w silniku tłumaczenia.
- Czas pochodzi ze źródła. Każdy segment zachowuje początek, koniec i mówcę transkrypcji źródłowej; kody czasu Twojego SRT służą tylko do przypisania cue do segmentów. Wygenerowana mowa jest rozciągana lub skracana, aby zmieścić się w oknie segmentu, bez zmiany sformułowania.
- Te same kredyty co tłumaczenie. Uruchomienie jest rozliczane dokładnie jak standardowe tłumaczenie tego samego materiału.
- Opcje głosu, tła, napisów i synchronizacji ust działają bez zmian.
voiceMode,keepBackgroundMusic,subtitles,lipSyncModei pozostałe opcje dubbingu zachowują się tak, jak opisano wyżej.
message odpowiedzi potwierdza tryb, a przetłumaczona wersja zgłasza dubbingMode: "dub-only" w
Pobierz szczegóły projektu.
Zasady dopasowania
| Żądanie | Tryb | Reguła |
|---|---|---|
translatedSrt + sourceSrt | index | Oba pliki muszą mieć tę samą liczbę cue; cue n tłumaczenia jest czytany na cue n źródła. Różna liczba jest odrzucana przed wysłaniem kodem TRANSLATED_SRT_CUE_COUNT_MISMATCH. |
tylko translatedSrt | timestamps | Materiał jest najpierw transkrybowany, a potem każdy przetłumaczony cue jest przypisywany do segmentu transkrypcji zaczynającego się w ciągu 50 ms od początku cue albo do segmentu o największym nakładaniu. Kilka cue na jednym segmencie jest łączonych. Cue bez segmentu albo segment bez cue kończy uruchomienie błędem. |
timestamps są znane dopiero po transkrypcji i zgłaszane asynchronicznie. Endpoint statusu zwraca HTTP 200 ze status: "failed" i polem error zawierającym code oraz message; webhook project.translation.failed przekazuje ten sam kod i komunikat. Przy TRANSLATED_SRT_UNMATCHED_CUES numery niedopasowanych cue znajdują się w komunikacie, a przy TRANSLATED_SRT_MISSING_SEGMENTS — indeksy segmentów bez cue. Te odpowiedzi nie zawierają ustrukturyzowanego pola details. Aby uzyskać jednoznaczne dopasowanie, wyślij sourceSrt z translatedSrt albo najpierw utwórz projekt przez Utwórz projekt, wyeksportuj transkrypcję, przetłumacz ją cue po cue i wywołaj Dubbing projektu.
Sprawdzanie tempa
Długie zdania trzeba przyspieszyć, aby zmieściły się w segmencie. Wyeksportuj przetłumaczoną transkrypcję przez Eksportuj transkrypcję projektu: każdy przetłumaczony segment mafinalSpeedFactor, czyli
stosunek wygenerowanej mowy do okna segmentu przed końcowym dopasowaniem tempa. Skróć cue powyżej około
1.3, a potem uruchom dubbing ponownie z poprawionym SRT.
translatedSrt jest też przyjmowany przez endpoint JSON Dubbing projektu, który dubbinguje
już przetranskrybowany projekt bez ponownego przesyłania materiału.Odpowiedź
boolean
wymagane
Zawsze
true dla udanych żądaństring
wymagane
Czytelny dla człowieka komunikat opisujący wynik
string
wymagane
Unikalny identyfikator utworzonego projektu tłumaczenia. Użyj tego identyfikatora, aby sprawdzić status.
number
wymagane
Przybliżony szacowany czas przetwarzania w minutach. Obecny szacunek to pięć minut przetwarzania na każdą rozpoczętą minutę mediów źródłowych.
Przykłady
Zapisane reguły glosariusz oraz niestandardowe instrukcje tłumaczenia z aktywnego konta lub zespołu są stosowane automatycznie.
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'];
Przykład odpowiedzi
{
"success": true,
"message": "Translation started successfully. Use the status endpoint to track progress.",
"projectId": "abc123-def456-ghi789",
"estimatedDuration": 15
}
Błędy
| Status | Kod | Opis |
|---|---|---|
| 400 | FILE_REQUIRED | Nie przesłano żadnego pliku wraz z żądaniem |
| 400 | INVALID_FILE_TYPE | Przesłany typ pliku nie jest obsługiwany |
| 400 | DURATION_DETECTION_FAILED | Nie udało się wykryć czasu trwania przesłanego pliku |
| 400 | INVALID_MULTIPART_REQUEST | Dane formularza wieloczęściowego są błędne lub przekraczają limity pól |
| 400 | INVALID_BOOLEAN_VALUE | Parametr logiczny ma nieprawidłową wartość (użyj “true” lub “false”) |
| 400 | INVALID_JSON_FORMAT | JSON ustawień klonowanie głosu jest błędny |
| 400 | INVALID_BRAND_VOCABULARY | Wpis słownikowy specyficzny dla żądania jest nieprawidłowy |
| 400 | INVALID_SOURCE_SRT | Dostarczony plik SRT źródłowy jest błędny |
| 400 | SOURCE_LANGUAGE_REQUIRED_FOR_SRT | sourceSrt wymaga jawnego określenia originalLanguage |
| 400 | INVALID_TRANSLATED_SRT | Dostarczony przetłumaczony SRT jest nieprawidłowy |
| 400 | TRANSLATED_SRT_CUE_COUNT_MISMATCH | translatedSrt i sourceSrt nie zawierają tej samej liczby cue |
| 400 | VOICE_ID_REQUIRED | Wybrano tryb niestandardowe głosy bez identyfikatora głosu |
| 400 | VOICE_ID_NOT_ALLOWED_WITH_CLONING | Identyfikator głosu został połączony z klonowanie głosu |
| 400 | VOICE_CLONING_SETTINGS_NOT_ALLOWED | Ustawienia klonowania zostały połączone z trybem niestandardowe głosy |
| 400 | CONFLICTING_LIPSYNC_OPTIONS | lipSyncMode jest w konflikcie z przestarzałym lipsyncPro |
| 400 | TRANSLATION_TIME_SKIP_CONFLICT | Pominięcia czasu są w konflikcie z inną opcją audio |
| 400 | TRANSLATION_TIME_SKIP_REQUIRES_BACKGROUND | Pominięcia czasu wymagają dźwięk w tle |
| 400 | TRANSLATION_TIME_SKIP_OUT_OF_RANGE | Pominięcie czasu wykracza poza czas trwania mediów |
| 400 | INVALID_TRANSLATION_TIME_SKIPS | Pominięcie czasu nakłada się na segment transkrypcji |
| 400 | SUBTITLES_NOT_AVAILABLE_FOR_AUDIO | Zażądano wtopione napisy dla wejścia audio |
| 400 | LIPSYNC_NOT_AVAILABLE_FOR_AUDIO | Zażądano synchronizacja ruchu ust dla wejścia audio |
| 400 | TRANSLATION_TIME_SKIP_NOT_AVAILABLE_FOR_AUDIO | Zażądano pominięcia czasu dla wejścia audio |
| 400 | LIPSYNC_VIDEO_TOO_LONG | Zażądano synchronizacja ruchu ust dla mediów dłuższych niż obsługiwany czas trwania |
| 413 | FILE_TOO_LARGE | Przesłany plik przekracza limit planu użytkownika |
| 401 | MISSING_API_KEY | Wymagany jest klucz API |
| 401 | INVALID_API_KEY_FORMAT | Klucz API musi zaczynać się od vc_ |
| 401 | INVALID_API_KEY | Podany klucz API jest nieprawidłowy |
| 403 | SUBSCRIPTION_REQUIRED | Dostęp do API wymaga planu Starter lub wyższego |
| 403 | INSUFFICIENT_CREDITS | Niewystarczająca liczba kredytów do przetworzenia tego pliku |
| 403 | CUSTOM_VOICE_ACCESS_DENIED | Wybrany głos nie pochodzi z katalogu ani nie jest głosem niestandardowym zapisanym przez uwierzytelnione konto. |
| 403 | LIPSYNC_MODE_ACCESS_DENIED | Tryb premium synchronizacja ruchu ust jest niedostępny w bieżącym planie |
| 429 | RATE_LIMIT_EXCEEDED | Zbyt wiele żądań (limit: 10 żądań na minutę) |
| 429 | CONCURRENT_TRANSLATION_LIMIT_REACHED | Osiągnięto limit równoczesnych tłumaczeń dla konta; zobacz details.limit |
Czy ta strona była pomocna?

