项目配音
curl --request POST \
--url https://api.voicecheap.ai/v1/projects/{projectId}/dub \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"targetLanguage": "<string>",
"translatedSrt": "<string>",
"webhookUrl": "<string>",
"keepBackgroundMusic": true,
"keepOriginalVoice": true,
"originalVoiceVolume": 123,
"voiceMode": "<string>",
"voiceId": "<string>",
"voiceIsolatorOption": "<string>",
"subtitles": true,
"subtitlesSource": "<string>",
"lipSyncMode": "<string>",
"activeSpeakerDetectionEnabled": true,
"voiceCloningSettings": {},
"translationTimeSkips": [
{}
]
}
'import requests
url = "https://api.voicecheap.ai/v1/projects/{projectId}/dub"
payload = {
"targetLanguage": "<string>",
"translatedSrt": "<string>",
"webhookUrl": "<string>",
"keepBackgroundMusic": True,
"keepOriginalVoice": True,
"originalVoiceVolume": 123,
"voiceMode": "<string>",
"voiceId": "<string>",
"voiceIsolatorOption": "<string>",
"subtitles": True,
"subtitlesSource": "<string>",
"lipSyncMode": "<string>",
"activeSpeakerDetectionEnabled": True,
"voiceCloningSettings": {},
"translationTimeSkips": [{}]
}
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>',
translatedSrt: '<string>',
webhookUrl: '<string>',
keepBackgroundMusic: true,
keepOriginalVoice: true,
originalVoiceVolume: 123,
voiceMode: '<string>',
voiceId: '<string>',
voiceIsolatorOption: '<string>',
subtitles: true,
subtitlesSource: '<string>',
lipSyncMode: '<string>',
activeSpeakerDetectionEnabled: true,
voiceCloningSettings: {},
translationTimeSkips: [{}]
})
};
fetch('https://api.voicecheap.ai/v1/projects/{projectId}/dub', 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/projects/{projectId}/dub",
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>',
'translatedSrt' => '<string>',
'webhookUrl' => '<string>',
'keepBackgroundMusic' => true,
'keepOriginalVoice' => true,
'originalVoiceVolume' => 123,
'voiceMode' => '<string>',
'voiceId' => '<string>',
'voiceIsolatorOption' => '<string>',
'subtitles' => true,
'subtitlesSource' => '<string>',
'lipSyncMode' => '<string>',
'activeSpeakerDetectionEnabled' => true,
'voiceCloningSettings' => [
],
'translationTimeSkips' => [
[
]
]
]),
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/projects/{projectId}/dub"
payload := strings.NewReader("{\n \"targetLanguage\": \"<string>\",\n \"translatedSrt\": \"<string>\",\n \"webhookUrl\": \"<string>\",\n \"keepBackgroundMusic\": true,\n \"keepOriginalVoice\": true,\n \"originalVoiceVolume\": 123,\n \"voiceMode\": \"<string>\",\n \"voiceId\": \"<string>\",\n \"voiceIsolatorOption\": \"<string>\",\n \"subtitles\": true,\n \"subtitlesSource\": \"<string>\",\n \"lipSyncMode\": \"<string>\",\n \"activeSpeakerDetectionEnabled\": true,\n \"voiceCloningSettings\": {},\n \"translationTimeSkips\": [\n {}\n ]\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/projects/{projectId}/dub")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"targetLanguage\": \"<string>\",\n \"translatedSrt\": \"<string>\",\n \"webhookUrl\": \"<string>\",\n \"keepBackgroundMusic\": true,\n \"keepOriginalVoice\": true,\n \"originalVoiceVolume\": 123,\n \"voiceMode\": \"<string>\",\n \"voiceId\": \"<string>\",\n \"voiceIsolatorOption\": \"<string>\",\n \"subtitles\": true,\n \"subtitlesSource\": \"<string>\",\n \"lipSyncMode\": \"<string>\",\n \"activeSpeakerDetectionEnabled\": true,\n \"voiceCloningSettings\": {},\n \"translationTimeSkips\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.voicecheap.ai/v1/projects/{projectId}/dub")
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 \"translatedSrt\": \"<string>\",\n \"webhookUrl\": \"<string>\",\n \"keepBackgroundMusic\": true,\n \"keepOriginalVoice\": true,\n \"originalVoiceVolume\": 123,\n \"voiceMode\": \"<string>\",\n \"voiceId\": \"<string>\",\n \"voiceIsolatorOption\": \"<string>\",\n \"subtitles\": true,\n \"subtitlesSource\": \"<string>\",\n \"lipSyncMode\": \"<string>\",\n \"activeSpeakerDetectionEnabled\": true,\n \"voiceCloningSettings\": {},\n \"translationTimeSkips\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"projectId": "<string>",
"workId": "<string>",
"estimatedDuration": 123
}翻译和配音
项目配音
使用你自己的翻译 SRT 为已转录的项目配音
项目配音
curl --request POST \
--url https://api.voicecheap.ai/v1/projects/{projectId}/dub \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"targetLanguage": "<string>",
"translatedSrt": "<string>",
"webhookUrl": "<string>",
"keepBackgroundMusic": true,
"keepOriginalVoice": true,
"originalVoiceVolume": 123,
"voiceMode": "<string>",
"voiceId": "<string>",
"voiceIsolatorOption": "<string>",
"subtitles": true,
"subtitlesSource": "<string>",
"lipSyncMode": "<string>",
"activeSpeakerDetectionEnabled": true,
"voiceCloningSettings": {},
"translationTimeSkips": [
{}
]
}
'import requests
url = "https://api.voicecheap.ai/v1/projects/{projectId}/dub"
payload = {
"targetLanguage": "<string>",
"translatedSrt": "<string>",
"webhookUrl": "<string>",
"keepBackgroundMusic": True,
"keepOriginalVoice": True,
"originalVoiceVolume": 123,
"voiceMode": "<string>",
"voiceId": "<string>",
"voiceIsolatorOption": "<string>",
"subtitles": True,
"subtitlesSource": "<string>",
"lipSyncMode": "<string>",
"activeSpeakerDetectionEnabled": True,
"voiceCloningSettings": {},
"translationTimeSkips": [{}]
}
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>',
translatedSrt: '<string>',
webhookUrl: '<string>',
keepBackgroundMusic: true,
keepOriginalVoice: true,
originalVoiceVolume: 123,
voiceMode: '<string>',
voiceId: '<string>',
voiceIsolatorOption: '<string>',
subtitles: true,
subtitlesSource: '<string>',
lipSyncMode: '<string>',
activeSpeakerDetectionEnabled: true,
voiceCloningSettings: {},
translationTimeSkips: [{}]
})
};
fetch('https://api.voicecheap.ai/v1/projects/{projectId}/dub', 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/projects/{projectId}/dub",
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>',
'translatedSrt' => '<string>',
'webhookUrl' => '<string>',
'keepBackgroundMusic' => true,
'keepOriginalVoice' => true,
'originalVoiceVolume' => 123,
'voiceMode' => '<string>',
'voiceId' => '<string>',
'voiceIsolatorOption' => '<string>',
'subtitles' => true,
'subtitlesSource' => '<string>',
'lipSyncMode' => '<string>',
'activeSpeakerDetectionEnabled' => true,
'voiceCloningSettings' => [
],
'translationTimeSkips' => [
[
]
]
]),
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/projects/{projectId}/dub"
payload := strings.NewReader("{\n \"targetLanguage\": \"<string>\",\n \"translatedSrt\": \"<string>\",\n \"webhookUrl\": \"<string>\",\n \"keepBackgroundMusic\": true,\n \"keepOriginalVoice\": true,\n \"originalVoiceVolume\": 123,\n \"voiceMode\": \"<string>\",\n \"voiceId\": \"<string>\",\n \"voiceIsolatorOption\": \"<string>\",\n \"subtitles\": true,\n \"subtitlesSource\": \"<string>\",\n \"lipSyncMode\": \"<string>\",\n \"activeSpeakerDetectionEnabled\": true,\n \"voiceCloningSettings\": {},\n \"translationTimeSkips\": [\n {}\n ]\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/projects/{projectId}/dub")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"targetLanguage\": \"<string>\",\n \"translatedSrt\": \"<string>\",\n \"webhookUrl\": \"<string>\",\n \"keepBackgroundMusic\": true,\n \"keepOriginalVoice\": true,\n \"originalVoiceVolume\": 123,\n \"voiceMode\": \"<string>\",\n \"voiceId\": \"<string>\",\n \"voiceIsolatorOption\": \"<string>\",\n \"subtitles\": true,\n \"subtitlesSource\": \"<string>\",\n \"lipSyncMode\": \"<string>\",\n \"activeSpeakerDetectionEnabled\": true,\n \"voiceCloningSettings\": {},\n \"translationTimeSkips\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.voicecheap.ai/v1/projects/{projectId}/dub")
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 \"translatedSrt\": \"<string>\",\n \"webhookUrl\": \"<string>\",\n \"keepBackgroundMusic\": true,\n \"keepOriginalVoice\": true,\n \"originalVoiceVolume\": 123,\n \"voiceMode\": \"<string>\",\n \"voiceId\": \"<string>\",\n \"voiceIsolatorOption\": \"<string>\",\n \"subtitles\": true,\n \"subtitlesSource\": \"<string>\",\n \"lipSyncMode\": \"<string>\",\n \"activeSpeakerDetectionEnabled\": true,\n \"voiceCloningSettings\": {},\n \"translationTimeSkips\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"projectId": "<string>",
"workId": "<string>",
"estimatedDuration": 123
}项目配音
根据你提供的翻译 SRT,为已有项目生成语音并混合输出。VoiceCheap 在此接口不做任何翻译:没有翻译引擎、没有 SmartSync 改写、没有术语表。每条字幕都会在项目转录的对应片段上逐字朗读,然后与原始背景、字幕和可选的口型同步混合,与常规翻译相同。 当译文在别处完成(人工译者、你自己的工具、自动化流程),只需要 VoiceCheap 生成语音时使用。运行是异步的:轮询获取翻译状态,或监听 Webhooks。前提条件
- 项目必须存在,并且转录必须完成:用创建项目(仅转录)或开始翻译创建,然后等待
transcriptionStatus: "success"。 - 你的 SRT 必须覆盖项目转录:每个转录片段至少需要一条字幕,每条字幕都必须落在某个片段上。用导出项目转录导出转录,并逐条翻译以保留时间码。
- 该请求按同一媒体的翻译计费,并进行相同的额度检查。口型同步模式会照常消耗额外额度。
并发限制
创建项目、翻译和配音都会检查账户的进行中翻译上限(最多 10 个,实际限制可能更低)。只有进行中的翻译或配音任务占用名额;仅转录的项目不占用。达到上限时,API 返回CONCURRENT_TRANSLATION_LIMIT_REACHED(HTTP 429)。实际限制见 details.limit。
同一项目和目标语言已有任务运行时,第二次运行也会被拒绝(TRANSLATION_ALREADY_IN_PROGRESS,HTTP 409)。
请求
此接口接受 JSON 请求体(Content-Type: application/json)。布尔和数值选项以 JSON 值发送,而不是字符串。
标头
string
必填
您的 VoiceCheap API 密钥。请从 app.voicecheap.ai/page-api 获取。
路径参数
正文参数
string
必填
最终的目标语言 SRT 内容(字幕编号、时间行、文本)。最多 1,000,000 个字符。字幕条按时间戳匹配到转录片段:在片段开始后 50 毫秒内开始的字幕条会分配给该片段,否则分配给重叠最多的片段。同一片段上的多条字幕用空格连接。每条朗读片段的时间、说话人和顺序始终来自项目转录;你的时间码只用于匹配。
string
一个 https 端点,从此接收此项目的Webhook 事件,并覆盖账户上配置的端点。默认值: 先使用项目中已保存的端点,然后是账户的 Webhook 端点。
boolean
在生成的语音下方保留原始背景音频(音乐、环境声)。默认值:
trueboolean
在生成的语音下方小声保留原始说话人。默认值:
falsenumber
启用
keepOriginalVoice 时原始语音的音量,范围从 1 到 70。默认值: 30string
音色策略:
cloning(克隆项目中说话人的音色)或 custom(使用目录中的音色或您保存的自定义音色)。默认值: cloningstring
当
voiceMode 为 custom 时必填。请使用 dubbing_voices_list 中的
ID:目录中的音色或经过身份验证的账户保存的自定义音色。团队计费不会授予访问其他成员已保存音色的权限。string
启用
keepBackgroundMusic 时的人声分离模式:studio 或 realistic。默认值: studioboolean
把字幕烧录到输出视频中。需要视频项目。默认值:
falsestring
启用
subtitles 时的字幕文本:translated(你的 SRT)或 original(源转录)。默认值: translatedboolean
为请求的口型同步运行启用当前说话人检测。默认值:
falsearray
保留为原始语言的源时间范围,格式为
[{ "startTime": 10.2, "endTime": 12.8 }]。需要视频项目和 keepBackgroundMusic: true,不能与 keepOriginalVoice 同时使用,也不能与转录片段重叠。响应
boolean
必填
请求成功时始终为
true。string
必填
可供人阅读的确认信息。
string
必填
正在配音的项目。
string
必填
用于
targetLanguage 的翻译工作。它与状态、详情和转录接口中的 workId 一致。number
必填
大致处理时间估计(分钟):源媒体每开始一分钟,处理约五分钟。
Response
{
"success": true,
"message": "Dubbing started successfully from the provided translation. Use the status endpoint to track progress.",
"projectId": "project_123",
"workId": "work_456",
"estimatedDuration": 10
}
跟踪运行
配音一开始,项目就会切换到translation 流程,因此获取翻译状态会跟踪这次新运行:status 从 processing 变为 success(带有 translatedVideoUrl 和 translatedAudioUrl)或 failed(带有 error)。project.translation.completed 和 project.translation.failed Webhook 会带着相同的 targetLanguage 发送。在获取项目详情中,翻译版本会报告 settings.dubbingMode: "dub-only" 和 settings.smartSync: false。
POST 请求被接受后,对齐错误才会异步报告。状态接口返回带有 error.code 和 error.message 的 status: "failed";project.translation.failed Webhook 携带相同的代码和消息。TRANSLATED_SRT_UNMATCHED_CUES 的消息中包含未匹配的字幕条编号,TRANSLATED_SRT_MISSING_SEGMENTS 的消息中包含没有字幕条的片段索引。这些异步响应不包含结构化的 details。修正 SRT 后再次调用接口:失败的版本仍保留在项目历史中,并创建新版本。
检查语速
用导出项目转录把翻译转录导出为 JSON。每个片段都带有finalSpeedFactor,即生成语音与片段窗口的比值。缩短大约高于 1.3 的字幕条,再用修订后的 SRT 重新配音。
示例流程
典型的自动化(例如 n8n 或 Make 场景)按以下方式串联这些接口:- 使用媒体、
targetLanguage和明确的originalLanguage调用POST /v1/projects(仅转录)。 - 轮询
GET /v1/translate/{projectId}/status,直到transcriptionStatus为success,或等待project.createdWebhook。 - 使用
{ "source": "original", "outputFormat": "srt" }调用POST /v1/projects/{projectId}/transcript,翻译字幕条并保留编号和时间码。 - 使用翻译后的 SRT 调用
POST /v1/projects/{projectId}/dub。 - 轮询状态接口,直到
status为success,或等待project.translation.completed。 - 下载
translatedVideoUrl(如果请求了口型同步,则下载lipSync.videoUrl)。 - 输出保存在你这边之后,调用
DELETE /v1/translate/{projectId}。
curl -X POST "https://api.voicecheap.ai/v1/projects/project_123/dub" \
-H "x-api-key: vc_your-api-key" \
-H "Content-Type: application/json" \
-d '{
"targetLanguage": "english",
"translatedSrt": "1\n00:00:00,000 --> 00:00:02,400\nWelcome to this lesson.\n\n2\n00:00:02,400 --> 00:00:05,100\nToday we talk about fractions.",
"keepBackgroundMusic": true,
"subtitles": true,
"subtitlesSource": "translated"
}'
interface DubProjectResponse {
success: boolean;
message: string;
projectId: string;
workId: string;
estimatedDuration: number;
}
const API_BASE_URL = 'https://api.voicecheap.ai/v1';
const headers = { 'x-api-key': 'vc_your-api-key', 'Content-Type': 'application/json' };
async function waitForStatus(projectId: string, isReady: (status: any) => boolean): Promise<any> {
while (true) {
const status = await fetch(`${API_BASE_URL}/translate/${projectId}/status`, { headers }).then((response) => response.json());
if (status.status === 'failed') throw new Error(`${status.error?.code}: ${status.error?.message}`);
if (isReady(status)) return status;
await new Promise((resolve) => setTimeout(resolve, 15_000));
}
}
async function dubExistingProject(projectId: string, translatedSrt: string): Promise<string> {
// 1. The project was created earlier with POST /v1/projects; wait for its transcript.
await waitForStatus(projectId, (status) => status.transcriptionStatus === 'success');
// 2. Send the translation you produced from the exported transcript.
const dubResponse = await fetch(`${API_BASE_URL}/projects/${projectId}/dub`, {
method: 'POST',
headers,
body: JSON.stringify({ targetLanguage: 'english', translatedSrt, keepBackgroundMusic: true }),
});
if (!dubResponse.ok) {
const error = await dubResponse.json();
throw new Error(`${error.code}: ${error.message}`);
}
const { workId } = (await dubResponse.json()) as DubProjectResponse;
console.log('Dubbing started on work', workId);
// 3. Wait for the dubbed output.
const completed = await waitForStatus(projectId, (status) => status.status === 'success');
return completed.translatedVideoUrl as string;
}
import time
import requests
API_BASE_URL = 'https://api.voicecheap.ai/v1'
HEADERS = {'x-api-key': 'vc_your-api-key'}
def wait_for_status(project_id, is_ready):
while True:
status = requests.get(f'{API_BASE_URL}/translate/{project_id}/status', headers=HEADERS).json()
if status['status'] == 'failed':
raise RuntimeError(f"{status['error']['code']}: {status['error']['message']}")
if is_ready(status):
return status
time.sleep(15)
def dub_existing_project(project_id, translated_srt):
wait_for_status(project_id, lambda status: status['transcriptionStatus'] == 'success')
response = requests.post(
f'{API_BASE_URL}/projects/{project_id}/dub',
headers=HEADERS,
json={'targetLanguage': 'english', 'translatedSrt': translated_srt, 'keepBackgroundMusic': True},
)
response.raise_for_status()
print('Dubbing started on work', response.json()['workId'])
completed = wait_for_status(project_id, lambda status: status['status'] == 'success')
return completed['translatedVideoUrl']
错误
| 状态 | 代码 | 描述 |
|---|---|---|
| 400 | VALIDATION_ERROR | 请求体字段缺失或无效(details 列出每个字段) |
| 400 | INVALID_TRANSLATED_SRT | translatedSrt 不包含有效的 SRT 字幕条 |
| 400 | INVALID_BOOLEAN_VALUE | 布尔选项未以 JSON 布尔值发送 |
| 400 | INVALID_NUMBER_VALUE | 数值选项未以 JSON 数字发送 |
| 400 | DURATION_DETECTION_FAILED | 项目中保存的媒体时长不可用 |
| 400 | VOICE_ID_REQUIRED | 选择了自定义语音模式但未提供语音 ID |
| 400 | VOICE_ID_NOT_ALLOWED_WITH_CLONING | 语音 ID 与语音克隆结合使用 |
| 400 | VOICE_CLONING_SETTINGS_NOT_ALLOWED | 克隆设置与自定义语音模式结合使用 |
| 400 | TRANSLATION_TIME_SKIP_CONFLICT | 时间跳过与其他音频选项冲突 |
| 400 | TRANSLATION_TIME_SKIP_REQUIRES_BACKGROUND | 时间跳过需要背景音频 |
| 400 | TRANSLATION_TIME_SKIP_OUT_OF_RANGE | 时间跳过超出了媒体时长 |
| 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 | 超过支持时长的媒体请求了口型同步 |
| 401 | MISSING_API_KEY | 需要 API 密钥 |
| 401 | INVALID_API_KEY_FORMAT | API 密钥必须以 vc_ 开头 |
| 401 | INVALID_API_KEY | 提供的 API 密钥无效 |
| 403 | SUBSCRIPTION_REQUIRED | API 访问需要 Starter 或更高级别的计划 |
| 403 | FORBIDDEN | 您没有访问该项目的权限 |
| 403 | INSUFFICIENT_CREDITS | 没有足够的额度为此项目配音 |
| 403 | CUSTOM_VOICE_ACCESS_DENIED | 所选音色既不是目录中的音色,也不是经过身份验证的账户保存的自定义音色。 |
| 403 | LIPSYNC_MODE_ACCESS_DENIED | 当前套餐不支持高级口型同步模式 |
| 404 | PROJECT_NOT_FOUND | 项目不存在 |
| 409 | DUB_ONLY_REQUIRES_TRANSCRIPTION | 项目转录仍在处理中或已失败 |
| 409 | TRANSLATION_ALREADY_IN_PROGRESS | 该项目中此语言的配音已在进行中 |
| 429 | RATE_LIMIT_EXCEEDED | 请求过多(限制:每分钟 10 个请求) |
| 429 | CONCURRENT_TRANSLATION_LIMIT_REACHED | 已达到账户并发翻译上限;参见 details.limit |
| 500 | INTERNAL_ERROR | 意外的服务器错误 |
TRANSLATED_SRT_UNMATCHED_CUES、TRANSLATED_SRT_MISSING_SEGMENTS)由状态接口和失败 Webhook 返回,而不是由本次请求返回。此页面对您有帮助吗?

