Skip to content

视频翻译

使用说明

视频翻译用于将已有视频翻译并合成为目标语言版本。接口会自动识别源视频语言,完成转写、翻译、目标语言配音、时间轴规划、可选唇形驱动和字幕合成。

使用流程

  1. 准备源视频。上传本地视频时,先通过 文件管理 获取上传地址,servicevideo_translation,上传完成后使用返回的 file_id;也可以使用当前 OpenAPI 应用下已完成的视频任务 ID 作为 video_id
  2. 调用 获取目标语言列表,取得 target_languages 可传的语言编码。
  3. 调用 创建视频翻译任务source.file_idsource.video_id 二选一,target_languages 传入目标语言。
  4. 任务创建成功后接口会返回视频翻译任务 ID 和目标语言对应的视频任务 ID。使用 data.tasks[].language_task_id 调用 获取视频详情 查询进度和成片地址。

源视频要求

项目要求
上传用途service=video_translation
文件格式mp4mov
文件大小不超过 1GB
视频时长不超过 120 分钟
视频尺寸宽高必须大于 0,且宽高均不超过 4096
来源限制file_id 必须属于当前 OpenAPI 应用;video_id 必须是当前 OpenAPI 应用下已完成且有成片地址的视频任务,且不能是来自视频翻译的任务

获取目标语言列表

说明

获取视频翻译支持的目标语言列表。创建视频翻译任务时,target_languages 传本接口返回的 language_code

请求地址

http
GET /open/v1/video_translation/target_languages
http
access_token: {{access_token}}

请求参数

无。

响应示例

json
{
  "trace_id": "a55f1ab65ad856106463d85cf24b2eb9",
  "code": 0,
  "msg": "success",
  "data": {
    "languages": [
      {
        "language_code": "english",
        "name": "英语"
      },
      {
        "language_code": "japanese",
        "name": "日语"
      }
    ]
  }
}

响应字段说明

字段说明
code响应状态码
msg响应信息
trace_id请求链路追踪 ID
data.languages支持的目标语言列表
data.languages[].language_code创建任务时 target_languages 传入的值
data.languages[].name语言中文名称

响应状态码说明

code说明
0响应成功
10400AccessToken 验证失败
40000参数错误
50000系统内部错误

示例代码

shell
curl --location --request GET 'https://open-api.chanjing.cc/open/v1/video_translation/target_languages' \
--header 'access_token: {{access_token}}'
go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	url := "https://open-api.chanjing.cc/open/v1/video_translation/target_languages"
	method := "GET"

	client := &http.Client{}
	req, err := http.NewRequest(method, url, nil)
	if err != nil {
		fmt.Println(err)
		return
	}
	req.Header.Add("access_token", "{{access_token}}")

	res, err := client.Do(req)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer res.Body.Close()

	body, err := io.ReadAll(res.Body)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(body))
}
java
OkHttpClient client = new OkHttpClient().newBuilder().build();
Request request = new Request.Builder()
  .url("https://open-api.chanjing.cc/open/v1/video_translation/target_languages")
  .method("GET", null)
  .addHeader("access_token", "{{access_token}}")
  .build();
Response response = client.newCall(request).execute();
py
import requests

url = "https://open-api.chanjing.cc/open/v1/video_translation/target_languages"
headers = {
  'access_token': '{{access_token}}'
}

response = requests.request("GET", url, headers=headers)
print(response.text)

创建视频翻译任务

说明

异步任务接口,用于提交 OpenAPI 视频翻译任务。接口支持本地上传视频或已有开放平台视频作为来源。

请求地址

http
POST /open/v1/video_translation/create

Header

http
access_token: {{access_token}}
Content-Type: application/json

请求参数 Body

json
{
  "source": {
    "file_id": "e284db4d95de4220afe78132158156b5",
    "video_id": "",
    "title": "商品讲解视频"
  },
  "target_languages": ["english"],
  "audio_id": "",
  "need_lip_sync": true,
  "need_dynamic_duration": true,
  "need_subtitle": true
}

参数说明

