开始翻译
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)表示的内容源语言。强烈建议:留空以进行自动检测。仅当您 100% 确定语言代码正确且符合有效 ISO 格式时,才提供此参数。错误的语言代码会导致转录失败。我们的自动检测功能支持 80 多种语言,且准确度极高。
auto-detectstring
项目的自定义名称。有助于在您的仪表板中识别项目。默认值: 如果未提供,将使用项目 ID。
string
一个用于接收此项目 webhook 事件 的 https 端点,
它将覆盖您账户上配置的端点。默认值: 配置后的账户 webhook 端点。
string
auto-detect 或从 1 到 32 的整数。已知的说话人数量可以改善说话人日志记录(diarization)。默认值: auto-detectstring
一个包含特定于请求的名称、品牌、首字母缩略词或专业术语的 JSON 字符串数组。这些术语将与保存的账户或团队词汇表合并。
boolean
在翻译前从源转录文本中删除常见的填充词。默认值:
truestring
现有的源语言 SRT 转录文件。提供此字段时,必须明确指定
originalLanguage。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
保留旧版口型同步选择器以实现向后兼容。默认值: 未启用(省略该字段以跳过口型同步)表单数据: 将布尔值作为
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
微调语音克隆参数,以实现对生成语音的高级控制。使用表单数据时,请作为 JSON 字符串传递。所有值必须介于 0 和 1 之间(步长为 0.01)。旧版集成发送的
默认值(平衡):
speakerBoost 值仍会被接受,但已不再产生任何效果。这些设置仅在
voiceMode 为 cloning 时适用。显示 voiceCloningSettings 属性
显示 voiceCloningSettings 属性
{
"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 | 先转录媒体,再把每条翻译字幕匹配到在字幕开始后 50 毫秒内开始的转录片段,或重叠最大的片段。同一片段上的多条字幕会合并。无法匹配片段的字幕,或没有任何字幕的片段,都会使本次运行失败。 |
timestamps 模式中的对齐问题要在转录完成后才会发现,并异步报告。状态接口 返回 HTTP 200、status: "failed" 和包含 code、message 的 error;project.translation.failed Webhook 携带相同的代码和消息。TRANSLATED_SRT_UNMATCHED_CUES 的消息中包含未匹配的字幕条编号,TRANSLATED_SRT_MISSING_SEGMENTS 的消息中包含没有字幕条的片段索引。这些响应不包含结构化的 details。若要确定对应关系,请同时发送 sourceSrt 和 translatedSrt,或先用 创建项目 创建项目,导出转录并逐条翻译,再调用 项目配音。
检查语速
长句必须加速才能放进片段。请用 导出项目转录 导出翻译转录:每个翻译片段都带有finalSpeedFactor,即最终节奏调整之前,生成语音时长与片段窗口的比值。缩短大约高于 1.3 的字幕条,再用修订后的 SRT 重新配音。
JSON 接口 项目配音 也接受
translatedSrt。它会为已经转录的项目配音,无需再次上传媒体。响应
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 |
此页面对您有帮助吗?

