- ···
- 产品服务
- ···
- 解决方案
- ···
- 文档中心
- ···
# 热词优化
本文介绍如何使用应用级别和用户级别的热词
- 应用级别热词:开发者可以通过 云知声AI开放平台控制台 (opens new window)优化。
- 用户级别热词:客户端可以通过用户级别接口上传优化。
# 应用级别热词
# 操作步骤
- 登录 云知声AI开放平台控制台 (opens new window)。
- 选择应用的查看详情。
- 在个性化热词输入框,输入热词并保存发布。
# 用户级别热词
调用限制
- 上传的热词数据,如果多次上传,则新上传热词的将覆盖之前的热词。
- 热词采用utf-8编码。
- 单个词最多20个字符,最多可配置200个词,保存之后5min生效。
- 如果语言类型选择“普通话”、“四川话”或“粤语”,热词请输入中文字符。
- 如果选择“英语”,热词请输入英文字母和空格。
功能描述
- 上传热词同时获取一个vocab_id,该id代表了一个热词模型。
- 请求ASR时,参数中带上此vocab_id能够使用热词模型。
请求参数
POST http://casr.hivoice.cn/v2/vocab/publish HTTP/1.1
Content-Type: application/json; charset=UTF-8
Content-Length: N
body(热词JSON串)
1
2
3
4
2
3
4
请求示例
{
"appkey": "appkey",
"lang": "cn",
"timestamp": "1588994602075",
"signature": "signature",
"userid": "userid",
"words": [
"你好",
"天气真好"
]
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
参数名 | 类型 | 是否必填 | 描述 |
---|---|---|---|
appkey | String | 是 | 应用对应的appkey |
lang | String | 是 | 语言类型 cn:中文普通话 en:英文 cantonese:粤语 sichuanese:四川话 |
timestamp | String | 是 | 系统时间,一般获取自系统时间 |
signature | String | 是 | 热词签名,参考下文签名获取算法 |
userid | String | 是 | 上传热词的用户id |
words | Array | 是 | 需要优化的热词集合 |
vocab_id | String | 否 | 如果上传时携带vocab_id,表示更新此vocab_id |
签名获取算法
/**
* 热词签名获取方法
* @param appkey
* @param timestamp
* @param secret
* @return
*/
public String getSign(String appkey, String timestamp, String secret) {
String originalStr = appkey + timestamp + secret;
StringBuilder sign = new StringBuilder();
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] bytes = md.digest(originalStr.getBytes(StandardCharsets.UTF_8));
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex.toUpperCase());
}
} catch (Exception unused) {
}
return sign.toString();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
请求返回
HTTP/1.1 200 OK
Content-Type: application/json;
{
"errorCode": "0",
"errorMsg": "success",
"result": {
"vocab_id": "vocab_id"
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
参数名 | 类型 | 描述 |
---|---|---|
errorCode | String | 错误码返回字段说明 |
errorMsg | String | 错误信息 |
result | JSON | 该对象包含vocab_id字段,表示此次优化热词模型id |
- 当errorCode表示异常时,result字段可能为空对象:{}
# 错误码
错误码 | 说明 | 解决办法 |
---|---|---|
0 | 正常 | |
2130001 | 热词请求参数为空错误 | 检查客户端代码是否字段设置错误 |
2130002 | 热词签名错误 | 检查签名字段是否正确 |
2130003 | 热词接口appkey不合法错误 | 确认appkey是否设置出错 |
2130004 | 语言类型错误 | 检查lang类型是否合法 |
2130005 | vocab_id设置错误 | 检查词表id是否错误,非法的vocab_id会导致此问题 |
2130006 | 热词数量超过上限错误 | 检查热词数量是否过多 |
2130007 | 热词服务接口服务端错误 | 建议重试,如果还有问题请联系平台 |
# 示例代码
package com.unisound.iot;
import com.alibaba.fastjson.JSON;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.List;
public class PublishUserWords {
public static class UserWords{
private String appkey;
private String lang;
private String timestamp;
private List<String> words;
private String signature;
private String userid;
}
private static final String APPKEY = "appkey"
private static final String LANG = "cn";
private static final String TIMESTAMP = "1588994602075";
private static final String SERCRET = "secret";
private static final String URL = "http://casr.hivoice.cn/v2/vocab/publish";
public static void main(String[] args) {
PublishUserWords instance = new PublishUserWords();
instance.sendASROptmizeData(Arrays.asList("你好", "天气真好"));
}
public void sendASROptmizeData(List<String> words) {
try {
UserWords userWords = new UserWords();
userWords.appkey = APPKEY;
userWords.lang = LANG ;
userWords.timestamp = TIMESTAMP;
userWords.words = words;
userWords.userid = "useridxxx";
userWords.signature = getSign(APPKEY, TIMESTAMP, SERCRET);
String result = httpPost(URL, JSON.toJSONString(userWords));
System.out.println(result);
} catch (Exception unused) {
}
}
/**
* 发送post请求
* @param urlStr
* @param postText
* @return
* @throws Exception
*/
public String httpPost(String urlStr, String postText) throws Exception {
java.net.URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Content-Type", "application/json;");
conn.setRequestMethod("POST");
conn.setDoOutput(true);
byte[] bytes = postText.getBytes("utf-8");
OutputStream os = conn.getOutputStream();
os.write(bytes);
os.close();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer buf = new StringBuffer();
String inputLine = in.readLine();
while (inputLine != null) {
buf.append(inputLine).append("\r\n");
inputLine = in.readLine();
}
in.close();
return buf.toString().trim();
}
/**
* 热词签名获取方法
* @param appkey
* @param timestamp
* @param secret
* @return
*/
public String getSign(String appkey, String timestamp, String secret) {
String originalStr = appkey + timestamp + secret;
StringBuilder sign = new StringBuilder();
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] bytes = md.digest(originalStr.getBytes(StandardCharsets.UTF_8));
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex.toUpperCase());
}
} catch (Exception unused) {
}
return sign.toString();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
← 概述