通过POP API管理训练数据集和自学习模型,可在客户端完成数据集创建、模型训练和发布,无需依赖控制台操作。
前提条件
调用POP API前,需要完成以下准备:
接入信息
调用POP API时使用以下接入信息。
|
名称 |
值 |
|
地域ID |
ap-southeast-1 |
|
域名 |
nls-slp.ap-southeast-1.aliyuncs.com |
|
协议类型 |
HTTPS |
|
POP API版本 |
2018-11-20 |
训练语料
使用限制
-
已开通智能语音交互免费版或商用版的账号可免费使用该功能。
-
训练数据应为领域相关文本。训练文本与待识别语音越接近,优化效果越好。
-
以文本方式保存,使用
UTF-8(无BOM)格式编码,文件大小不超过10 MB。 -
每个账号最多可创建10个模型,每个模型最多可使用10个数据集。
-
每个账号最多可创建100个数据集,单个数据集不超过10 MB。
-
每行填写一句话或一个需要重点优化的关键词,每行不超过500个字符。
-
文本中的数字需要按照发音替换为对应的汉字。例如,“58.9元”需要转换为“五十八点九元”。
-
文件中至少包含一行由5个及以上词组成的句子。
-
只采用逗号(,)、句号(。)、问号(?)和感叹号(!),句尾需要加标点。像书名号(《》)、双引号(“”)等标点应去除。
-
数据集总大小小于10 MB时,通常在5分钟内生效;数据集较大时,通常在半小时内生效。
优化建议
对于识别不准确的关键词,可将包含该词的句子或关键词重复写入多行,例如10行。如果效果仍不理想,可适当增加重复行数。
-
先排除发音不清晰或音频质量不佳导致的关键词识别问题。
-
通过识别测试逐步调整训练语料,避免影响其他同音内容的识别结果。
训练流程
创建并发布自学习模型的流程如下:
-
准备训练语料,将语料上传到自学习服务可访问的OSS HTTP或HTTPS URL,然后调用CreateAsrLmData创建训练数据集。轮询数据集状态,直至状态变为Ready。
-
调用CreateAsrLmModel创建自学习模型,然后调用AddDataToAsrLmModel将一个或多个训练数据集添加到模型。
-
调用TrainAsrLmModel开始训练。训练完成后,模型默认自动上线,状态变为Deployed。
训练数据集状态
|
状态 |
说明 |
|
Fetching |
正在将训练数据从URL导入到自学习的系统中。 |
|
FetchingFailed |
复制数据集出现错误,请检查训练数据的URL是否正确(只支持阿里云OSS的HTTP/HTTPS链接)。 |
|
Ready |
数据集导入成功。 |
自学习模型状态
|
状态 |
说明 |
|
Empty |
自学习模型新创建,还未训练过。 |
|
Training |
自学习模型正在训练中。 |
|
TrainingFailed |
自学习模型训练失败。 |
|
Ready |
已上线的自学习模型下线成功。 |
|
Deploying |
自学习模型正在上线或下线。 |
|
Deployed |
自学习模型已上线。 |
接口说明
数据集即训练语料,与控制台中上传的训练语料相同。所有操作成功时均返回HTTP状态码200。
训练数据集操作
CreateAsrLmData
从指定 URL 导入训练语料并创建训练数据集。
请求参数:
|
参数名称 |
类型 |
是否必选 |
说明 |
|
Name |
String |
是 |
创建的数据集名称。 |
|
Url |
String |
是 |
数据集位置,只支持阿里云OSS的HTTP/HTTPS链接,需要自学习服务能访问和下载训练数据。 |
|
Description |
String |
否 |
数据集描述信息。 |
返回示例:
{
"RequestId": "C71B7CAA-18D6-4012-AC3D-425BA1CB****",
"DataId": "9934e10f19044282825508cbc7c8****"
}
返回参数:
|
参数化名称 |
类型 |
说明 |
|
RequestId |
String |
请求ID。 |
|
DataId |
String |
数据集ID,作为后续模型训练使用。 |
通过轮询数据集的方式,直到状态为Ready,表示数据集已经创建成功。
GetAsrLmData
查询训练数据集的详细信息。
请求参数:
|
参数名称 |
类型 |
是否必选 |
说明 |
|
DataId |
String |
是 |
要查询的数据集ID。 |
返回示例:
{
"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****"
}
返回参数:
|
参数名称 |
类型 |
说明 |
|
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。 |
返回示例:
{
"RequestId": "7130914d32a3441db06747523675d9ff"
}
需要删除的数据集状态必须为 Ready 。
ListAsrLmData
分页查询训练数据集。
请求参数:
|
参数名称 |
类型 |
是否必选 |
说明 |
|
PageNumber |
Int |
否 |
页号:从1开始编号,默认值是1。 |
|
PageSize |
Int |
否 |
页大小:从10到100,默认值10。 |
|
ModelId |
String |
否 |
模型ID,用于搜索被指定模型使用到的数据。默认列出所有数据集。 |
返回示例:
{
"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
}
}
返回参数:
|
参数名称 |
类型 |
说明 |
|
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 |
|
通用中文识别模型(中文普通话 16K) |
universal |
|
电话客服及质检模型(中文普通话 8K) |
customer_service_8k |
|
电话客服及质检模型(中文粤语 8K) |
cantonese_customer_service_8k |
|
英文识别模型(英语 16K) |
english |
返回示例:
{
"ModelId": "dbb6b71ff3e54b45a600ee5157a2****",
"RequestId": "945C59DF-B3D9-4F22-808E-76752FF3****"
}
返回参数:
|
参数名称 |
类型 |
说明 |
|
RequestId |
String |
请求ID。 |
|
ModelId |
String |
创建的自学习模型ID,作为后续的模型训练使用。 |
创建自学习模型成功的状态为 Empty 。
GetAsrLmModel
查询自学习模型的详细信息。
请求参数:
|
参数名称 |
类型 |
是否必选 |
说明 |
|
ModelId |
String |
是 |
要查询的自学习语言模型ID。 |
返回示例:
{
"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****"
}
返回参数:
|
参数名称 |
类型 |
说明 |
|
RequestId |
String |
请求ID。 |
|
Model |
Model对象 |
自学习模型对象。 |
Model 对象:
|
参数名称 |
类型 |
说明 |
|
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。 |
返回示例:
{
"RequestId": "7130914d32a3441db06747523675d9ff"
}
删除自学习模型时,确认应用没有正在使用该模型,否则将没有该模型的识别效果。
需要删除的自学习模型状态不能为 Training 和 Deploying 。
ListAsrLmModel
分页查询自学习模型。
请求参数:
|
参数名称 |
类型 |
是否必选 |
说明 |
|
PageNumber |
Int |
否 |
页号:从1开始编号,默认值是1。 |
|
PageSize |
Int |
否 |
页大小:从10到100,默认值10。 |
|
DataId |
String |
否 |
数据集ID,用于搜索使用了指定数据的模型。默认列出所有模型。 |
返回示例:
{
"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
}
}
返回参数:
|
参数名称 |
类型 |
说明 |
|
RequestId |
String |
请求ID |
|
Page |
Page对象 |
输入参数中指定获取的页,没有指定默认获取第一页。 |
Page 对象:
|
参数名称 |
类型 |
说明 |
|
Content |
List< Model > |
Model对象数组,参考获取模型的输出参数Model。 |
|
TotalPages |
Integer |
总页数。 |
|
TotalItems |
Integer |
总自学习模型数。 |
|
PageNumber |
Integer |
页号,与输入参数相同。 |
|
PageSize |
Integer |
页包含的自学习模型数量,与输入参数相同。 |
模型训练与发布
AddDataToAsrLmModel
将训练数据集添加到自学习模型。
请求参数:
|
参数名称 |
类型 |
是否必选 |
说明 |
|
ModelId |
String |
是 |
自学习模型ID。 |
|
DataId |
String |
是 |
数据集ID。 |
返回示例:
{
"RequestId": "9B232563-12C0-4242-AA27-C250E1BB****"
}
不要重复添加同一数据集ID到同一自学习模型。
添加的数据集状态必须为 Ready ,自学习模型的状态不能为 Training 和 Deploying 。
RemoveDataFromAsrLmModel
从自学习模型中移除训练数据集。
请求参数:
|
参数名称 |
类型 |
是否必选 |
说明 |
|
ModelId |
String |
是 |
自学习模型ID。 |
|
DataId |
String |
是 |
数据集ID。 |
返回示例:
{
"RequestId": "7130914d32a3441db06747523675****"
}
移除数据时,自学习模型状态不能为 Training 和 Deploying。
TrainAsrLmModel
开始训练自学习模型。
请求参数:
|
参数名称 |
类型 |
是否必选 |
说明 |
|
ModelId |
String |
是 |
自学习模型ID。 |
返回示例:
{
"RequestId": "3D922A91-68AA-4260-AFE4-C429832F****"
}
开始训练的自学习模型,状态不能为 Deploying 。
自学习模型训练完成后,默认发布上线,状态为 Deployed 。
DeployAsrLmModel
上线自学习模型。
请求参数:
|
参数名称 |
类型 |
是否必选 |
说明 |
|
ModelId |
String |
是 |
自学习模型ID。 |
返回示例:
{
"RequestId": "D9DDA978-5D68-45A4-B840-E4BC45C7****"
}
需要上线的自学习模型状态必须为 Ready 。
UndeployAsrLmModel
下线自学习模型。
请求参数:
|
参数名称 |
类型 |
是否必选 |
说明 |
|
ModelId |
String |
是 |
自学习模型ID。 |
返回示例:
{
"RequestId": "8417BA8E-2428-41D2-A849-396A0897****"
}
下线自学习模型时,确认应用没有正在使用该模型,否则将没有该模型的识别效果。
需要下线的自学习模型状态必须为 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。
调用接口前,创建用于身份验证的AccessKey ID和AccessKey Secret。创建方法请参见准备账号。
添加依赖
添加以下Maven依赖。阿里云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("创建数据集成功,数据集ID:" + dataId);
}
else {
System.out.println("创建数据集失败!");
}
// 查询数据集
AsrLmData.LmData data = demo.getAsrLmData(dataId);
if (data != null) {
System.out.println("获取数据集成功:" + 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("从自学习模型中删除数据集成功!");
}
else {
System.out.println("从自学习模型中删除数据集失败!");
}
// 3. 删除数据集,需要时开启。
boolean isDeletedData = demo.deleteAsrLmData(dataId);
if (isDeletedData) {
System.out.println("删除数据集成功!");
}
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;
}
}