版本變更
版本 | 描述 | 時間 |
v0.6 | 提交數字人視頻合成新增speed參數 SDK版本升級 | 2024-10-25 |
v0.5 | 提交數字人視頻合成新增speechOpen參數,新增變音規則介紹,學術音標表 | 2024-09-29 |
v0.4 | 數字人視頻合成支持自研數字人,新增素材音量調節字段,聲音模板新增聲音模板版本出參 SDK版本升級 | 2024-09-09 |
v0.3 | 新增批量查詢數字人視頻合成信息接口, sdk升級到2.3.0 | 2024-08-20 |
v0.2 | 提交數字人視頻合成接口,新增透明背景 | 2024-07-31 |
v0.1 | 功能發布 | 2024-07-01 |
概覽
交互示例
接入準備
需要接入方提前準備阿里云賬號,并利用阿里云子賬號生成對應的AK/SK;
阿里云主賬號需要對生成AK/SK的子賬號進行RAM授權;
使用阿里云主賬號登錄平臺,簽署相關法務協議。
API詳情
1. 提交數字人視頻合成任務
SubmitProjectTask
1.1. 入參
參數名 | 類型 | 是否必填 | 說明 |
scaleType | string | 是 | 畫面比例(9:16,16:9) 9:16 - 畫面寬度:1080,高度:1920 16:9 - 畫面寬度:1920,高度:1080 |
subtitleTag | int | 是 | 是否開啟字幕:1 - 是, 0 - 否, 自研數字人不支持字幕 |
transparentBackground | int | 否 | 透明背景開關:1-開啟 0-關閉, 默認0 開啟透明背景不允許添加素材,自研數字人不支持透明背景, 開啟透明背景主播的坐標位置默認居中,不支持調整 |
frames | List<OpenFrame> | 是 | 視頻畫面(最多50個畫面) |
OpenFrame
參數名 | 類型 | 是否必填 | 說明 |
index | int | 是 | 畫面順序,最小值為1。單次提交中每個畫面順序不可相同 |
layers | List<OpenLayer> | 是 | 圖層(一個畫面最多10個圖層) |
videoScript | OpenVideoScript | 是 | 腳本信息 |
subtitle | OpenSubtitle | 開啟字幕時必填 | 字幕設置 |
OpenVideoScript
參數名 | 類型 | 是否必填 | 說明 |
type | string | 是 | 文本/音頻:TEXT/AUDIO |
audioUrl | string | 音頻類型必填 | 音頻文件地址(最長十分鐘) |
textContent | string | 文本類型必填 | 音頻文本 |
voiceTemplateId | long | 文本類型必填 | 聲音模型id(需要跟主播匹配) |
volume | int | 文本類型必填 | 音量: 范圍[0 到 100],推薦值50 |
speedRate | string | 文本類型必填 | 語速倍數:范圍[0.8 到 2.0] 正常語速1,僅支持一位小數 |
OpenLayer
參數名 | 類型 | 是否必填 | 說明 |
type | string | 是 | ANCHOR - 主播 BACKGROUND - 背景,透明背景開啟時可不傳背景 MATERIAL - 素材 |
material | OpenMaterial | 是 | 圖層素材 |
index | int | 非背景必填 | 圖層順序 最小1,單次提交中每個畫面中圖層順序不可相同,背景不填 |
positionX | int | 非背景必填 | 圖層X坐標,背景不填(詳見坐標說明) |
positionY | int | 非背景必填 | 圖層Y坐標,背景不填(詳見坐標說明) |
width | int | 非背景必填 | 圖層寬度,背景不填(不能超過畫面高度) |
height | int | 非背景必填 | 圖層高度,背景不填(不能超過畫面寬度) |
背景圖層必須鋪滿整個畫面,默認最底層
背景圖層的width,height默認等于畫面的width,height
背景圖層的positionX,positionY默認等于0
OpenMaterial 主播/素材
參數名 | 類型 | 是否必填 | 說明 |
id | string | 主播圖層必填 | 主播id |
url | string | 非主播圖層必填 | 素材url(http地址) |
format | string | 非主播圖層必填 | 素材格式:video/mp4,image/png image/jpg,image/jpeg |
volume | int | 否 | 視頻音量: 范圍[0 到 100],推薦值50 ,僅video/mp4格式支持 |
OpenSubtitle 字幕
參數名 | 類型 | 是否必填 | 說明 |
positionX | int | 是 | X坐標:詳見字幕說明 |
positionY | int | 是 | Y坐標:詳見字幕說明 |
font | string | 是 | 字體,例如:SimSun ,詳細見字體說明 |
fontSize | int | 是 | 字號: 允許范圍[32 - 160] |
fontColor | string | 是 | 文字的顏色,格式為#后跟16進制值。例如:#ffffff |
alignment | string | 是 | 對齊方式:
|
backgroundColor | string | 否 | 背景色,RGB顏色,格式為#后跟16進制值。例如:#ffffff。 |
maxCharLength | int | 是 | 一行可顯示最大字數,建議文本寬度/字體寬度 |
textWidth | int | 是 | 文本寬度:詳見字幕說明 |
textHeight | int | 是 | 文本高度:詳見字幕說明 |
1.1.1. 字體說明
Alibaba PuHuiTi - 阿里巴巴普惠體
FZKai-Z03S - 方正楷體簡體
FZHei-B01S - 方正黑體簡體
FZShuSong-Z01S - 方正書宋簡體
FZFangSong-Z02S - 方正仿宋簡體
SimSun - 宋體
WenQuanYi MicroHei - 文泉驛微米黑
WenQuanYi Zen Hei Mono - 文泉驛等寬正黑
WenQuanYi Zen Hei Sharp - 文泉驛點陣正黑
Microsoft YaHei - 微軟雅黑
Yuanti SC - 圓體-簡常規體
Roboto Bold - Google Robota字體,不支持中文
Roboto - Google Robota字體,不支持中文
KaiTi - 楷體
SiYuan Heiti - 思源黑體
SiYuan SimSun - 思源宋體
HappyZcool-2016 - 站酷快樂體
1.1.2. 坐標說明
主播、素材、水印坐標參數均為畫面左上角對接圖片左上角的距離
坐標如果存在小數,舍棄小數, 如下圖:X=470, Y=700
1.1.3. 圖層超出畫面外
超出畫面的圖片需要進行裁剪
圖片的寬高使用裁剪后的圖片寬高
X,Y軸的坐標超出部分為0
原圖:
裁剪后圖片:
畫面內的效果:
1.1.4. 字幕說明
下圖參數示例:
{
"positionX": 68, // 字幕不允許超出畫面外,最小0,最大不超過畫面寬度
"positionY": 392,// 字幕不允許超出畫面外,最小0,最大不超過畫面高度
"maxCharLength": 7, // 一行可顯示最大字數,建議文本寬度/字體寬度
"textWidth": 800, // 文本寬度,文本框不能超出畫面外
"textHeight": 110, // 文本高度,必須大于字體大小
"fontSize": 100, // 字體大小
"font": "SiYuan SimSun",
"fontColor": "#090707",
"alignment": "BottomRight", // 右對齊
"backgroundColor": "#fefefe"
}
1.1.5. 背景示例
背景圖層提供的圖片需要充滿整個畫布,無需傳遞坐標值,系統默認X=0, Y=0
1.1.6. 變音規則介紹
OpenVideoScript對象的類型為文本(TEXT)的時候可以支持變音配置,需要變音的時候OpenVideoScript的參數speechOpen需設置為true,textContent字段需要設置在變音標簽下面,具體規則如下:
標簽 | 說明 | 示例 | tts版本支持情況 |
<speak> | 根元素,不論使用哪個ssml標簽,都要有 | <speak>這句話是沒有任何SSML語法的效果。</speak> | 0,2 支持 |
<break time="2.5s" /> | 在文本中插入停頓,time設置停頓時長,支持0s-10s | <speak> 今天天氣<break time="2.5s" />很好 </speak> | 0,2 支持 |
<word> | 連讀標簽,指定的詞組不被拆分,只能加在中文上 | <speak> 南京市<word>長江大橋</word>。 </speak> 嵌套拼音標簽示例:<speak><word>長江<phoneme alphabet="py" ph="da1">大</phoneme>橋</word></speak> | 0 支持連讀,但是不支持嵌套拼音標簽, 2 支持 |
<phoneme alphabet="py" ph="xi1 xi1"> | 標簽內的文本指定發音,只能加在中文上 ph用于指定拼音,僅支持一個拼音。
| <speak> <phoneme alphabet="py" ph="xi1">茜</phoneme>公主 </speak> | 0,2 支持 |
<phoneme alphabet="ipa" ph="?"> | 通過國際音標指定英文發音,ph用于指定國際音標。
| <speak><phoneme alphabet="ipa" ph="?">a</phoneme>,apple.是蘋果的意思. </speak> | 2 支持 |
<sub alias="文本替換"> | 內嵌文本替換為指定文本,目前暫時僅中文音色適用 | <speak><sub alias="Speech Synthesis Markup Language">SSML</sub></speak> | 0,2 支持 |
完整示例:
String textContent = "<speak> <sub alias="替換">我是文本替換</sub> <phoneme alphabet="ipa"ph="?">a</phoneme>,apple.是蘋果的意思<phoneme alphabet="py"ph="xi1">茜</phoneme>公主 , 南京市<word>長江大橋</word>。今天天氣<break time="2.5s" />很好 </speak>"
1.1.7. 學術音標表
原詞 | 學術IPA(本系統支持的) | 教學IPA(市面常見的) |
元音 | i | i? |
? | ? | |
? | e | |
? | ? | |
ɑ | a? | |
? | ?? | |
? | ? | |
u | u? | |
? | ? | |
? | ? | |
? | ?r | |
? | ??r | |
a? | a? | |
a? | a? | |
e? | e? | |
?? | ?? | |
o? | o? | |
輔音 | p | p |
b | b | |
t | t | |
d | d | |
k | k | |
ɡ | g | |
t? | t? | |
d? | d?或? | |
f | f | |
v | v | |
θ | θ | |
e | e | |
s | s | |
z | z | |
? | ? | |
? | ? | |
h | h | |
m | m | |
n | n | |
? | ? | |
j | j | |
w | w | |
? | r | |
l | l |
1.2. 出參
參數名 | 類型 | 說明 |
success | boolean | true 成功, false 失敗 |
errorMessage | string | 錯誤信息 |
errorCode | string | 異常code |
taskId | string | 任務id |
2. 查詢數字人視頻合成信息
GetProjectTask
2.1. 入參
參數名稱 | 類型 | 是否必填 | 說明 |
taskId | String | 是 | 任務id |
2.2. 出參
參數名稱 | 類型 | 說明 |
status | String | 合成狀態:IN_PROGRESS - 合成中, FAIL - 失敗 SUCCESS - 成功, CANCEL - 已取消 |
errorMsg | String | 合成失敗原因 |
videoDuration | String | 視頻時長 |
videoUrl | String | 視頻地址 |
3. 批量查詢數字人視頻合成信息
BatchGetProjectTask
3.1. 入參
參數名稱 | 類型 | 是否必填 | 說明 |
taskIdList | List<String> | 是 | 任務id集合 |
3.2. 出參
參數名 | 類型 | 說明 |
resultList | List<Object> | 視頻信息 |
Object說明
status | String | 合成狀態:IN_PROGRESS - 合成中, FAIL - 失敗 SUCCESS - 成功, CANCEL - 已取消 |
errorMsg | String | 合成失敗原因 |
videoDuration | String | 視頻時長 |
videoUrl | String | 視頻地址 |
4. 合成任務停止
StopProjectTask
4.1. 入參
參數名稱 | 類型 | 是否必填 | 說明 |
taskId | String | 是 | 任務id |
4.2. 出參
參數名稱 | 類型 | 說明 |
success | boolean | true-成功,false-失敗(僅表示提交結果,任務是否真正停止需調用“查詢數字人視頻合成信息”接口根據任務狀態判斷) |
errorCode | String | 錯誤碼 |
errorMsg | String | 失敗原因 |
5. 查詢資源信息
5.1. 入參
無
5.2. 出參
參數名稱 | 類型 | 說明 |
resourceInfoList | List<ResourceInfo> | 資源剩余量信息 |
ResourceInfo
參數名稱 | 類型 | 說明 |
resourceType | Integer | 資源類型:2 - AI視頻生成時長 |
remainCount | Integer | 資源剩余量 |
unit | String | 資源剩余量單位: second - 秒 |
lastExpire | Integer | 資源過期剩余天數 |
6. 數字人形象模型查詢
ListAnchor
6.1. 入參
參數名稱 | 參數類型 | 是否必填 | 說明 |
coverRate | string | N | 主播形象比例 9:16 豎版 16:9 橫版 |
anchorType | string | N | 主播類型: PUBLIC_MODEL:公模 PRIVATE_MODEL:私模 |
digitalHumanType | string | N | 主播類別: dynamicReality 動態實景數字人(暫時不可使用);staticTransparency 靜態數字人 |
useScene | string | Y | 使用場景 offlineSynthesis 離線數字人; |
pageSize | int | Y | 每頁大小 |
pageNumber | int | Y | 頁碼 |
6.2. 出參
參數名 | 參數類型 | 參數說明 |
total | int | 總數 |
list | array:AnchorResponse | 主播形象obj array |
success | Boolean | 是否成功 |
errorMessage | String | 異常信息 |
errorCode | String | 異常錯誤碼 |
AnchorResponse
參數名 | 參數類型 | 參數說明 |
anchoId | String | 主播id |
anchorMaterialName | String | 主播名稱 |
anchorType | String | 主播類型: PUBLIC_MODEL 公模 PRIVATE_MODEL 私模 |
coverUrl | String | 模特封面圖 |
coverThumbnailUrl | String | 模特封面縮略圖 |
coverWeight | int | 封面圖寬:像素值 |
coverHeight | int | 封面圖高:像素值 |
coverRate | String | 封面比例 |
status | String | 狀態: Usable 已上線 |
digitalHumanType | String | 主播類別: dynamicReality 動態實景數字人(暫時不可用);staticTransparency 靜態數字人 |
useScene | String | 使用場景 offlineSynthesis 離線數字人; |
resourceTypeDesc | String | 資源規格描述 |
gender | String | 性別F/M(需要與聲音模板性別保持一致) |
7. 聲音模板查詢
ListVoiceModels
7.1. 入參
參數名 | 參數類型 | 是否必填 | 參數說明 |
voiceType | String | N | 聲音類型 PRIVATE_VOICE 私模聲音; PUBLIC_VOICE 公模聲音; |
useScene | string | Y | 使用場景 offlineSynthesis 離線數字人 |
pageSize | int | Y | 每頁大小 |
pageNumber | int | Y | 頁碼 |
7.2. 出參
參數名 | 參數類型 | 參數描述 |
total | int | 總數 |
list | array:VoiceModelResult | 音頻腳本模板集合 |
success | Boolean | 是否成功 |
errorMessage | String | 異常信息 |
errorCode | String | 異常錯誤碼 |
VoiceModelResponse
參數名 | 參數類型 | 參數描述 |
voiceId | bigInt | 聲音模板id |
voiceName | String | 聲音名稱 |
voiceModel | String | 聲音模型(參數值) |
voiceGender | String | 男聲M/女聲F((需要與形象性別保持一致)) |
voiceUrl | String | 試聽音頻url |
voiceLanguage | String | zh/en |
voiceDesc | String | 聲音模型描述 |
useScene | String | 使用場景 offlineSynthesis 離線數字人 |
resourceTypeDesc | String | 資源規格描述 |
ttsVersion | Integer | tts版本0,1,2 v0.4 |
對接詳情
PHP
對接示例
require 'vendor/autoload.php';
use AlibabaCloud\SDK\Imarketing\V20220704\Models\GetOssUploadSignatureRequest;
use AlibabaCloud\SDK\IntelligentCreation\V20240313\IntelligentCreation;
use Darabonba\OpenApi\Models\Config as AlibabaConfig;
$config = new AlibabaConfig();
$config->accessKeyId = '****';
$config->accessKeySecret = '****';
$config->endpoint = "intelligentcreation.cn-zhangjiakou.aliyuncs.com";
$intelligentCreationClient = new IntelligentCreation($config);
$request = new GetProjectTaskRequest();
$request->taskId = '1111';
try {
$response = $intelligentCreationClient->getProjectTask($request);
var_dump($response->toMap());
} catch (TeaError $e) {
Log::error($e);
}
2.6.0
u-2d06dbf9-cce5-4bcf-91b6-750b97fee3bf-composer-tea.zip
composer require alibabacloud/intelligentcreation-20240313 2.6.0
2.4.0
u-17374653-852f-4536-9c8f-61f96b9890ef-composer-tea.zip
composer require alibabacloud/intelligentcreation-20240313 2.4.0
Java
對接示例
package com.aliyun.intelligentcreation20240313;
import com.aliyun.intelligentcreation20240313.models.*;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.HashMap;
import java.util.Map;
/**
* @author fangming.yu
* @since 2024/7/5
*/
public class TestProjectTest {
public static void main(String[] args) throws Exception {
TestProjectTest testProjectTest = new TestProjectTest();
try {
String taskId = testProjectTest.submitProjectTaskRequest();
testProjectTest.stopProjectTaskRequest(taskId);
testProjectTest.getProjectTaskRequest(taskId);
testProjectTest.selectResourceRequest(null);
testProjectTest.listVoiceModelsRequest();
System.out.println(taskId);
} catch (TeaException e) {
Gson gson = new Gson();
System.out.println(e.getMessage());
System.out.println(gson.toJson(e.getData()));
} catch (Exception e) {
e.printStackTrace();
}
}
String url = "intelligentcreation.cn-zhangjiakou.aliyuncs.com";
//初始化配置
Config config = new Config().setAccessKeyId("**")
.setAccessKeySecret("**")
.setEndpoint(url);
// 創建客戶端
Client client = new Client(config);
public TestProjectTest() throws Exception {
}
String submitProjectTaskRequest() throws Exception {
Gson gson = new Gson();
String para = "{\"scaleType\":\"16:9\",\"subtitleTag\":1,\"frames\":[{\"index\":1,\"layers\":[{\"type\":\"BACKGROUND\",\"material\":{\"format\":\"image/png\",\"url\":\"https://yic-pre.oss-cn-hangzhou.aliyuncs.com/common/image/backgroundImage/shu/1.png\"}},{\"type\":\"MATERIAL\",\"material\":{\"format\":\"image/png\",\"url\":\"https://yic-pre.oss-cn-hangzhou.aliyuncs.com/1539704706413278/image/material/1716348615967-%E5%86%B0%E6%B7%87%E6%B7%8B.png\"},\"index\":2,\"positionX\":76,\"positionY\":1169,\"width\":549,\"height\":750},{\"type\":\"ANCHOR\",\"material\":{\"id\":\"759459670880206851\",\"url\":\"https://yic-pre.oss-cn-hangzhou.aliyuncs.com/1539704706413278/image/anchor/1715148681933-55254f81420c4c82954042414136e52d.png\"},\"index\":3,\"positionX\":0,\"positionY\":0,\"width\":1080,\"height\":1920},{\"type\":\"WATERMARK\",\"material\":{\"type\":\"WATERMARK\",\"format\":\"image/png\",\"url\":\"https://yic-pre.oss-cn-hangzhou.aliyuncs.com/common/image/material/%E6%B0%B4%E5%8D%B003%403x.png"},\"index\":4,\"positionX\":248,\"positionY\":280,\"width\":191,\"height\":195}],\"videoScript\":{\"textContent\":\"讓我們一同投身于這場激動人心的呼吸之旅,共同見證科技與醫學的完美融合,攜手共進\",\"type\":\"TEXT\",\"voiceTemplateId\":82,\"volume\":50,\"speedRate\":1.5},\"subtitle\":{\"positionX\":0,\"positionY\":545,\"maxCharLength\":6,\"textWidth\":1080,\"fontSize\":60,\"font\":\"Microsoft YaHei\",\"fontColor\":\"#2a313d\",\"textHeight\":70,\"alignment\":\"BottomCenter\"}}]}";
Map<String, Object> map = gson.fromJson(para, new TypeToken<Map<String, Object>>() {
}.getType());
SubmitProjectTaskRequest request = SubmitProjectTaskRequest.build(map);
// 請求接口
SubmitProjectTaskResponse response = client.submitProjectTask(request);
System.out.println(gson.toJson(response));
if (response.getStatusCode().equals(200)) {
System.out.println("submitProjectTaskRequest 請求成功");
return response.getBody().getTaskId();
}
return null;
}
void getProjectTaskRequest(String taskId) throws Exception {
Gson gson = new Gson();
Map<String, Object> map = new HashMap<>();
map.put("taskId", taskId);
GetProjectTaskRequest request = GetProjectTaskRequest.build(map);
// 請求接口
GetProjectTaskResponse response = client.getProjectTask(request);
System.out.println(gson.toJson(response));
if (response.getStatusCode().equals(200)) {
System.out.println("getProjectTaskRequest 請求成功");
}
}
void stopProjectTaskRequest(String taskId) throws Exception {
Gson gson = new Gson();
Map<String, Object> map = new HashMap<>();
map.put("taskId", taskId);
StopProjectTaskRequest request = StopProjectTaskRequest.build(map);
// 請求接口
StopProjectTaskResponse response = client.stopProjectTask(request);
System.out.println(gson.toJson(response));
if (response.getStatusCode().equals(200)) {
System.out.println("stopProjectTaskRequest 請求成功");
}
}
void selectResourceRequest(String projectId) throws Exception {
Gson gson = new Gson();
Map<String, Object> map = new HashMap<>();
SelectResourceRequest request = SelectResourceRequest.build(map);
SelectResourceResponse response = client.selectResource(request);
System.out.println(gson.toJson(response));
if (response.getStatusCode().equals(200)) {
System.out.println("selectResourceRequest 請求成功");
}
}
void listVoiceModelsRequest() throws Exception {
Gson gson = new Gson();
Map<String, Object> map = new HashMap<>();
map.put("useScene", "offlineSynthesis");
map.put("pageSize", 1);
map.put("pageNumber", 10);
ListVoiceModelsRequest request = ListVoiceModelsRequest.build(map);
ListVoiceModelsResponse response = client.listVoiceModels(request);
System.out.println(gson.toJson(response));
if (response.getStatusCode().equals(200)) {
System.out.println("listVoiceModelsRequest 請求成功");
}
}
}
2.6.0
u-2d06dbf9-cce5-4bcf-91b6-750b97fee3bf-java-tea.zip
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>intelligentcreation20240313</artifactId>
<version>2.6.0</version>
</dependency>
2.4.0
u-17374653-852f-4536-9c8f-61f96b9890ef-java-tea.zip
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>intelligentcreation20240313</artifactId>
<version>2.4.0</version>
</dependency>