面向配音视频的口型同步 API

支持 135 种以上的语言和地区选项,让视频口型与配音完美契合。通过 API 为视频配音,对结果运行口型同步,即可下载说话者口型与新台词对上的视频。系统会先进行人脸检测。口型同步按完整视频生成单独计费(包括编辑后的重新生成)。
免费预览一分钟
屏幕上的多张面孔
REST + Python SDK
check, preview, sync
OAuth 2.0
# 1. on a dubbed project: confirm the video has a face (runs once, usually automatically)
curl https://api.rask.ai/v2/projects/$ID/lipsync \
  -H "Authorization: Bearer $TOKEN"
#  "check_face_task_status": "done", "video_has_face": true

# 2. preview one free minute of lip-sync
curl -X PUT https://api.rask.ai/v2/projects/$ID/lipsync \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"is_multiple_speakers": true, "is_free_lipsync": true}'

# 3. lip-sync the full video - billed separately from dubbing
curl -X PUT https://api.rask.ai/v2/projects/$ID/lipsync \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"is_multiple_speakers": true, "is_free_lipsync": false}'
GET /v2/projects/{project_id}/lipsync
polling, 15s
# Poll until lipsync_task_status is done, then download lipsync_result_path
while :; do
  curl -s https://api.rask.ai/v2/projects/$ID/lipsync -H "Authorization: Bearer $TOKEN" \
    | jq '{lipsync_task_status, lipsync_task_progress, tasks_in_lipsync_queue}'
  sleep 15
done
受到全球团队的信赖
功能特性

口型同步 API 的所有功能

为你的配音视频添加口型同步。检测可见人脸,使用账户的免费预览分钟数(如有),并通过 API 跟踪进度。每次生成完整视频的口型同步时,费用与配音分开单独计算。

翻译视频的口型同步

在项目已翻译的视频中,让口型与配音保持一致,支持包含 135 种以上语言和地区选项的庞大资料库。

自动人脸检测

在口型同步之前,人脸检测任务会确认视频中至少包含一张人脸。该任务每个项目通常独立运行一次,让你在消耗时长之前就能了解结果。

屏幕上的多个人物面孔

对于采访、圆桌讨论和多说话者对话,请将 is_multiple_speakers 设置为 true。如果屏幕上同时只有一个人脸,请将其设为 false 以加快处理速度。

一分钟免费预览

每个账户都可获得一分钟的免费口型同步时长。在自己的素材上使用 is_free_lipsync 运行它,并在同步完整视频之前检查效果。

每次生成单独计费

完整视频的每一次口型同步生成都与配音分开计费。修改脚本或声音后,重新为项目配音,并生成带有新口型同步费用的新同步版本。

排队位置与进度

口型同步信息端点会返回排在你前面的任务数量以及从 0 到 100 的进度,让你的用户实时看到进展。

与面孔相配的声音

口型同步适用于项目中说话者使用的任何声音:他们的克隆声音或人工智能声音预设。

编辑、重新配音、重新同步

更改文本、时间或声音,重新为项目配音,然后在新的版本上再次运行口型同步。人脸检测无需再次运行。

无限扩展

无速率限制、无并发配额、无单密钥限流。为你的整个目录发送口型同步任务,排队位置会告诉你每个任务的当前状态。
查看实际效果

从语音配音到匹配唇部动作

同一个剪辑被配音成法语、德语、葡萄牙语和西班牙语。在这样的配音项目中,唇形同步功能会根据新的语音调整嘴唇的位置。
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
工作流程

从配音视频到唇形同步视频只需三步

唇形同步功能适用于已经完成配音的项目。编辑后,使用 /generate 端点重新配音,然后再次同步唇形。
1

给视频配音

上传视频或发送公开网址,创建包含目标语言的项目并等待 merging_done。唇形同步需要此项目的 translated_video。

POST /v2/projects
2

检查人脸

人脸检查任务用于确认视频中至少有一个人脸,通常会自动开始。如果未开始,请手动运行一次该项目。

PUT /v2/projects/{id}/check_face
3

运行唇形同步并下载

运行唇形同步任务,跟踪 lipsync_task_progress 从 0 到 100 的进度,然后从 lipsync_result_path 下载视频。

PUT /v2/projects/{id}/lipsync
处理时间取决于视频长度和唇形同步队列。唇形同步信息端点会显示排在你前面的任务数量。
为您量身打造

特殊情况需要唇形同步?联系我们的团队

更高的吞吐量、处理优先级、您专属的交付方式:当唇形同步集成需要公共目录之外的功能时,我们的团队会评估您的需求和可用选项。

语言与声音

需要公开目录之外的语言或声音?请与我们的团队讨论您的需求和可行选项。

