> ## Documentation Index
> Fetch the complete documentation index at: https://api-docs.voicecheap.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 开始翻译

> 上传视频或音频文件并开始新的翻译项目

# 开始翻译

通过上传视频或音频文件创建新的翻译项目。翻译过程在后台异步运行。使用 [状态端点](/docs/zh/api-reference/translation-status) 跟踪进度并检索结果。当您需要翻译版本历史记录或口型同步历史记录时，请使用 [获取项目详情](/docs/zh/api-reference/project-details)。

## 并发限制

每个帐户最多可同时运行 10 个翻译。如果已有 10 个翻译正在进行中，新请求将返回 `CONCURRENT_TRANSLATION_LIMIT_REACHED` (HTTP 429)。

## 请求

此端点接受带有文件上传的 `multipart/form-data`。

### 标头

<ParamField header="x-api-key" type="string" required>
  您的 VoiceCheap API 密钥。请从 [app.voicecheap.ai/page-api](https://app.voicecheap.ai/page-api) 获取。
</ParamField>

### 正文参数

<ParamField body="file" type="file" required>
  要翻译的视频或音频文件。

  **支持的视频格式：** `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。
</ParamField>

<ParamField body="targetLanguage" type="string" required>
  内容翻译的目标语言。必须为小写。

  **允许的值 (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`, `punjabi`, `romanian`, `russian`, `serbian`, `slovak`, `slovenian`, `spanish`, `swahili`, `swedish`, `tagalog`, `tamil`, `telugu`, `thai`, `turkish`, `ukrainian`, `urdu`, `vietnamese`, `welsh`, `yoruba`, `zulu`
</ParamField>

<ParamField body="originalLanguage" type="string">
  使用 ISO 语言代码（例如 `en`, `es`, `fr`, `de`, `ja`, `zh`）表示的内容源语言。

  <Warning>
    **强烈建议：留空以进行自动检测。**

    仅当您 100% 确定语言代码正确且符合有效 ISO 格式时，才提供此参数。错误的语言代码会导致转录失败。我们的自动检测功能支持 80 多种语言，且准确度极高。
  </Warning>

  **默认值：** `auto-detect`
</ParamField>

<ParamField body="projectName" type="string">
  项目的自定义名称。有助于在您的仪表板中识别项目。

  **默认值：** 如果未提供，将使用项目 ID。
</ParamField>

<ParamField body="webhookUrl" type="string">
  一个用于接收此项目 [webhook 事件](/docs/zh/api-reference/webhooks) 的 https 端点，
  它将覆盖您账户上配置的端点。

  **默认值：** 配置后的账户 webhook 端点。
</ParamField>

<ParamField body="numberOfSpeakers" type="string">
  `auto-detect` 或从 `1` 到 `32` 的整数。已知的说话人数量可以改善说话人日志记录（diarization）。

  **默认值：** `auto-detect`
</ParamField>

<ParamField body="brandVocabulary" type="string">
  一个包含特定于请求的名称、品牌、首字母缩略词或专业术语的 JSON 字符串数组。这些术语将与保存的账户或团队词汇表合并。
</ParamField>

<ParamField body="removeFillerWords" type="boolean">
  在翻译前从源转录文本中删除常见的填充词。

  **默认值：** `true`
</ParamField>

<ParamField body="sourceSrt" type="string">
  现有的源语言 SRT 转录文件。提供此字段时，必须明确指定 `originalLanguage`。
</ParamField>

<ParamField body="keepBackgroundMusic" type="boolean">
  是否在输出中保留背景音频。

  启用后，将保留背景音乐、环境音、笑声、掌声和人群声音，同时仅移除原始人声（音轨分离）。如果您的源文件没有背景音频，请关闭此项。

  **默认值：** `true`
</ParamField>

<ParamField body="keepOriginalVoice" type="boolean">
  在翻译后的语音下方保留原始说话人的声音，并调低音量。

  **默认值：** `false`
</ParamField>

<ParamField body="originalVoiceVolume" type="number">
  当启用 `keepOriginalVoice` 时，原始语音的音量范围从 `1` 到 `70`。

  **默认值：** `30`
</ParamField>

<ParamField body="voiceIsolatorOption" type="string">
  当启用 `keepBackgroundMusic` 时的语音隔离模式。控制语音分离的质量和特性。

  <Accordion title="录音室（推荐）">
    我们默认的语音处理方式，专为专业音频质量设计：

    * 消除回声和混响
    * 清除技术瑕疵
    * 产生清晰、干脆的语音

    **推荐用于：** 大多数对音频质量要求极高的项目。非常适合教程、教育内容、营销视频以及任何需要最佳语音清晰度的内容。
  </Accordion>

  <Accordion title="真实感">
    保留录音环境的自然特征：

    * 保持更接近原始录音的声音
    * 保留环境特征

    **推荐用于：** 环境真实感很重要的内容，例如户外 Vlog、纪录片或声音氛围是体验不可或缺一部分的内容。

    <Warning>由于保留了背景元素，此选项在某些情况下可能会产生伪影或意外效果。</Warning>
  </Accordion>

  **允许的值：** `studio`, `realistic`

  **默认值：** `studio`
</ParamField>

<ParamField body="subtitles" type="boolean">
  是否为翻译后的视频生成字幕。

  启用后，将添加简洁的 Netflix 风格黑白字幕。使用 `subtitlesSource` 选择原始（源语言）或翻译（目标语言）文本。字幕会自动同步以获得最佳可读性。

  **注意：** 硬编码字幕需要 FFmpeg 和 `subtitles` 滤镜 (libass)。如果不可用，API 将回退到嵌入字幕轨道，而不是使用硬编码样式。

  **默认值：** `false`
</ParamField>

<ParamField body="subtitlesSource" type="string">
  当 `subtitles` 启用时，选择字幕文本来源。

  **允许的值：** `translated`, `original`

  **默认值：** `translated`

  **注意：** 如果选择了 `original` 但原始转录不可用，字幕将回退到 `translated`。
</ParamField>

<ParamField body="lipSyncMode" type="string">
  在翻译完成后触发口型同步处理。

  * `standard` = Lip Sync
  * `pro` = Lip Sync Pro
  * `studio` = Lip Sync Studio

  高级模式强制执行其正常的套餐、时长和点数要求。

  **默认值：** 省略该字段以跳过口型同步。
</ParamField>

<ParamField body="activeSpeakerDetectionEnabled" type="boolean">
  为请求的口型同步运行启用活跃发言者检测。

  **默认值：** `false`
</ParamField>

<ParamField body="lipsyncPro" type="boolean">
  保留旧版口型同步选择器以实现向后兼容。

  * `false` = 标准口型同步（**每 1 分钟视频消耗 4 分钟点数**）
  * `true` = Lip Sync Pro（**每 1 分钟视频消耗 9 分钟点数**）

  Lip Sync Pro 从 Creator 套餐开始提供。

  <Warning>
    **最大时长：** 每个视频 30 分钟。

    **延迟：** 口型同步处理通常会增加原始视频时长 **2 倍至 4 倍**的时间。
  </Warning>

  <Info>
    API 触发的请求不会发送口型同步完成和失败的电子邮件。请使用 [状态端点](/docs/zh/api-reference/translation-status) 来
    跟踪进度。
  </Info>

  **默认值：** 未启用（省略该字段以跳过口型同步）

  **表单数据：** 将布尔值作为 `true` 或 `false` 字符串发送（例如，`-F "lipsyncPro=false"`）。

  <Warning>不要将 `lipsyncPro` 与冲突的 `lipSyncMode` 结合使用。</Warning>
</ParamField>

<ParamField body="voiceMode" type="string">
  语音策略：`cloning` 或 `custom`。

  **默认值：** `cloning`
</ParamField>

<ParamField body="voiceId" type="string">
  当 `voiceMode` 为 `custom` 时必填。该语音必须属于有效的项目所有者。任意或无主的语音 ID 将被拒绝。
</ParamField>

<ParamField body="voiceCloningSettings" type="object">
  微调语音克隆参数，以实现对生成语音的高级控制。使用表单数据时，请作为 JSON 字符串传递。所有值必须介于 0 和 1 之间（步长为 0.01）。

  <Info>这些设置仅在 `voiceMode` 为 `cloning` 时适用。</Info>

  <Expandable title="voiceCloningSettings 属性">
    <ParamField body="stability" type="number" default="0.60" placeholder="0.60">
      **语音稳定性 (0.00 - 1.00)**

      确定语音的稳定性以及每次生成之间的随机性。

      * **较低的值**允许更广泛的情感范围，但可能导致奇怪或仓促的语音
      * **较高的值**产生更一致的输出，但听起来可能单调

      **默认值：** `0.60`

      **提示：** 为避免重现口音，请使用 `0.80`
    </ParamField>

    <ParamField body="similarity" type="number" default="0.85" placeholder="0.85">
      **语音相似度 (0.00 - 1.00)**

      控制 AI 对原始语音的贴合程度。

      * **较高的值**使克隆的语音与原始语音更相似
      * 如果原始音频有噪音且相似度过高，伪影或背景噪音可能会带入生成的语音中

      **默认值：** `0.85`

      **提示：** 为避免重现口音，请使用 `0.20`
    </ParamField>

    <ParamField body="speakerBoost" type="number" default="0.60" placeholder="0.60">
      **发言者增强 (0.00 - 1.00)**

      增强与原始发言者的相似度。这是一种微妙的增强，增加了与源语音的相似性。

      **注意：** 较高的值会增加计算时间和延迟。

      **默认值：** `0.60`

      **提示：** 为避免重现口音，请使用 `0.00`
    </ParamField>
  </Expandable>

  **默认值（平衡）：**

  ```json theme={null}
  {
    "stability": 0.6,
    "similarity": 0.85,
    "speakerBoost": 0.6
  }
  ```

  **建议用于避免重现口音：**

  ```json theme={null}
  {
    "stability": 0.8,
    "similarity": 0.2,
    "speakerBoost": 0.0
  }
  ```
</ParamField>

<ParamField body="translationTimeSkips" type="string">
  一个应保持原始语言的源时间范围的 JSON 数组。

  ```json theme={null}
  [
    { "startTime": 10.2, "endTime": 12.8 }
  ]
  ```

  时间跳过需要视频输入和 `keepBackgroundMusic=true`。它们不能与 `keepOriginalVoice` 结合使用，也不能与转录片段重叠。
</ParamField>

## 响应

<ResponseField name="success" type="boolean" required>
  成功请求始终为 `true`
</ResponseField>

<ResponseField name="message" type="string" required>
  描述结果的人类可读消息
</ResponseField>

<ResponseField name="projectId" type="string" required>
  已创建翻译项目的唯一标识符。使用此 ID 检查状态。
</ResponseField>

<ResponseField name="estimatedDuration" type="number" required>
  粗略的处理时间估算（以分钟为单位）。目前的估算标准是每 1 分钟源媒体处理需要 5 分钟。
</ResponseField>

## 示例

<Info>
  来自有效账户或团队的已保存术语表规则和自定义翻译指令将自动应用。
</Info>

<CodeGroup>
  ```bash cURL theme={null}
  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"
  ```

  ```typescript TypeScript theme={null}
  interface StartTranslationResponse {
    success: boolean;
    message: string;
    projectId: string;
    estimatedDuration: number;
  }

  interface VoiceCloningSettings {
    stability: number; // 0.00 - 1.00
    similarity: number; // 0.00 - 1.00
    speakerBoost: number; // 0.00 - 1.00
  }

  interface StartTranslationRequest {
    targetLanguage: string;
    originalLanguage?: string;
    projectName?: string;
    numberOfSpeakers?: 'auto-detect' | string;
    brandVocabulary?: string[];
    removeFillerWords?: boolean;
    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;
      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?.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,
        speakerBoost: 0.6,
      },
    });
    console.log('Project ID:', result.projectId);
  }
  ```

  ```javascript JavaScript theme={null}
  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,
      speakerBoost: 0.6,
    }),
  );

  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);
  ```

  ```python Python theme={null}
  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,
          'speakerBoost': 0.60
      })
  }
  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 PHP theme={null}
  <?php
  $curl = curl_init();

  $voiceCloningSettings = json_encode([
      'stability' => 0.60,
      'similarity' => 0.85,
      'speakerBoost' => 0.60
  ]);

  $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'];
  ```
</CodeGroup>

## 响应示例

```json theme={null}
{
  "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 | `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 | `API_ACCESS_REQUIRED`                           | 此账户需要 API 访问权限                   |
| 403 | `SUBSCRIPTION_REQUIRED`                         | API 访问需要付费订阅                     |
| 403 | `INSUFFICIENT_CREDITS`                          | 积分不足以处理此文件                       |
| 403 | `CUSTOM_VOICE_ACCESS_DENIED`                    | 自定义语音不属于有效的项目所有者                 |
| 403 | `LIPSYNC_MODE_ACCESS_DENIED`                    | 当前套餐不支持高级口型同步模式                  |
| 429 | `RATE_LIMIT_EXCEEDED`                           | 请求过多（限制：每分钟 10 个请求）              |
| 429 | `CONCURRENT_TRANSLATION_LIMIT_REACHED`          | 正在进行的翻译过多（限制：10 个并发翻译）           |