字段类型是否必传示例说明
sourceobject视频来源配置
source.file_idstringe284db4d95de4220afe78132158156b5上传源视频得到的文件 ID;与 source.video_id 二选一
source.video_idstring1976538431040819200已有开放平台视频任务 ID;与 source.file_id 二选一
source.titlestring商品讲解视频视频名称,最长 50 个字符
target_languagesarray<string>["english"]目标语言数组,使用语言列表接口返回的 language_code
audio_idstringC-Audio-xxxxxxxx输出音色 ID;为空表示使用原视频声音,非空时使用传入的公共声音或定制音色
need_lip_syncbooltrue是否生成目标语言唇形同步效果,默认 false
need_dynamic_durationbooltrue是否允许根据目标语言语速动态调整视频时长,默认 false
need_subtitlebooltrue是否在结果视频中合成目标语言字幕,默认 false

注意

source.file_idsource.video_id 必须且只能传一个。上传源视频时,文件管理接口的 service 必须传 video_translation

响应示例

json
{
  "trace_id": "96afa792520b0e6a86d72e89435bc0a7",
  "code": 0,
  "msg": "success",
  "data": {
    "id": "e284db4d95de4220afe78132158156b5",
    "tasks": [
      {
        "language_task_id": "1976538431040819200",
        "target_language": "english"
      }
    ]
  }
}

响应字段说明

字段说明
code响应状态码
msg响应信息
trace_id请求链路追踪 ID
data.id视频翻译任务 ID
data.tasks目标语言对应的视频任务列表
data.tasks[].language_task_id视频任务 ID,可用于视频详情接口查询进度和结果
data.tasks[].target_language目标语言

响应状态码说明

code说明
0响应成功
400传入参数格式错误
10400AccessToken 验证失败
40000参数错误
40001超出 QPS 限制
50000系统内部错误
170002源视频不可用,请重新选择
170003翻译语言配置不正确
170006上传视频不可用,请重新上传
170008所选声音不可用,请重新选择
170009视频时长超出限制
170010视频大小超出限制

示例代码

shell
curl --location --request POST 'https://open-api.chanjing.cc/open/v1/video_translation/create' \
--header 'access_token: {{access_token}}' \
--header 'Content-Type: application/json' \
--data-raw '{
  "source": {
    "file_id": "e284db4d95de4220afe78132158156b5",
    "video_id": "",
    "title": "商品讲解视频"
  },
  "target_languages": ["english"],
  "audio_id": "",
  "need_lip_sync": true,
  "need_dynamic_duration": true,
  "need_subtitle": true
}'
go
package main

import (
	"fmt"
	"io"
	"net/http"
	"strings"
)

func main() {
	url := "https://open-api.chanjing.cc/open/v1/video_translation/create"
	method := "POST"

	payload := strings.NewReader(`{
  "source": {
    "file_id": "e284db4d95de4220afe78132158156b5",
    "video_id": "",
    "title": "商品讲解视频"
  },
  "target_languages": ["english"],
  "audio_id": "",
  "need_lip_sync": true,
  "need_dynamic_duration": true,
  "need_subtitle": true
}`)

	client := &http.Client{}
	req, err := http.NewRequest(method, url, payload)
	if err != nil {
		fmt.Println(err)
		return
	}
	req.Header.Add("access_token", "{{access_token}}")
	req.Header.Add("Content-Type", "application/json")

	res, err := client.Do(req)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer res.Body.Close()

	body, err := io.ReadAll(res.Body)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(body))
}
java
OkHttpClient client = new OkHttpClient().newBuilder().build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n  \"source\": {\n    \"file_id\": \"e284db4d95de4220afe78132158156b5\",\n    \"video_id\": \"\",\n    \"title\": \"商品讲解视频\"\n  },\n  \"target_languages\": [\"english\"],\n  \"audio_id\": \"\",\n  \"need_lip_sync\": true,\n  \"need_dynamic_duration\": true,\n  \"need_subtitle\": true\n}");
Request request = new Request.Builder()
  .url("https://open-api.chanjing.cc/open/v1/video_translation/create")
  .method("POST", body)
  .addHeader("access_token", "{{access_token}}")
  .addHeader("Content-Type", "application/json")
  .build();
Response response = client.newCall(request).execute();
py
import requests
import json

url = "https://open-api.chanjing.cc/open/v1/video_translation/create"

payload = json.dumps({
  "source": {
    "file_id": "e284db4d95de4220afe78132158156b5",
    "video_id": "",
    "title": "商品讲解视频"
  },
  "target_languages": ["english"],
  "audio_id": "",
  "need_lip_sync": True,
  "need_dynamic_duration": True,
  "need_subtitle": True
})
headers = {
  'access_token': '{{access_token}}',
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)