交付与集成

Webhook、推送到您自己的队列、直接交付到您的 S3、自定义端点。告诉我们您的流水线需要哪种对接方式。

批量与处理量

批量大小、每个操作的目标语言以及处理优先级均为合同条款,而非固定的产品限制。

安全与托管

数据驻留、SSO 和 SAML、保留规则以及安全审查支持均作为企业入驻流程的一部分进行处理。
用例

谁在使用唇形同步 API

内置视频的平台

学习管理系统与客户教育平台、创作者与视频平台、网络研讨会与虚拟活动工具、视频托管与工作流 SaaS、数字采用平台、直播购物。为您的用户和创作者托管的视频添加唇形同步配音,让翻译后的出镜人员在屏幕上看起来自然,使唇形同步成为您产品的一项高级功能。

本地化和制作机构

在配音之外,将唇形同步作为单独的产品交付。如果账户有免费预览时长,请先用来评估效果。在给客户的报价中包含完整视频的唇形同步生成费用以及审核后的任何后续生成费用。

企业内部持续视频制作

国际零售与电商、全球连锁品牌、媒体出版商、企业大学。对于面部充满屏幕的营销、培训和高管视频,唇形同步可让翻译后的语音在各个市场都与镜头前的演讲者完美匹配。
客户案例

真正的团队,可衡量的成果

用数据了解各大公司如何通过Rask进行视频本土化。
箭头
箭头
代码

唇形同步 API 代码示例

在已完成配音的项目中,每种语言提供一个完整的示例:检查人脸、运行唇形同步、跟踪进度并下载结果。
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas

PROJECT_ID = "..."   # a project with status merging_done

async def main():
    client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)

    info = await client.get_lipsync_info(project_id=PROJECT_ID)
    if info.check_face_task_status is not enums.LipsyncStatus.DONE:
        await client.run_check_face_task(project_id=PROJECT_ID)
        while (info := await client.get_lipsync_info(project_id=PROJECT_ID)).check_face_task_status is not enums.LipsyncStatus.DONE:
            await asyncio.sleep(10)
    if not info.video_has_face:
        raise SystemExit("No face found - lip-sync is not available for this video")

    await client.run_lipsync_task(project_id=PROJECT_ID,
        data=schemas.LipsyncTaskData(is_multiple_speakers=True, is_free_lipsync=False))

    while (info := await client.get_lipsync_info(project_id=PROJECT_ID)).lipsync_task_status is not enums.LipsyncStatus.DONE:
        print(info.lipsync_task_progress, info.tasks_in_lipsync_queue)
        await asyncio.sleep(15)

    print(info.lipsync_result_path)

asyncio.run(main())
github.com/braskai/rask-sdk
async, typed models
import time, requests

AUTH = "https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token"
URL  = f"https://api.rask.ai/v2/projects/{PROJECT_ID}"   # a dubbed project

token = requests.post(AUTH, auth=(CLIENT_ID, CLIENT_SECRET),
                      data={"grant_type": "client_credentials"}).json()["access_token"]
h = {"Authorization": f"Bearer {token}"}

info = requests.get(f"{URL}/lipsync", headers=h).json()
if info["check_face_task_status"] != "done":
    requests.put(f"{URL}/check_face", headers=h)
    while (info := requests.get(f"{URL}/lipsync", headers=h).json())["check_face_task_status"] != "done":
        time.sleep(10)
assert info["video_has_face"], "No face found"

requests.put(f"{URL}/lipsync", headers=h,
             json={"is_multiple_speakers": True, "is_free_lipsync": False})

while (info := requests.get(f"{URL}/lipsync", headers=h).json())["lipsync_task_status"] not in ("done", "failed"):
    time.sleep(15)

print(info["lipsync_task_status"], info["lipsync_result_path"])
requests + polling
no SDK required
// no dependencies, Node 18+ global fetch - PROJECT_ID is a dubbed project
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const auth = await fetch('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token', {
  method: 'POST',
  headers: { Authorization: 'Basic ' + btoa(`${CLIENT_ID}:${CLIENT_SECRET}`) },
  body: new URLSearchParams({ grant_type: 'client_credentials' }),
}).then((r) => r.json());
const h = { Authorization: `Bearer ${auth.access_token}`, 'Content-Type': 'application/json' };
const url = `https://api.rask.ai/v2/projects/${PROJECT_ID}`;
const info = () => fetch(`${url}/lipsync`, { headers: h }).then((r) => r.json());

let i = await info();
if (i.check_face_task_status !== 'done') {
  await fetch(`${url}/check_face`, { method: 'PUT', headers: h });
  while ((i = await info()).check_face_task_status !== 'done') await sleep(10000);
}
if (!i.video_has_face) throw new Error('No face found');

