# 热词优化

本文介绍如何使用应用级别和用户级别的热词

# 应用级别热词

# 操作步骤

# 用户级别热词

调用限制

  • 上传的热词数据,如果多次上传,则新上传热词的将覆盖之前的热词。
  • 热词采用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

请求示例

{
    "appkey": "appkey",
    "lang": "cn",
    "timestamp": "1588994602075",
    "signature": "signature",
    "userid": "userid",
    "words": [
        "你好",
        "天气真好"
    ]
}
1
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

请求返回

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
参数名 类型 描述
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