번역 시작
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
}번역 및 더빙
번역 시작
비디오 또는 오디오 파일을 업로드하고 새로운 번역 프로젝트를 시작하세요
번역 시작
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
}번역 시작
비디오 또는 오디오 파일을 업로드하여 새로운 번역 프로젝트를 생성하세요. 번역 프로세스는 백그라운드에서 비동기적으로 실행됩니다. 진행 상황을 추적하고 결과를 검색하려면 상태 엔드포인트을 사용하세요. 번역된 버전 기록이나 립싱크 기록이 필요할 때는 프로젝트 세부 정보 가져오기을 사용하세요.동시성 제한
프로젝트 생성, 번역, 더빙은 모두 계정의 진행 중인 번역 한도(최대 10개, 계정에 따라 더 낮을 수 있음)를 확인합니다. 진행 중인 번역이나 더빙 작업만 한도를 차지하며, 전사 전용 프로젝트는 한도를 차지하지 않습니다. 한도에 도달하면 API는CONCURRENT_TRANSLATION_LIMIT_REACHED(HTTP 429)를 반환합니다. 적용되는 한도는 details.limit에서 확인할 수 있습니다.
요청
이 엔드포인트는 파일 업로드와 함께multipart/form-data을 허용합니다.
헤더
string
필수
귀하의 VoiceCheap API 키입니다. app.voicecheap.ai/page-api에서 키를 발급받으세요.
본문 매개변수
file
필수
번역할 비디오 또는 오디오 파일입니다.지원되는 비디오 형식:
video/mp4, video/quicktime, video/x-matroska, video/webm, video/mpeg지원되는 오디오 형식: audio/mpeg, audio/wav, audio/mp4, audio/x-m4a, audio/flac, audio/ogg, audio/aac, audio/webm플랜별 최대 파일 크기: Beginner 5 GB, Starter 10 GB, Creator 20 GB, Pro 30 GB, Scale 40 GB, Enterprise 60 GB.string
필수
콘텐츠를 번역할 언어입니다. 소문자로 입력해야 합니다.허용되는 값 (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
ISO 언어 코드를 사용하는 콘텐츠의 원본 언어입니다 (예: 기본값:
en, es, fr, de, ja, zh).강력 권장: 자동 감지를 위해 이 항목을 비워 두세요.언어 코드가 정확하고 유효한 ISO 형식임을 100% 확신하는 경우에만 이 매개변수를 제공하세요. 잘못된 언어 코드는 전사 실패를 유발합니다. 당사의 자동 감지는 80개 이상의 언어를 지원하며 매우 정확합니다.
auto-detectstring
프로젝트의 사용자 지정 이름입니다. 대시보드에서 프로젝트를 식별하는 데 유용합니다.기본값: 제공되지 않으면 프로젝트 ID가 사용됩니다.
string
auto-detect 또는 1에서 32 사이의 정수입니다. 화자 수를 알고 있으면 화자 분리(diarization) 성능이 향상될 수 있습니다.기본값: auto-detectstring
요청별 이름, 브랜드, 약어 또는 전문 용어의 JSON 문자열 배열입니다. 이러한 용어는 저장된 계정 또는 팀 용어집과 병합됩니다.
boolean
번역 전 원본 전사에서 일반적인 추임새 단어를 제거합니다.기본값:
truestring
기존 원본 언어 SRT 전사 파일입니다. 이 필드가 제공될 때
originalLanguage을 명시해야 합니다.string
직접 작성한 최종 대상 언어 SRT입니다. 제공하면 VoiceCheap은 번역 엔진을 건너뛰고 이 텍스트로 음성 생성과 믹스만 수행합니다. 정렬 규칙은 더빙 전용 모드를 참고하세요. 최대 1,000,000자입니다.
boolean
출력물에서 배경 오디오를 보존할지 여부입니다.활성화하면 원본 음성만 제거(스템 분리)하면서 배경 음악, 주변 소음, 웃음소리, 박수 소리 및 군중 소리를 유지합니다. 원본에 배경 오디오가 없는 경우 끄십시오.기본값:
trueboolean
번역된 음성 아래에 원본 화자의 목소리를 작게 유지합니다.기본값:
falsenumber
keepOriginalVoice가 활성화된 경우 1에서 70까지의 원본 음성 볼륨입니다.기본값: 30string
keepBackgroundMusic이 활성화된 경우의 음성 분리 모드입니다. 음성 분리의 품질과 특성을 제어합니다.스튜디오 (권장)
스튜디오 (권장)
전문적인 오디오 품질을 위해 설계된 기본 음성 처리 방식입니다:
- 에코 및 잔향 제거
- 기술적 결함 정리
- 맑고 선명한 음성 생성
현실적
현실적
녹음 환경의 자연스러운 특성을 보존합니다:
- 원본 녹음과 더 가까운 사운드 유지
- 환경적 특성 보존
이 옵션은 배경 요소를 보존하기 때문에 경우에 따라 아티팩트나 예상치 못한 효과가 발생할 수 있습니다.
studio, realistic기본값: studioboolean
번역된 비디오에 자막을 생성할지 여부입니다.활성화하면 읽기 쉬운 흑백 자막이 추가됩니다.
subtitlesSource로 원본 언어 또는 번역된 언어의 텍스트를 선택하세요. 자막은 읽기 쉽도록 자동으로 동기화됩니다.기본값: falsestring
subtitles이 활성화된 경우 자막 텍스트 소스를 선택합니다.허용된 값: translated, original기본값: translated참고: original이 선택되었으나 원본 전사가 제공되지 않는 경우, 자막은 translated로 대체됩니다.string
번역 완료 후 립싱크 처리를 트리거합니다.
standard= Lip Syncpro= Lip Sync Prostudio= Lip Sync Studio
boolean
요청된 립싱크 실행에 대해 활성 화자 감지를 활성화합니다.기본값:
falseboolean
이전 버전과의 호환성을 위해 유지되는 레거시 립싱크 선택기입니다.기본값: 활성화되지 않음 (립싱크를 건너뛰려면 필드를 생략하십시오)Form-data: 불리언 값을
false= 표준 립싱크 (비디오 1분당 4분 크레딧)true= Lip Sync Pro (비디오 1분당 9분 크레딧)
최대 지속 시간: 비디오당 180분.지연 시간: 립싱크 처리는 일반적으로 원본 비디오 지속 시간의 2배~4배가 추가됩니다.
API로 트리거된 요청에 대해서는 립싱크 완료 및 실패 이메일이 발송되지 않습니다. 상태 엔드포인트을 사용하여
진행 상황을 추적하십시오.
true 또는 false 문자열로 보냅니다 (예: -F "lipsyncPro=false").lipsyncPro을 충돌하는 lipSyncMode과 결합하지 마십시오.string
음성 전략:
cloning 또는 custom.기본값: cloningstring
voiceMode가 custom일 때 필수입니다. dubbing_voices_list에서 카탈로그 음성이나 인증된 계정이 저장한 사용자 지정 음성의 ID를 사용하세요. 팀
결제를 사용해도 다른 구성원이 저장한 음성에 접근할 수 없습니다.object
생성된 음성을 고급 제어하기 위해 음성 복제 매개변수를 미세 조정합니다. form-data 사용 시 JSON 문자열로 전달하십시오. 모든 값은 0에서 1 사이여야 합니다 (0.01 단위). 이전 연동에서 보내는
기본값 (균형 잡힘):
speakerBoost 값은 계속 허용되지만 더 이상 효과가 없습니다.이 설정은
voiceMode이 cloning일 때만 적용됩니다.표시 voiceCloningSettings 속성
표시 voiceCloningSettings 속성
number
기본값:"0.60"
음성 안정성 (0.00 - 1.00)음성의 안정성과 각 생성 간의 무작위성을 결정합니다.
- 낮은 값은 더 넓은 감정 범위를 허용하지만 어색하거나 급한 말투를 유발할 수 있습니다
- 높은 값은 더 일관된 출력을 생성하지만 단조롭게 들릴 수 있습니다
0.60 (studio) / 0.65 (realistic)number
기본값:"0.80"
음성 유사도 (0.00 - 1.00)AI가 원본 음성을 얼마나 밀접하게 따를지 제어합니다.
- 높은 값은 복제된 음성을 원본과 더 유사하게 만듭니다
- 원본 오디오에 노이즈가 많고 유사도가 너무 높으면 아티팩트나 배경 소음이 생성된 음성에 포함될 수 있습니다
0.80 (studio) / 0.75 (realistic){
"stability": 0.6,
"similarity": 0.8
}
string
원본 언어로 유지되어야 하는 소스 시간 범위의 JSON 배열입니다.시간 건너뛰기에는 비디오 입력과
[
{ "startTime": 10.2, "endTime": 12.8 }
]
keepBackgroundMusic=true이 필요합니다. 이는 keepOriginalVoice과 결합할 수 없으며 전사 세그먼트와 겹칠 수 없습니다.더빙 전용 모드(번역은 직접 제공)
번역이 이미 있고 VoiceCheap에는 음성 생성과 믹스만 맡길 때translatedSrt를 보내세요.
이 모드에서는 다음과 같습니다.
- AI 번역도 SmartSync 재작성도 없습니다. 각 큐는 그대로 읽힙니다. 저장된 용어집 규칙과 사용자 번역 지시도 적용되지 않습니다. 이들은 번역 엔진에서만 실행되기 때문입니다.
- 타이밍은 원본에서 옵니다. 각 세그먼트는 원본 전사의 시작, 끝, 화자를 유지합니다. SRT 타임코드는 큐를 세그먼트에 맞추는 데만 쓰입니다. 생성된 음성은 문장을 바꾸지 않고 세그먼트 구간에 맞게 늘리거나 줄입니다.
- 크레딧은 번역과 같습니다. 같은 미디어의 표준 번역과 정확히 동일하게 청구됩니다.
- 음성, 배경, 자막, 립싱크 옵션은 그대로 적용됩니다.
voiceMode,keepBackgroundMusic,subtitles,lipSyncMode와 다른 더빙 옵션은 위에 설명된 대로 동작합니다.
message가 모드를 확인하고, 번역본은 프로젝트 세부 정보 가져오기에서 dubbingMode: "dub-only"를 보고합니다.
정렬 규칙
| 요청 | 모드 | 규칙 |
|---|---|---|
translatedSrt + sourceSrt | index | 두 파일의 큐 수가 같아야 합니다. 번역의 n번 큐는 원본의 n번 큐로 읽힙니다. 개수가 다르면 업로드 전에 TRANSLATED_SRT_CUE_COUNT_MISMATCH로 거부됩니다. |
translatedSrt만 | timestamps | 먼저 미디어를 전사한 뒤, 각 번역 큐를 큐 시작 50ms 이내에 시작하는 전사 세그먼트 또는 겹침이 가장 큰 세그먼트에 맞춥니다. 한 세그먼트의 여러 큐는 이어 붙입니다. 세그먼트가 없는 큐나 큐가 없는 세그먼트가 있으면 실행이 실패합니다. |
timestamps 모드의 정렬 문제는 전사가 끝난 뒤에만 확인되며 비동기적으로 보고됩니다. 상태 엔드포인트는 HTTP 200으로 status: "failed"와 code, message를 포함한 error를 반환하고, project.translation.failed 웹훅에도 같은 코드와 메시지가 들어 있습니다. TRANSLATED_SRT_UNMATCHED_CUES의 메시지에는 일치하지 않은 큐 번호가, TRANSLATED_SRT_MISSING_SEGMENTS의 메시지에는 큐가 없는 세그먼트 인덱스가 표시됩니다. 이 응답에는 구조화된 details가 포함되지 않습니다. 확정적인 매핑을 원하면 sourceSrt를 translatedSrt와 함께 보내거나, 먼저 프로젝트 생성으로 프로젝트를 만들고 전사를 내보내 큐마다 번역한 뒤 프로젝트 더빙을 호출하세요.
속도 확인
긴 문장은 세그먼트에 맞추기 위해 빨라집니다. 프로젝트 대본 내보내기로 번역 전사를 내보내세요. 각 번역 세그먼트에는 최종 템포 보정 전에 측정한 생성 음성과 세그먼트 구간의 비율finalSpeedFactor가 있습니다. 대략 1.3을 넘는 큐를 줄인 뒤 수정한 SRT로 더빙을 다시 실행하세요.
translatedSrt는 JSON 엔드포인트 프로젝트 더빙에서도 받습니다. 이미 전사된 프로젝트를 미디어를 다시 업로드하지 않고 더빙합니다.응답
boolean
필수
성공적인 요청의 경우 항상
truestring
필수
결과를 설명하는 사람이 읽을 수 있는 메시지
string
필수
생성된 더빙 프로젝트의 고유 식별자입니다. 이 ID를 사용하여 상태를 확인하세요.
number
필수
분 단위의 대략적인 처리 예상 시간입니다. 현재 예상 처리 시간은 소스 미디어 1분당 5분입니다.
예시
유효한 계정 또는 팀의 저장된 용어집 규칙 및 맞춤 더빙 지침이 자동으로 적용됩니다.
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'];
응답 예시
{
"success": true,
"message": "Translation started successfully. Use the status endpoint to track progress.",
"projectId": "abc123-def456-ghi789",
"estimatedDuration": 15
}
오류
| 상태 | 코드 | 설명 |
|---|---|---|
| 400 | FILE_REQUIRED | 요청과 함께 업로드된 파일이 없습니다 |
| 400 | INVALID_FILE_TYPE | 업로드된 파일 형식은 지원되지 않습니다 |
| 400 | DURATION_DETECTION_FAILED | 업로드된 파일의 길이를 감지할 수 없습니다 |
| 400 | INVALID_MULTIPART_REQUEST | 멀티파트 폼 데이터가 잘못되었거나 필드 제한을 초과했습니다 |
| 400 | INVALID_BOOLEAN_VALUE | 부울 매개변수의 값이 잘못되었습니다 (“true” 또는 “false” 사용) |
| 400 | INVALID_JSON_FORMAT | voiceCloningSettings JSON이 잘못되었습니다 |
| 400 | INVALID_BRAND_VOCABULARY | 요청별 어휘 항목이 유효하지 않습니다 |
| 400 | INVALID_SOURCE_SRT | 제공된 소스 SRT가 잘못되었습니다 |
| 400 | SOURCE_LANGUAGE_REQUIRED_FOR_SRT | sourceSrt에는 명시적인 originalLanguage가 필요합니다 |
| 400 | INVALID_TRANSLATED_SRT | 제공된 번역 SRT 형식이 올바르지 않습니다 |
| 400 | TRANSLATED_SRT_CUE_COUNT_MISMATCH | translatedSrt와 sourceSrt의 큐 수가 같지 않습니다 |
| 400 | VOICE_ID_REQUIRED | 음성 ID 없이 맞춤 음성 모드가 선택되었습니다 |
| 400 | VOICE_ID_NOT_ALLOWED_WITH_CLONING | 음성 ID가 음성 복제와 결합되었습니다 |
| 400 | VOICE_CLONING_SETTINGS_NOT_ALLOWED | 복제 설정이 맞춤 음성 모드와 결합되었습니다 |
| 400 | CONFLICTING_LIPSYNC_OPTIONS | lipSyncMode가 이전 버전의 lipsyncPro와 충돌합니다 |
| 400 | TRANSLATION_TIME_SKIP_CONFLICT | 시간 건너뛰기가 다른 오디오 옵션과 충돌합니다 |
| 400 | TRANSLATION_TIME_SKIP_REQUIRES_BACKGROUND | 시간 건너뛰기에는 배경 오디오가 필요합니다 |
| 400 | TRANSLATION_TIME_SKIP_OUT_OF_RANGE | 시간 건너뛰기가 미디어 길이를 초과합니다 |
| 400 | INVALID_TRANSLATION_TIME_SKIPS | 시간 건너뛰기가 전사 세그먼트와 겹칩니다 |
| 400 | SUBTITLES_NOT_AVAILABLE_FOR_AUDIO | 오디오 입력에 대해 하드코딩된 자막이 요청되었습니다 |
| 400 | LIPSYNC_NOT_AVAILABLE_FOR_AUDIO | 오디오 입력에 대해 립싱크가 요청되었습니다 |
| 400 | TRANSLATION_TIME_SKIP_NOT_AVAILABLE_FOR_AUDIO | 오디오 입력에 대해 시간 건너뛰기가 요청되었습니다 |
| 400 | LIPSYNC_VIDEO_TOO_LONG | 지원되는 길이보다 긴 미디어에 대해 립싱크가 요청되었습니다 |
| 413 | FILE_TOO_LARGE | 업로드된 파일이 사용자의 플랜 제한을 초과합니다 |
| 401 | MISSING_API_KEY | API 키가 필요합니다 |
| 401 | INVALID_API_KEY_FORMAT | API 키는 vc_으로 시작해야 합니다 |
| 401 | INVALID_API_KEY | 제공된 API 키가 유효하지 않습니다 |
| 403 | SUBSCRIPTION_REQUIRED | API 액세스에는 Starter 플랜 이상이 필요합니다 |
| 403 | INSUFFICIENT_CREDITS | 이 파일을 처리할 크레딧이 부족합니다 |
| 403 | CUSTOM_VOICE_ACCESS_DENIED | 선택한 음성은 카탈로그 음성도 아니고 인증된 계정이 저장한 사용자 지정 음성도 아닙니다. |
| 403 | LIPSYNC_MODE_ACCESS_DENIED | 프리미엄 립싱크 모드는 현재 플랜에서 사용할 수 없습니다 |
| 429 | RATE_LIMIT_EXCEEDED | 요청이 너무 많습니다 (제한: 분당 10회 요청) |
| 429 | CONCURRENT_TRANSLATION_LIMIT_REACHED | 계정 동시 번역 한도에 도달함. details.limit 참조 |
이 페이지가 도움이 되었나요?