await fetch(`${url}/lipsync`, {
  method: 'PUT', headers: h,
  body: JSON.stringify({ is_multiple_speakers: true, is_free_lipsync: false }),
});

while (!['done', 'failed'].includes((i = await info()).lipsync_task_status)) {
  console.log(i.lipsync_task_progress, i.tasks_in_lipsync_queue);
  await sleep(15000);
}
console.log(i.lipsync_result_path);
fetch, Node 18+
plain HTTP
# 1. token (valid 1 hour - cache and reuse it)
TOKEN=$(curl -s -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
  -u "$CLIENT_ID:$CLIENT_SECRET" -d "grant_type=client_credentials" | jq -r .access_token)

# 2. face check on the dubbed project - start it only if it has not run yet
curl -s https://api.rask.ai/v2/projects/$ID/lipsync -H "Authorization: Bearer $TOKEN" \
  | jq '{check_face_task_status, video_has_face}'
curl -s -X PUT https://api.rask.ai/v2/projects/$ID/check_face -H "Authorization: Bearer $TOKEN"

# 3. run lip-sync (set is_free_lipsync to true for the free preview minute)
curl -s -X PUT https://api.rask.ai/v2/projects/$ID/lipsync \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"is_multiple_speakers": true, "is_free_lipsync": false}'

# 4. follow progress, then download the result
curl -s https://api.rask.ai/v2/projects/$ID/lipsync -H "Authorization: Bearer $TOKEN" \
  | jq '{lipsync_task_status, lipsync_task_progress, lipsync_result_path}'
PUT /v2/projects/{id}/lipsync
OAuth 2.0 client credentials
<?php
use GuzzleHttp\Client;

$http = new Client(['base_uri' => 'https://api.rask.ai']);
$json = fn($r) => json_decode($r->getBody(), true);
$auth = $json((new Client)->post('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token',
    ['auth' => [$clientId, $clientSecret], 'form_params' => ['grant_type' => 'client_credentials']]));
$h = ['Authorization' => 'Bearer ' . $auth['access_token']];
$info = fn() => $json($http->get("/v2/projects/$projectId/lipsync", ['headers' => $h]));

$i = $info();
if ($i['check_face_task_status'] !== 'done') {
    $http->put("/v2/projects/$projectId/check_face", ['headers' => $h]);
    while (($i = $info())['check_face_task_status'] !== 'done') sleep(10);
}
if (!$i['video_has_face']) exit('No face found');

$http->put("/v2/projects/$projectId/lipsync", ['headers' => $h,
    'json' => ['is_multiple_speakers' => true, 'is_free_lipsync' => false]]);

while (!in_array(($i = $info())['lipsync_task_status'], ['done', 'failed'])) sleep(15);
echo $i['lipsync_result_path'];
Guzzle 7
plain HTTP
Python是官方SDK。Node、PHP和cURL标签页是针对相同端点的纯HTTP示例。
进度

唇形同步任务如何报告进度

唇形同步信息端点会报告人脸检查、任务状态、队列位置以及从 0 到 100 的进度。您只需关注三组信息。

成功,在此停止

lipsync_task_status: done
lipsync_task_progress: 100
唇形同步已完成。下载链接位于 lipsync_result_path 中。

进行中,继续轮询

check_face_task_status: started
lipsync_task_status: started
lipsync_task_progress: 0-99
tasks_in_lipsync_queue
当进度为空时,任务正在排队: tasks_in_lipsync_queue 显示前方还有多少任务。

失败,停止并报告

lipsync_task_status: failed
check_face_task_status: failed
video_has_face: false
没有可见人脸的视频无法进行唇形同步。如果任务失败,请提供以下信息联系客服: project_id.
Lip-sync task, as GET /lipsync reports it
GET /v2/projects/{project_id}/lipsync
check face     check_face_task_status  done     video_has_face  true
queued         lipsync_task_status     started  tasks_in_lipsync_queue  2
processing     lipsync_task_progress   0 → 50 → 100
complete       lipsync_task_status     done
               lipsync_result_path     https://...

或者完全跳过轮询

只需将网址指向您的Webhook端点,每个状态变化都会以POST请求的形式发送,让您的队列在变化发生的瞬间做出反应。Webhook投递是企业版入驻服务的一部分。
阅读文档
preserveAspectRatio="xMidYMid meet" aria-hidden="true" role="img">
输出

同步唇形的视频、配音和字幕

