适用于配音视频的唇形同步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 的进度,让您的用户直观看到处理进度。

与面部相匹配的声音

唇形同步适用于项目为说话人使用的任何声音:克隆的声音或AI声音预设。

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

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

无限扩展

没有速率限制、没有并发配额、没有单密钥限流。您可以为整个视频库发送唇形同步任务,队列位置会告知您每个任务的进展状态。
查看实际效果

从配音到匹配唇动

同一个片段被配音成法语、德语、葡萄牙语和西班牙语。在这样的配音项目中,唇形同步会将嘴唇的位置调整为新的语音。
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
处理时间取决于视频长度和唇形同步队列。唇形同步信息端点显示您前面还有多少任务。
以您为中心

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

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

语言和声音

需要公开目录之外的语言或声音?请将您的需求和可用选项告诉我们的团队。

交付与集成

网络钩子(Webhooks)、推送到您自己的队列、直接交付到您的S3、自定义端点。告诉我们您的流水线需要什么样的数据输入方式。

数据量与吞吐量

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

安全与托管

数据驻留、单点登录与SAML、保留规则以及安全审查支持均作为企业版入驻流程的一部分来处理。
用例

谁在使用唇形同步 API

内置视频的平台

学习管理系统(LMS)和客户教育平台、创作者与视频平台、网络研讨会与虚拟活动工具、视频托管与工作流 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
当进度为空(null)时,任务正在排队: 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 规范下运营,其信任中心会公布实时的控制状态。含有面孔和声音的视频均在封闭的 AI 环境中处理。

认证

SOC 2 Type II
GDPR
CAI 及 C2PA 成员

加密

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

您的内容

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

访问

SSO 和 SAML
基于角色的访问控制
OAuth 2.0 客户端凭证

企业

数据本地化选项
自定义服务等级协议 (SLA)
专属客户经理

声音权益

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

Rask API 与您自主搭建的口型同步流程对比

独立的口型同步 API 需要目标语言的完整音轨。而 Rask 在一个项目中即可完成配音轨道的制作与口型同步。以下是采用两种方式实现的相同效果。
您所需的功能
Rask API
拼凑而成的方案
用于同步的翻译音轨
由同一个项目创建
首先经过转写、翻译和语音服务商处理
付费前面部检查
自动进行,每个项目一次
您自己的面部检测步骤
屏幕上的多张人脸
is_multiple_speakers: true
您自行构建和调试的逐个人脸追踪
完整运行前先预览
每个账号赠送一分钟免费时长
按每次测试运行付费
修改文案后重新同步
生成全新的完整视频口型同步,单独计费
为整个文件再次付费
背景音乐与音效
在新声音下保留
您构建的音源分离步骤
.srt和.vtt格式字幕
包含
根据您自己的时间轴数据生成
队列可见性
队列位置与进度 0-100
您的供应商公开的任何内容
频率限制
无
取决于你合作的最严格供应商的要求
计费
按完整视频口型同步生成次数计费
按运行次数、按供应商计费
常见问题解答

口型同步 API:常见问题

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

是否有口型同步 API?

我可以不先配音就直接对口型吗?

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

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

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

口型同步是如何计费的?

有免费的唇形同步预览吗?

唇形同步支持多个说话者吗?

如何跟踪唇形同步进度?

唇形同步需要多长时间?

编辑配音后会发生什么?

如果唇形同步失败怎么办?

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

在一个下午内开始配音

今天就发出您的第一个请求,如果您需要大容量优惠条款或是罕见语种,随时与我们联系。