本文為您介紹如何使用POP API,在用戶端自行操作訓練自學習模型,不需要依賴管控台的設定。
您可通過POP API執行如下操作:
資料集(訓練語料)管理
建立資料集:
CreateAsrLmData查詢資料集:
GetAsrLmData刪除資料集:
DeleteAsrLmData列舉資料集:
ListAsrLmData
自學習模型管理
建立自學習模型:
CreateAsrLmModel查詢自學習模型:
GetAsrLmModel刪除自學習模型:
DeleteAsrLmModel列舉自學習模型:
ListAsrLmModel
自學習模型的訓練與發布
添加資料集到自學習模型:
AddDataToAsrLmModel從自學習模型中刪除資料集:
RemoveDataFromAsrLmModel訓練自學習模型:
TrainAsrLmModel上線自學習模型:
DeployAsrLmModel下線自學習模型:
UndeployAsrLmModel
開通服務
使用自學習服務的POP API介面訓練自學習模型,需要首先在管控台開通Intelligent Speech Interaction服務,具體開通步驟,請參見定製語言模型。
在管控台的專案功能配置中,請設定專案當前模型與訓練自學習模型使用的基本模型一致。
自學習模型服務資訊如下表。
名稱 | 值 |
地區ID | ap-southeast-1 |
網域名稱 | nls-slp.ap-southeast-1.aliyuncs.com |
協議類型 | HTTPS |
POP API版本 | 2018-11-20 |
準備訓練語料
請閱讀概述中的訓練語料說明,根據調用限制和最佳化建議準備訓練語料。
指標 | 說明 |
自學習模型數量 | 免費,最多建立10個。 |
資料集的數量 | 預設最多可建立100個。 |
單個資料集的大小 | 最大10 MB。 |
單個自學習模型使用資料集的數量 | 固定為10個。 |
生效時間 | 對於總的資料集在10 MB以下可以在5分鐘內生效,對於總的資料集較大的情況在半小時內生效。 |
訓練流程
訓練過程步驟如下:
準備訓練語料,將訓練語料匯入自學習服務,並建立為訓練資料集。
資料集操作的狀態轉換
狀態說明:
狀態
說明
Fetching
正在將訓練資料從URL匯入到自學習系統中。
FetchingFailed
複製資料集出現錯誤,請檢查訓練資料的URL是否正確(只支援阿里雲OSS的HTTP/HTTPS連結)。
Ready
資料集匯入成功。
建立一個自學習模型,並將資料集添加到該模型。
啟動自學習模型訓練,並等待模型訓練完成。
訓練自學習模型的狀態轉換
狀態說明:
狀態
說明
Empty
自學習模型新建立,還未訓練過。
Training
自學習模型正在訓練中。
TrainingFailed
自學習模型訓練失敗。
Ready
已上線的自學習模型下線成功。
Deploying
自學習模型正在上線或下線。
Deployed
自學習模型已上線。
介面說明
資料集管理:資料集即訓練語料,與管控台中上傳的訓練語料相同。
建立資料集
調用動作:CreateAsrLmData
輸入參數:
提交建立資料集的請求時,需要設定輸入參數到請求體中。
參數名稱 | 類型 | 是否必選 | 說明 |
Name | String | 是 | 建立的資料集名稱。 |
Url | String | 是 | 資料集位置,只支援阿里雲OSS的HTTP/HTTPS連結,需要自學習服務能訪問和下載訓練資料。 |
Description | String | 否 | 資料集描述資訊。 |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"RequestId": "C71B7CAA-18D6-4012-AC3D-425BA1CB****",
"DataId": "9934e10f19044282825508cbc7c8****"
}參數說明:
返回HTTP狀態200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
返回JSON格式字串參數:
參數化名稱
類型
說明
RequestId
String
請求ID。
DataId
String
資料集ID,作為後續模型訓練使用。
通過輪詢資料集的方式,直到狀態為Ready,表示資料集已經建立成功。
查詢資料集
調用動作:GetAsrLmData
輸入參數:
提交查詢資料集的請求時,需要設定輸入參數到請求體中。
參數名稱 | 類型 | 是否必選 | 說明 |
DataId | String | 是 | 要查詢的資料集ID。 |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"Data": {
"Name": "測試資料集",
"Status": "Ready",
"Md5": "38fc072ac60796a84ce1a0b13f78****",
"Description": "通過POP-API建立資料集",
"Url": "https://aliyun-nls.oss-ap-southeast-1.aliyuncs.com/asr/fileASR/SLP/SLPTest.txt",
"CreateTime": "2019-02-11 14:40:35",
"UpdateTime": "2019-02-11 14:40:35",
"Id": "9934e10f19044282825508cbc7c8****",
"Size": 5991
},
"RequestId": "C88130E6-F3B5-4F3E-9BF5-9C617DDD****"
}參數說明:
返回HTTP狀態:200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
返回JSON格式字串參數:
參數名稱
類型
說明
RequestId
String
請求ID。
Data
Data對象
資料集對象。
其中,Data對象的參數描述:
參數名稱
類型
說明
Id
String
資料集ID,資料集的唯一標識,即建立資料集時擷取的DataId。
Name
String
資料集名稱。
Description
String
資料集描述資訊。
Size
Integer
資料集大小(單位:Byte)。
Md5
String
資料集MD5值。
Url
String
建立資料集使用的URL。
Status
String
資料集狀態。可能的狀態Fetching、FetchingFailed、Ready。
CreateTime
String
資料集建立時間。
UpdateTime
String
資料集更新時間。
ErrorMessage
String
錯誤訊息(Status為錯誤狀態時出現)。
刪除資料集
調用動作:DeleteAsrLmData
輸入參數:
提交刪除資料集的請求時,需要設定輸入參數到請求體中。
參數名稱 | 類型 | 是否必選 | 說明 |
DataId | String | 是 | 需要刪除的資料集ID。 |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"RequestId": "7130914d32a3441db06747523675d9ff"
}參數說明:
返回HTTP狀態:200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
需要刪除的資料集狀態必須為Ready。
列舉資料集
調用動作:ListAsrLmData
輸入參數:
提交列舉資料集的請求時,需要設定輸入參數到請求體中。
參數名稱 | 類型 | 是否必選 | 說明 |
PageNumber | Int | 否 | 頁號:從1開始編號,預設值是1。 |
PageSize | Int | 否 | 頁大小:從10到100,預設值10。 |
ModelId | String | 否 | 模型ID,用於搜尋被指定模型使用到的資料。預設列出所有資料集。 |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"RequestId": "7130914d32a3441db06747523675d9ff",
"Page": {
"Content": [{
"Id": "1b64bee9994749f2a67eadac6379****",
"Name": "樣本資料集",
"Description": "這是一個樣本資料集",
"Size": 7777404,
"Md5": "39326cf690e384735355a385ec1e****",
"Url": "slp/tmp/demo-data-lm.txt",
"Status": "Ready",
"CreateTime": "2018-10-31 17:20:39",
"UpdateTime": "2018-10-31 17:20:39"
}],
"TotalPages": 1,
"TotalItems": 1,
"PageNumber": 1,
"PageSize": 10
}
}參數說明:
返回HTTP狀態:200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
返回JSON格式字串參數。
參數名稱
類型
說明
RequestId
String
請求ID
Page
Page對象
輸入參數中指定擷取的頁,沒有指定預設擷取第一頁。
其中,Page對象的參數描述如下。
參數名稱
類型
說明
Content
List< Data >
資料集數組,參考擷取資料集的輸出參數Data。
TotalPages
Integer
總頁數。
TotalItems
Integer
總資料集數。
PageNumber
Integer
頁號,與輸入參數相同。
PageSize
Integer
頁包含的資料集數量,與輸入參數相同。
自學習模型管理
建立自學習模型
調用動作:CreateAsrLmModel
輸入參數:
提交請求時,需要設定輸入參數到請求體中。
參數名稱 | 類型 | 是否必選 | 說明 |
Name | String | 是 | 模型名稱。 |
BaseId | String | 是 | 基本模型ID,建立成功之後不可修改,並在管控台的專案功能配置中,將當前模型設定為此基本模型。 |
Description | String | 否 | 模型描述資訊。 |
其中,支援訓練自學習模型的基本模型BaseId如下表所示,模型的詳細資料,請在管控台的專案模型中查看。
模型 | BaseId |
通用中文識別模型(中文普通話 16K) | universal |
電話客服及質檢模型(中文普通話 8K) | customer_service_8k |
電話客服及質檢模型(中文粵語 8k) | cantonese_customer_service_8k |
英文識別模型(英語 16k) | english |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"ModelId": "dbb6b71ff3e54b45a600ee5157a2****",
"RequestId": "945C59DF-B3D9-4F22-808E-76752FF3****"
}參數說明:
返回HTTP狀態:200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
返回JSON格式字串參數。
參數名稱
類型
說明
RequestId
String
請求ID。
ModelId
String
建立的自學習模型ID,作為後續的模型訓練使用。
建立自學習模型成功的狀態為Empty。
查詢自學習模型
調用動作:GetAsrLmModel
輸入參數:
提交請求時,需要設定輸入參數到請求的體中。
參數名稱 | 類型 | 是否必選 | 說明 |
ModelId | String | 是 | 要查詢的自學習語言模型ID。 |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"Model": {
"Name": "測試自學習模型",
"Status": "Empty",
"Description": "測試自學習模型描述",
"CreateTime": "2019-02-12 10:11:57",
"UpdateTime": "2019-02-12 10:11:57",
"Id": "dbb6b71ff3e54b45a600ee5157a2****",
"BaseId": "common",
"Size": 0
},
"RequestId": "6CE24FF7-B7C8-4B9F-B0EB-FE4AF20B****"
}參數說明:
返回HTTP狀態:200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
返回JSON格式字串參數。
參數名稱
類型
說明
RequestId
String
請求ID。
Model
Model對象
自學習模型對象。
其中,Mode對象的參數描述。
參數名稱
類型
說明
Id
String
模型ID,模型的唯一標識,與建立自學習模型的ModelId相同。
Name
String
模型名稱。
Description
String
模型描述資訊。
BaseId
String
基本模型ID。
Size
Integer
模型大小。
Status
String
模型狀態。可能的狀態:Empty、Training、TrainingFailed、Ready、Deploying、Deployed。
CreateTime
String
模型建立時間。
UpdateTime
String
模型更新時間。
ErrorMessage
String
錯誤訊息(Status為錯誤狀態時出現)。
刪除自學習模型
刪除自學習模型時,請確定您的應用沒有正在使用該模型,否則將沒有該模型的識別效果。
調用動作:DeleteAsrLmModel
輸入參數:
提交請求時,需要設定輸入參數到請求體中。
參數名稱 | 類型 | 是否必選 | 說明 |
ModelId | String | 是 | 需要刪除的自學習語言模型ID。 |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"RequestId": "7130914d32a3441db06747523675d9ff"
}參數說明:
返回HTTP狀態:200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
需要刪除的自學習模型狀態不能為Training和Deploying。
列舉自學習模型
調用動作:ListAsrLmModel
輸入參數:
提交請求時,需要設定輸入參數到請求體中。
參數名稱 | 類型 | 是否必選 | 說明 |
PageNumber | Int | 否 | 頁號:從1開始編號,預設值是1。 |
PageSize | Int | 否 | 頁大小:從10到100,預設值10。 |
DataId | String | 否 | 資料集ID,用於搜尋使用了指定資料的模型。預設列出所有模型。 |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"RequestId": "7130914d32a3441db06747523675****",
"Page": {
"Content": [{
"Id": "demo-model",
"Name": "樣本模型",
"Description": "這是一個樣本模型",
"Size": 0,
"Status": "Empty",
"CreateTime": "2018-11-01 17:05:21",
"UpdateTime": "2018-11-01 17:05:21",
"BaseId": "common"
}],
"TotalPages": 1,
"TotalItems": 1,
"PageNumber": 1,
"PageSize": 10
}
}參數說明:
返回HTTP狀態:200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
返回JSON格式字串參數。
參數名稱
類型
說明
RequestId
String
請求ID
Page
Page對象
輸入參數中指定擷取的頁,沒有指定預設擷取第一頁。
其中,Page對象的參數描述:
參數名稱
類型
說明
Content
List< Model >
Model對象數組,參考擷取模型的輸出參數Model。
TotalPages
Integer
總頁數。
TotalItems
Integer
總自學習模型數。
PageNumber
Integer
頁號,與輸入參數相同。
PageSize
Integer
頁包含的自學習模型數量,與輸入參數相同。
添加資料集到自學習模型
請勿重複添加同一資料集ID到同一自學習模型。
調用動作:AddDataToAsrLmModel
輸入參數:
提交請求時,需要設定輸入參數到請求體中。
參數名稱 | 類型 | 是否必選 | 說明 |
ModelId | String | 是 | 自學習模型ID。 |
DataId | String | 是 | 資料集ID。 |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"RequestId": "9B232563-12C0-4242-AA27-C250E1BB****"
}參數說明:
返回HTTP狀態:200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
添加的資料集狀態必須為Ready,自學習模型的狀態不能為Training和Deploying。
從自學習模型中刪除資料集
調用動作:RemoveDataFromAsrLmModel
輸入參數:
提交請求時,需要設定輸入參數到請求體中。
參數名稱 | 類型 | 是否必選 | 說明 |
ModelId | String | 是 | 自學習模型ID。 |
DataId | String | 是 | 資料集ID。 |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"RequestId": "7130914d32a3441db06747523675****"
}參數說明:
返回HTTP狀態:200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
需要刪除的自學習模型狀態不能為Training和Deploying。
開始訓練自學習模型
調用動作:TrainAsrLmModel
輸入參數:
提交請求時,需要設定輸入參數到請求體中。
參數名稱 | 類型 | 是否必選 | 說明 |
ModelId | String | 是 | 自學習模型ID。 |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"RequestId": "3D922A91-68AA-4260-AFE4-C429832F****"
}參數說明:
返回HTTP狀態:200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
開始訓練的自學習模型,狀態不能為Deploying。
自學習模型訓練完成後,預設發布上線,狀態為Deployed。
上線自學習模型
調用動作:DeployAsrLmModel
輸入參數:
提交請求時,需要設定輸入參數到請求體中。
參數名稱 | 類型 | 是否必選 | 說明 |
ModelId | String | 是 | 自學習模型ID。 |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"RequestId": "D9DDA978-5D68-45A4-B840-E4BC45C7****"
}參數說明:
返回HTTP狀態:200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
需要上線的自學習模型狀態必須為Ready。
下線自學習模型
下線自學習模型時,請確定您的應用沒有正在使用該模型,否則將沒有該模型的識別效果。
調用動作:UndeployAsrLmModel
輸入參數:
提交請求時,需要設定輸入參數到請求體中。
參數名稱 | 類型 | 是否必選 | 說明 |
ModelId | String | 是 | 自學習模型ID。 |
輸出參數:
服務端返迴響應體為JSON格式的字串。
{
"RequestId": "8417BA8E-2428-41D2-A849-396A0897****"
}參數說明:
返回HTTP狀態:200表示成功,更多狀態代碼請查閱HTTP狀態代碼。
需要下線的自學習模型狀態必須為Deployed。
各狀態下的操作
NO表示該狀態不允許的操作,-表示該狀態允許的操作。
狀態/操作 | Fetching | FetchingFailed | Ready | Empty | Training | Training Failed | Ready | Deploying | Deployed |
CreateAsrLmData | - | - | - | - | - | - | - | - | - |
ListAsrLmData | - | - | - | - | - | - | - | - | - |
GetAsrLmData | - | - | - | - | - | - | - | - | - |
DeleteAsrLmData | NO | NO | - | - | NO | - | - | - | - |
CreateAsrLmModel | - | - | - | - | - | - | - | - | - |
ListAsrLmModel | - | - | - | - | - | - | - | - | - |
GetAsrLmModel | - | - | - | - | - | - | - | - | - |
DeleteAsrLmModel | - | - | - | - | NO | - | - | NO | - |
AddDataToAsrLmModel | NO | NO | - | - | NO | - | - | NO | - |
RemoveDataFromAsrLmModel | - | - | - | - | NO | - | - | - | - |
TrainAsrLmModel | - | - | - | - | - | - | - | NO | - |
DeployAsrLmModel | - | - | - | NO | NO | NO | - | NO | NO |
UndeployAsrLmModel | - | - | - | NO | NO | NO | NO | NO | - |
錯誤碼
以上操作在出現錯誤時,服務端返回的響應體中包含了錯誤資訊。您可以根據錯誤資訊提示,檢查程式是否存在問題。
錯誤名稱 | 說明 |
SLP.ASR_MODEL_ERROR | 自學習模型相關錯誤。 |
SLP.NOT_FOUND | 指定的ID無效,無法根據ID找到指定的資源。 |
SLP.PARAMETER_ERROR | 建立資源時設定了無效的參數。 |
SLP.EXCEED_LIMIT | 資源數量超過限制,無法建立新的資源。 |
以NOT_FOUND錯誤為例:
{
"RequestId": "E70F51F6-23E3-4681-B954-ABF32B89****",
"HostId": "nls-slp.ap-southeast-1.aliyuncs.com",
"Code": "SLP.NOT_FOUND",
"Message": "Model not found!"
}參數名稱 | 類型 | 說明 |
RequestId | String | 請求ID。 |
HostId | String | 自學習服務端的網域名稱。 |
Code | String | 錯誤碼。 |
Message | String | 錯誤資訊描述。 |
程式碼範例
本樣本以Java語言為例,使用了阿里雲Java SDK的CommonRequest提交請求,採用RPC風格的POP API調用。
鑒權SDK使用過程中,所有的介面調用均通過阿里雲帳號完成鑒權操作。通過傳入阿里雲帳號的AccessKey ID和AccessKey Secret(擷取方法參見開通服務),調用阿里雲Java SDK,建立IAcsClient對象,全域唯一。
樣本中包含了三個類:
AsrLmModelPopApiDemo:POP API測試類別,包含main函數,用於測試介面,您可根據此類,進行整合時的狀態檢查。
AsrLmData:資料集類,封裝了資料集相關操作的資料對象和介面調用。
AsrLmModel:自學習模型類,封裝了自學習模型相關操作的資料對象和介面調用。
添加Java依賴:只需要依賴阿里雲Java SDK的核心庫與阿里雲開源庫fastjson。阿里雲Java SDK的核心庫版本可以選擇3.5.0至3.7.x的版本。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.7.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>POP API測試類別
import com.alibaba.fastjson.JSONObject; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.profile.DefaultProfile; public class AsrLmModelPopApiDemo { private static String REGION = "ap-southeast-1"; private static final String STATUS_FETCHING = "Fetching"; private static final String STATUS_FETCHINGFAILED = "FetchingFailed"; private static final String STATUS_READY = "Ready"; private static final String STATUS_EMPTY = "Empty"; private static final String STATUS_TRAINING = "Training"; private static final String STATUS_TRAININGFAILED = "TrainingFailed"; private static final String STATUS_DEPLOYING = "Deploying"; private static final String STATUS_DEPLOYED = "Deployed"; private static IAcsClient client; private AsrLmData asrLmData; private AsrLmModel asrLmModel; public AsrLmModelPopApiDemo(String akId, String akSecret) { DefaultProfile profile = DefaultProfile.getProfile(REGION, akId, akSecret); client = new DefaultAcsClient(profile); asrLmData = new AsrLmData(client); asrLmModel = new AsrLmModel(client); } /******************************* 資料集管理 *******************************/ // 建立資料集 public String createAsrLmData(String name, String fileUrl, String description) { String dataId = asrLmData.createAsrLmData(name, fileUrl, description); if (null == dataId) { return dataId; } // 輪詢資料集,檢查狀態是否為Ready,即資料集匯入成功。 while (true) { AsrLmData.LmData data = asrLmData.getAsrLmData(dataId); if (null == data) { dataId = null; break; } if (data.Status.equals(STATUS_FETCHING)) { System.out.println("正在將資料集匯入到自學習服務中,dataId: " + dataId); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } else if (data.Status.equals(STATUS_FETCHINGFAILED)) { System.out.println("複製資料集出現錯誤,dataId: " + dataId); asrLmData.deleteAsrLmData(dataId); dataId = null; break; } else if (data.Status.equals(STATUS_READY)) { System.out.println("資料集匯入成功,dataId: " + dataId); break; } } return dataId; } // 查詢資料集 public AsrLmData.LmData getAsrLmData(String dataId) { return asrLmData.getAsrLmData(dataId); } // 刪除資料集 public boolean deleteAsrLmData(String dataId) { AsrLmData.LmData data = asrLmData.getAsrLmData(dataId); if (null == data) { return false; } if (!data.Status.equals(STATUS_READY)) { System.out.println("資料集狀態不允許進行刪除操作,status: " + data.Status); return false; } return asrLmData.deleteAsrLmData(dataId); } // 列舉資料集 public AsrLmData.LmDataPage listAsrLmData() { return asrLmData.listAsrLmData(); } /******************************* 自學習模型管理 *******************************/ // 建立自學習模型 public String createAsrLmModel(String name, String baseId, String description) { String modelId = asrLmModel.createAsrLmModel(name, baseId, description); if (null == modelId) { return modelId; } // 輪詢自學習模型,檢查模型狀態是否是Empty,即新建立的自學習模型。 while (true) { AsrLmModel.LmModel model = asrLmModel.getAsrLmModel(modelId); if (null == model) { modelId = null; break; } if (model.Status.equals(STATUS_EMPTY)) { break; } else { System.out.println("建立自學習模型失敗,modelId: " + modelId); asrLmModel.deleteAsrLmModel(modelId); modelId = null; break; } } return modelId; } // 擷取自學習模型 public AsrLmModel.LmModel getAsrLmModel(String modelId) { return asrLmModel.getAsrLmModel(modelId); } // 刪除自學習模型 public boolean deleteAsrLmModel(String modelId) { AsrLmModel.LmModel model = asrLmModel.getAsrLmModel(modelId); if (null == model) { return false; } if (model.Status.equals(STATUS_TRAINING) || model.Status.equals(STATUS_DEPLOYING)) { System.out.println("自學習模型狀態不允許進行刪除操作,status: " + model.Status); return false; } return asrLmModel.deleteAsrLmModel(modelId); } // 列舉自學習模型 public AsrLmModel.LmModelPage listAsrLmModel() { return asrLmModel.listAsrLmModel(); } /**************************** 自學習模型的訓練與發布 ***************************/ // 添加資料集到自學習模型 public boolean addDataToAsrLmModel(String dataId, String modelId) { AsrLmData.LmData data = asrLmData.getAsrLmData(dataId); if (null == data) { return false; } if (!data.Status.equals(STATUS_READY)) { System.out.println("資料集狀態不允許進行添加到自學習模型操作,status: " + data.Status); return false; } AsrLmModel.LmModel model = asrLmModel.getAsrLmModel(modelId); if (null == model) { return false; } if (model.Status.equals(STATUS_TRAINING) || model.Status.equals(STATUS_DEPLOYING)) { System.out.println("自學習模型狀態不允許進行添加資料集操作,status: " + model.Status); return false; } return asrLmModel.addDataToAsrLmModel(dataId, modelId); } // 從自學習模型中刪除資料集 public boolean removeDataFromAsrLmModel(String dataId, String modelId) { // 列舉指定模型使用到的資料集,判斷待刪除的資料集是否已經添加到該模型。 boolean isAdded = false; AsrLmData.LmDataPage page = asrLmData.listAsrLmData(1, 10, modelId); if (page != null && page.Content.size() > 0) { for (int i = 0; i < page.Content.size(); i++) { if (dataId.equals(page.Content.get(i).Id)) { isAdded = true; break; } } } if (!isAdded) { System.out.println("待刪除的資料集沒有添加到指定模型,不能進行刪除操作!"); return false; } // 檢查模型狀態是否允許刪除資料集操作 AsrLmModel.LmModel model = asrLmModel.getAsrLmModel(modelId); if (null == model) { return false; } if (model.Status.equals(STATUS_TRAINING)) { System.out.println("自學習模型狀態不允許進行刪除資料集操作,status: " + model.Status); return false; } return asrLmModel.removeDataFromAsrLmModel(dataId, modelId); } // 訓練自學習模型 public boolean trainAsrLmModel(String modelId) { AsrLmModel.LmModel model = asrLmModel.getAsrLmModel(modelId); if (null == model) { return false; } if (model.Status.equals(STATUS_DEPLOYING)) { System.out.println("自學習模型狀態不允許進行訓練操作,status: " + model.Status); return false; } boolean isTrain = asrLmModel.trainAsrLmModel(modelId); if (!isTrain) { return isTrain; } // 輪詢自學習模型,直到狀態為Deployed,即自學習模型訓練成功且並已上線。 while (true) { model = asrLmModel.getAsrLmModel(modelId); if (null == model) { isTrain = false; break; } if (model.Status.equals(STATUS_TRAINING) || model.Status.equals(STATUS_DEPLOYING)) { if (model.Status.equals(STATUS_TRAINING)) { System.out.println("自學習模型正在訓練中,modelId: " + modelId); } else { System.out.println("自學習模型正在上線,modelId: " + modelId); } try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } else if (model.Status.equals(STATUS_TRAININGFAILED)) { System.out.println("自學習模型訓練失敗, modelId: " + modelId); isTrain = false; break; } else if (model.Status.equals(STATUS_DEPLOYED)) { System.out.println("自學習模型訓練成功並已上線,modeId: " + modelId); isTrain = true; break; } else { System.out.println("自學習模型狀態不允許進行訓練操作,Status: " + model.Status); isTrain = false; break; } } return isTrain; } // 上線自學習模型 public boolean deployAsrLmModel(String modelId) { AsrLmModel.LmModel model = asrLmModel.getAsrLmModel(modelId); if (null == model) { return false; } if (!model.Status.equals(STATUS_READY)) { System.out.println("自學習模型狀態不允許進行上線操作,status: " + model.Status); return false; } boolean isDeployed = asrLmModel.deployAsrLmModel(modelId); if (!isDeployed) { return isDeployed; } // 輪詢自學習模型,檢查狀態是否是Deployed,即自學習模型已上線。 while (true) { model = asrLmModel.getAsrLmModel(modelId); if (null == model) { isDeployed = false; break; } if (model.Status.equals(STATUS_DEPLOYING)) { System.out.println("自學習模型正在上線,modelId: " + modelId); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } else if (model.Status.equals(STATUS_DEPLOYED)) { System.out.println("自學習模型已經上線,modelId: " + modelId); isDeployed = true; break; } else { System.out.println("自學習模型的狀態不允許上線操作,Status: " + model.Status); isDeployed = false; break; } } return isDeployed; } // 下線自學習模型 public boolean undeployAsrLmModel(String modelId) { AsrLmModel.LmModel model = asrLmModel.getAsrLmModel(modelId); if (null == model) { return false; } if (!model.Status.equals(STATUS_DEPLOYED)) { System.out.println("自學習模型的狀態不允許進行下線操作,status: " + model.Status); return false; } boolean isUnDeployed = asrLmModel.undeployAsrLmModel(modelId); if (!isUnDeployed) { return isUnDeployed; } // 輪詢自學習模型,檢查狀態是否是Ready,即自學習模型下線完成。 while (true) { model = asrLmModel.getAsrLmModel(modelId); if (null == model) { isUnDeployed = false; break; } if (model.Status.equals(STATUS_DEPLOYING)) { System.out.println("自學習模型正在下線, modelId: " + modelId); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } else if (model.Status.equals(STATUS_READY)) { System.out.println("自學習模型下線完成,modelId: " + modelId); isUnDeployed = true; break; } else { System.out.println("自學習模型的狀態不允許進行下線操作,Status: " + model.Status); isUnDeployed = false; break; } } return isUnDeployed; } public static void main(String[] args) { if (args.length < 2) { System.err.println("AsrLmModelPopApiDemo need params: <AccessKey Id> <AccessKey Secret>"); return; } String accessKeyId = args[0]; String accessKeySecret = args[1]; AsrLmModelPopApiDemo demo = new AsrLmModelPopApiDemo(accessKeyId, accessKeySecret); /******************************* 資料集管理 *******************************/ // 資料集ID String dataId; // 建立資料集 String name = "測試資料集"; String fileUrl = "https://aliyun-nls.oss-cn-hangzhou.aliyuncs.com/asr/fileASR/SLP/SLPTest.txt"; String description = "通過POP-API建立資料集"; dataId = demo.createAsrLmData(name, fileUrl, description); if (dataId != null) { System.out.println("建立Data Integration功,資料集ID:" + dataId); } else { System.out.println("建立資料集失敗!"); } // 查詢資料集 AsrLmData.LmData data = demo.getAsrLmData(dataId); if (data != null) { System.out.println("擷取Data Integration功:" + JSONObject.toJSONString(data)); } else { System.out.println("擷取資料集失敗!"); } // 列舉所有資料集 AsrLmData.LmDataPage page = demo.listAsrLmData(); if (page != null) { System.out.println("列舉詞表成功:" + JSONObject.toJSONString(page)); } else { System.out.println("列舉詞表失敗!"); return; } /************************** 自學習模型管理 *********************************/ // 自學習模型ID String modelId; // 建立自學習模型 String modelName = "測試自學習模型"; // 使用的是通用模型,請根據業務需求選擇合適的基本模型。 String baseId = "universal"; String modelDescription = "測試自學習模型描述"; modelId = demo.createAsrLmModel(modelName, baseId, modelDescription); if (modelId != null) { System.out.println("建立自學習模型成功,模型ID:" + modelId); } else { System.out.println("建立自學習模型失敗!"); } // 查詢自學習模型 AsrLmModel.LmModel model = demo.getAsrLmModel(modelId); if (model != null) { System.out.println("擷取自學習模型成功:" + JSONObject.toJSONString(model)); } else { System.out.println("擷取自學習模型失敗!"); } // 列舉自學習模型 AsrLmModel.LmModelPage modelPage = demo.listAsrLmModel(); if (modelPage != null) { System.out.println("列舉自學習模型成功:" + JSONObject.toJSONString(modelPage)); } else { System.out.println("列舉自學習模型失敗!"); } /******************************* 自學習模型的訓練與發布 *******************************/ // 添加資料集到自學習模型 boolean isAdded = demo.addDataToAsrLmModel(dataId, modelId); if (isAdded) { System.out.println("添加資料集到自學習模型成功!"); } else { System.out.println("添加資料集到自學習模型失敗!"); } // 訓練自學習模型 boolean isTrian = demo.trainAsrLmModel(modelId); if (isTrian) { System.out.println("訓練自學習模型成功!"); } else { System.out.println("訓練自學習模型失敗!"); } // 下線自學習模型 boolean isUnDeployed = demo.undeployAsrLmModel(modelId); if (isUnDeployed) { System.out.println("自學習模型下線成功!"); } else { System.out.println("自學習模型下線失敗!"); } // 上線自學習模型 boolean isDeployed = demo.deployAsrLmModel(modelId); if (isDeployed) { System.out.println("自學習模型上線成功!"); } else { System.out.println("自學習模型上線失敗!"); } /***************************** 清理資料集和模型,請根據需求操作 *****************************/ // 1. 下線自學習模型,需要時開啟。 isUnDeployed = demo.undeployAsrLmModel(modelId); if (isUnDeployed) { System.out.println("自學習模型下線成功!"); } else { System.out.println("自學習模型下線失敗!"); } // 2. 從自學習模型中刪除資料集,需要時開啟。 boolean isDeleted = demo.removeDataFromAsrLmModel(dataId, modelId); if (isDeleted) { System.out.println("從自學習模型中刪除Data Integration功!"); } else { System.out.println("從自學習模型中刪除資料集失敗!"); } // 3. 刪除資料集,需要時開啟。 boolean isDeletedData = demo.deleteAsrLmData(dataId); if (isDeletedData) { System.out.println("刪除Data Integration功!"); } else { System.out.println("刪除資料集失敗!"); } // 4. 刪除自學習模型,需要時開啟。 boolean isDeletedModel = demo.deleteAsrLmModel(modelId); if (isDeletedModel) { System.out.println("刪除自學習模型成功!"); } else { System.out.println("刪除自學習模型失敗!"); } } }資料集類
import com.alibaba.fastjson.JSONObject; import com.aliyuncs.CommonRequest; import com.aliyuncs.CommonResponse; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.http.MethodType; import com.aliyuncs.http.ProtocolType; import java.util.ArrayList; import java.util.List; public class AsrLmData { public static class LmData { public String Name; public String Status; public String Description; public String Url; public String CreateTime; public String UpdateTime; public String Id; public String ErrorMessage; // 只有Status為錯誤狀態時有該資訊。 public int Size; } public static class LmDataPage { public int PageNumber; public int PageSize; public int TotalItems; public int TotalPages; public List<LmData> Content = new ArrayList<LmData>(); } private static final String VERSION = "2018-11-20"; private static final String DOMAIN = "nls-slp.ap-southeast-1.aliyuncs.com"; private static ProtocolType PROTOCOL_TYPE = ProtocolType.HTTPS; private static final String KEY_NAME = "Name"; private static final String KEY_URL = "Url"; private static final String KEY_DESCRIPTION = "Description"; private static final String KEY_DATA_ID = "DataId"; private static final String KEY_DATA = "Data"; private static final String KEY_PAGE = "Page"; private static final String KEY_PAGE_NUMBER = "PageNumber"; private static final String KEY_PAGE_SIZE = "PageSize"; private static final String KEY_MODEL_ID = "ModelId"; private IAcsClient client; private CommonRequest newRequest(String action) { CommonRequest request = new CommonRequest(); request.setDomain(DOMAIN); request.setProtocol(PROTOCOL_TYPE); request.setVersion(VERSION); request.setMethod(MethodType.POST); request.setAction(action); return request; } public AsrLmData(IAcsClient client) { this.client = client; } /** * 建立資料集 * @param name 建立的資料集名稱,必填。 * @param fileUrl 資料集檔案的連結,需要服務端可下載,必填。 * @param description 資料集描述資訊,可選。 * @return String 建立的資料集ID。 */ public String createAsrLmData(String name, String fileUrl, String description) { CommonRequest request = newRequest("CreateAsrLmData"); request.putBodyParameter(KEY_NAME, name); request.putBodyParameter(KEY_URL, fileUrl); request.putBodyParameter(KEY_DESCRIPTION, description); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("CreateAsrLmData: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("建立資料集失敗,HTTP錯誤碼:" + response.getHttpStatus()); return null; } JSONObject result = JSONObject.parseObject(response.getData()); String dataId = result.getString(KEY_DATA_ID); return dataId; } /** * 查詢資料集 * @param dataId 資料集ID * @return LmData 擷取的資料集對象 */ public LmData getAsrLmData(String dataId) { CommonRequest request = newRequest("GetAsrLmData"); request.putBodyParameter(KEY_DATA_ID, dataId); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("GetAsrLmData: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("擷取資料集失敗,HTTP錯誤碼:" + response.getHttpStatus()); return null; } JSONObject result = JSONObject.parseObject(response.getData()); String dataJson = result.getString(KEY_DATA); LmData data = JSONObject.parseObject(dataJson, LmData.class); return data; } /** * 刪除資料集 * @param dataId 需要刪除的資料集ID,必填。 * @return 是否刪除成功。 */ public boolean deleteAsrLmData(String dataId) { CommonRequest request = newRequest("DeleteAsrLmData"); request.putBodyParameter(KEY_DATA_ID, dataId); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("DeleteAsrLmData: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("刪除資料集失敗,HTTP錯誤碼:" + response.getHttpStatus()); return false; } return true; } /** * 列舉資料集 * @param pageNumber 頁號,從1開始編號,可選,預設值是1。 * @param pageSize 頁大小,從10到100,可選,預設值是10。 * @param modelId 模型ID,用於搜尋被指定模型使用到的資料集,可選,預設列出所有資料集。 * @return 資料集資訊。 */ public LmDataPage listAsrLmData(int pageNumber, int pageSize, String modelId) { CommonRequest request = newRequest("ListAsrLmData"); request.putBodyParameter(KEY_PAGE_NUMBER, pageNumber); request.putBodyParameter(KEY_PAGE_SIZE, pageSize); request.putBodyParameter(KEY_MODEL_ID, modelId); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("ListAsrLmData: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("列舉資料集失敗,HTTP錯誤碼:" + response.getHttpStatus()); return null; } JSONObject result = JSONObject.parseObject(response.getData()); String pageJson = result.getString(KEY_PAGE); LmDataPage page = JSONObject.parseObject(pageJson, LmDataPage.class); return page; } public LmDataPage listAsrLmData() { return listAsrLmData(1, 10, null); } }自學習模型類
import com.alibaba.fastjson.JSONObject; import com.aliyuncs.CommonRequest; import com.aliyuncs.CommonResponse; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.http.MethodType; import com.aliyuncs.http.ProtocolType; import java.util.ArrayList; import java.util.List; public class AsrLmModel { public static class LmModel { public String Name; public String Status; public String Description; public String CreateTime; public String UpdateTime; public String Id; public String BaseId; public String ErrorMessage; // 只有Status為錯誤狀態時有該資訊。 public int Size; } public static class LmModelPage { public int PageNumber; public int PageSize; public int TotalItems; public int TotalPages; public List<LmModel> Content = new ArrayList<LmModel>(); } private static final String VERSION = "2018-11-20"; private static final String DOMAIN = "nls-slp.ap-southeast-1.aliyuncs.com"; private static ProtocolType PROTOCOL_TYPE = ProtocolType.HTTPS; private static final String KEY_NAME = "Name"; private static final String KEY_BASE_ID = "BaseId"; private static final String KEY_DESCRIPTION = "Description"; private static final String KEY_MODEL_ID = "ModelId"; private static final String KEY_MODEL = "Model"; private static final String KEY_PAGE = "Page"; private static final String KEY_PAGE_NUMBER = "PageNumber"; private static final String KEY_PAGE_SIZE = "PageSize"; private static final String KEY_DATA_ID = "DataId"; private IAcsClient client; private CommonRequest newRequest(String action) { CommonRequest request = new CommonRequest(); request.setDomain(DOMAIN); request.setProtocol(PROTOCOL_TYPE); request.setVersion(VERSION); request.setMethod(MethodType.POST); request.setAction(action); return request; } public AsrLmModel(IAcsClient client) { this.client = client; } /** * 建立模型 * @param name 自學習模型名稱,必填。 * @param baseId 基本模型ID,建立成功後不可修改,必填。 * @param description 自學習模型描述資訊,可選。 * @return 建立的模型ID。 */ public String createAsrLmModel(String name, String baseId, String description) { CommonRequest request = newRequest("CreateAsrLmModel"); request.putBodyParameter(KEY_NAME, name); request.putBodyParameter(KEY_BASE_ID, baseId); request.putBodyParameter(KEY_DESCRIPTION, description); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("CreateAsrLmModel: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("建立自學習模型失敗,HTTP錯誤碼:" + response.getHttpStatus()); return null; } JSONObject result = JSONObject.parseObject(response.getData()); String modelId = result.getString(KEY_MODEL_ID); return modelId; } /** * 查詢自學習模型 * @param modelId 模型ID * @return 擷取的模型對象 */ public LmModel getAsrLmModel(String modelId) { CommonRequest request = newRequest("GetAsrLmModel"); request.putBodyParameter(KEY_MODEL_ID, modelId); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("GetAsrLmModel: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("查詢自學習模型失敗,HTTP錯誤碼:" + response.getHttpStatus()); return null; } JSONObject result = JSONObject.parseObject(response.getData()); String modelJson = result.getString(KEY_MODEL); LmModel model = JSONObject.parseObject(modelJson, LmModel.class); return model; } /** * 刪除自學習模型 * @param modelId 需要刪除的自學習模型ID * @return 是否刪除成功 */ public boolean deleteAsrLmModel(String modelId) { CommonRequest request = newRequest("DeleteAsrLmModel"); request.putBodyParameter(KEY_MODEL_ID, modelId); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("DeleteAsrLmModel: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("刪除自學習模型失敗,HTTP錯誤碼:" + response.getHttpStatus()); return false; } return true; } /** * 列舉自學習模型 * @param pageNumber 頁號,從1開始,可選,預設值是1。 * @param pageSize 頁大小,從1到100,可選,預設值是10。 * @param dataId 資料集ID,用於搜尋使用了指定資料集的模型,可選,預設列出所有自學習模型。 * @return 自學習模型資訊。 */ public LmModelPage listAsrLmModel(int pageNumber, int pageSize, String dataId) { CommonRequest request = newRequest("ListAsrLmModel"); request.putBodyParameter(KEY_PAGE_NUMBER, pageNumber); request.putBodyParameter(KEY_PAGE_SIZE, pageSize); request.putBodyParameter(KEY_DATA_ID, dataId); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("ListAsrLmModel: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("列舉自學習模型失敗,HTTP錯誤碼:" + response.getHttpStatus()); return null; } JSONObject result = JSONObject.parseObject(response.getData()); String pageJson = result.getString(KEY_PAGE); LmModelPage page = JSONObject.parseObject(pageJson, LmModelPage.class); return page; } public LmModelPage listAsrLmModel() { return listAsrLmModel(1, 10, null); } /** * 添加資料集到自學習模型 * @param dataId 需要添加的資料集ID * @param modelId 自學習模型ID * @return 是否添加成功 */ public boolean addDataToAsrLmModel(String dataId, String modelId) { CommonRequest request = newRequest("AddDataToAsrLmModel"); request.putBodyParameter(KEY_DATA_ID, dataId); request.putBodyParameter(KEY_MODEL_ID, modelId); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("AddDataToAsrLmModel: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("添加資料集到自學習模型失敗,HTTP錯誤碼:" + response.getHttpStatus()); return false; } return true; } /** * 從自學習模型中刪除資料集 * @param dataId 需要刪除的資料集 * @param modelId 自學習模型ID * @return 是否刪除成功 */ public boolean removeDataFromAsrLmModel(String dataId, String modelId) { CommonRequest request = newRequest("RemoveDataFromAsrLmModel"); request.putBodyParameter(KEY_DATA_ID, dataId); request.putBodyParameter(KEY_MODEL_ID, modelId); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("RemoveDataFromAsrLmModel: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("從自學習模型中刪除資料集失敗,HTTP錯誤碼:" + response.getHttpStatus()); return false; } return true; } /** * 開始訓練自學習模型 * @param modelId 需要開始訓練的自學習模型ID * @return 是否開始訓練成功 * */ public boolean trainAsrLmModel(String modelId) { CommonRequest request = newRequest("TrainAsrLmModel"); request.putBodyParameter(KEY_MODEL_ID, modelId); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("TrainAsrLmModel: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("開始訓練自學習模型失敗,HTTP錯誤碼:" + response.getHttpStatus()); return false; } return true; } /** * 上線自學習模型 * @param modelId 需要上線的自學習模型ID * @return 是否上線成功 */ public boolean deployAsrLmModel(String modelId) { CommonRequest request = newRequest("DeployAsrLmModel"); request.putBodyParameter(KEY_MODEL_ID, modelId); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("DeployAsrLmModel: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("上線自學習模型失敗,HTTP錯誤碼:" + response.getHttpStatus()); return false; } return true; } /** * 下線自學習模型 * @param modelId 需要下線的自學習模型ID * @return 是否下線成功 */ public boolean undeployAsrLmModel(String modelId) { CommonRequest request = newRequest("UndeployAsrLmModel"); request.putBodyParameter(KEY_MODEL_ID, modelId); CommonResponse response = null; try { response = client.getCommonResponse(request); } catch (ClientException e) { e.printStackTrace(); } System.out.println("UndeployAsrLmModel: " + response.getData()); if (response == null || response.getHttpStatus() != 200) { System.out.println(response.getData()); System.out.println("下線自學習模型失敗,HTTP錯誤碼:" + response.getHttpStatus()); return false; } return true; } }