从 lipsync_result_path 下载生成的视频。该项目保留了未同步唇形的配音视频、SRT和VTT格式的翻译字幕,符合条件的套餐还提供单独的翻译语音音轨。
字段
格式
说明
lipsync_result_path
MP4
口型同步的视频,随时可发布
voiceover
WAV
仅翻译语音,供您自行混音
translated_audio
WAV
翻译后的语音与原始背景音频的混合音
translation_srt_path
.srt
目标语言字幕
translation_vtt_path
.vtt
与 WebVTT 相同的字幕,适用于网页播放器
translated_video
MP4
未同步唇形的配音视频,便于对比
控制

编辑配音,然后生成更新的口型同步版本

更改文本、时间或声音后,重新为更改的片段配音,并为更新后的视频生成口型同步。重新配音和每次生成新的完整视频口型同步将分别计费。

片段级编辑

片段级编辑
编辑单个转写片段并重新为更改的台词配音。若要更新唇部动作,请为整个视频生成新的口型同步;这需要单独计费。
获取文字记录及其片段
修改源文本,我们将重新翻译
直接修改翻译后的文本以保留您自己的措辞
调整时间戳、添加片段、删除片段
重新指定分配给任何发言者的声音

术语词汇表

术语词汇表
添加词汇表,确保品牌名称和专业术语在每个配音中保持一致的发音,并且口型同步遵循相同的措辞。

一个词汇表涵盖一对语言,并适用于该目标语言的所有区域变体,因此一个西班牙语词汇表即可服务于 es-mx 和 es-es 类似项目。项目记录 glossary_version,因此后续的修改绝不会悄悄改变已完成的工作。
输入

支持的文件格式

上传七种视频格式中的任意一种,或发送公开链接。纯音频文件屏幕上没有面部,因此口型同步仅适用于视频格式。

视频

7种格式
.mp4
.mov
.mkv
.avi
.webm
.m4v
.3gp

音频

4种格式
.mp3
.wav
.flac
.m4a

消费前查看元数据

媒体端点返回时长、文件大小、视频编解码器、帧率、分辨率、音频编解码器、采样率和声道布局。提前验证文件并估算成本,因为配音和口型同步均按视频长度的分钟数计费。
安全与合规

安全处理面部和声音

Brask Inc 拥有 SOC 2 Type II 认证并在 GDPR 下运营,同时在其信任中心发布实时控制状态。带有面部和声音的视频均在封闭的人工智能环境中处理。

认证

SOC 2 Type II
GDPR
CAI 和 C2PA 成员

加密

传输中使用 TLS 1.2
静态使用 AES-256
SSE-S3 托管密钥
密钥至少每 12 个月轮换一次

您的内容

封闭的人工智能环境
绝不用于训练通用模型
支持完整导出,绝不绑定

访问

单点登录和SAML
基于角色的访问控制
OAuth 2.0客户端凭证

企业

数据驻留选项
自定义SLA
专属客户经理

声音权益

拥有使用权的合成声音
基于授权的声音克隆
人工智能安全控制,人工参与把关
对比

Rask API 与您自己构建的口型同步管道对比

独立的口型同步 API 需要目标语言的成品音轨。Rask 在一个项目中即可生成配音音轨并同步口型。以下是采用两种方式组装的相同结果。
您需要什么
Rask API
从零散部件拼凑
用于同步的翻译音轨
由同一项目创建
首先进行转写、翻译和语音供应商处理
付款前进行面部检查
自动,每个项目一次
您自己的面部检测步骤
屏幕上的多个人物面孔
is_multiple_speakers: true
您自己构建和调整的逐个人脸追踪
完整运行前预览
每个账户赠送一分钟免费时长
每次测试运行都要付费
修改脚本后重新同步
生成全新的完整视频口型同步,单独计费
整个文件需再次付费
背景音乐和音效
在新声音下保留
由您自行构建的音源分离步骤
.srt 和 .vtt 格式字幕
包含
根据您自己的时间数据生成
队列可见性
队列位置和进度 0-100
供应商提供的内容
速率限制
无
无论您的供应商有多严格
账单
按完整视频口型同步生成次数计费
按运行次数、按供应商计费
常见问题解答

口型同步 API:常见问题

找不到您要找的内容?请联系销售部门。

有口型同步 API 吗?

我可以不先配音就直接进行口型同步吗?

我可以使用自己的音频轨道进行口型同步吗?

API 可以根据图片或提示词生成会说话的虚拟形象吗?

视频进行口型同步需要满足什么条件?

口型同步如何计费?

是否有免费的口型同步预览?

口型同步支持多个说话者吗?

如何跟踪口型同步的进度?

口型同步需要多长时间?

编辑配音后会发生什么?

如果口型同步失败了怎么办?

如何获取API访问权限和API密钥?

在一个下午内开始配音

今天就发出您的第一个请求,如果您需要大批量合作条款或其他人没有的语言,请与我们联系。