语音交互服务 热词3.0尝鲜体验
基本介绍
为了解决用户领域关键词、实体命名的识别准确率问题,华为云语音交互服务推出了热词3.0的功能。热词3.0由两部分组成:热词区和可选区,如下图所示。
为了尽可能扩展热词的功效,高效解决用户领域偏置问题,SIS服务编排了三种热词的具体形式。
普通热词
保留该热词形式的原因主要有两个:
- 对于常见的命名实体,如地名、景点、商品名、领域关键词,我们一般无需指定权重,减少维护参数
- 为了兼容旧接口,让存量用户依旧可以稳定使用热词接口
普通热词的配置规则:
- 最多可以创建100个热词表,每个热词表支持10000个热词,每个热词最多支持32个字符。
- 所有含英文的热词均需大写,如:Eiffel铁塔(正确示例为:EIFFEL铁塔)。
- 所有数字均用相应的汉字表示,不能使用阿拉伯数字 ,如:12345服务热线(正确示例为:一二三四五服务热线)。
- 热词内容仅包含英文和中文,中文热词长度不超过32个字符(含空格),不能包含标点符号、特殊字符,如:。,?.*等。
- 尽量避免配置单音节的英文单词,避免误召回,如:MAY/TEE等。
自定义权重热词
为了提升热词召回率,我们增加了自定义权重的功能,它主要在以下场景中应用:
-
所配置的关键词与常见词发音一样,导致热词不能百分百生效。如
雇工
vs故宫
。由于故宫
更加常见,所以可能存在即使配置了雇工
这个热词,也无法召回的情况。 -
所配置的关键词含有生僻字,如
葳蕤
,霜蟾
。这些生僻字出现的概率较低,所以在热词搜索过程中,可能不生效。 -
所配置的关键词较常见,与其他高频词容易混淆(误召回),如
述职
vs数值
。# 设置关键词 述职 后: (√)年底了,我们都要述职了。 (×)这个公式计算得出的述职是多少? # 设置关键词 述职/1 后: (√)年底了,我们都要述职了。 (√)这个公式计算得出的数值是多少?
综上所述,有的可能需要增大热词权重,以提升其召回率,如雇工/10,葳蕤/10。有的可能需要降低热词权重,如实时/1,述职/1,以防止误召回。
自定义权重热词的配置规则:
- 自定义权重热词用
/
将热词分为两个部分,左边即为普通热词,遵循普通热词的配置规则 - 右边为
1~10
的整数(包含),数值越大热词的偏置力度越强,召回率越高(但误召回的风险越大)。
强制替换热词
该形式作为热词的补充,主要为了解决以下两个问题:
一些极其罕见的词语,如绵绵瓜瓞,龙行龘(dá)龘,即使配置了热词,也无法识别,所以需要将谐音词进行强制替换:绵绵瓜叠=绵绵瓜瓞,龙行达达=龙行龘龘
自定义格式输出,如特殊符号γ、β、奈雪の茶,数学公式x^2+1=0
。
强制替换热词的配置规则:
- 强制替换重热词用
=
将热词分为两个部分,左边为待替换词,遵循普通热词的配置规则 - 等号右边为最终输出词,仅校验长度(不超过32字符)。
创建方法
语音交互服务为用户提供了两种热词表的创建方法,一种是通过华为云Console来创建,另一种是直接调用后端接口。
前端Console管理热词表
进入语音交互服务
->热词表配置
->创建热词表
,在编辑框填写关键词,关键词之间用英文逗号隔开,支持格式校验,待校验通过后,提交点击确认。
后端API管理热词表(推荐)
语音交互服务提供了多个语言的SDK,戳这里下载。这里以Python SDK为例进行介绍。
在安装完SDK后,首先填写鉴权信息,ak
、sk
、project_id
、region
是必填项。
创建热词表
def create_vocab(vocab_name):
# 初始化客户端
config = SisConfig()
config.set_connect_timeout(10) # 设置连接超时
config.set_read_timeout(10) # 设置读取超时
# 设置代理,使用代理前一定要确保代理可用。 代理格式可为[host, port] 或 [host, port, username, password]
# config.set_proxy(proxy)
hot_word_client = HotWordClient(ak, sk, region, project_id, sis_config=config, service_endpoint=service_endpoint)
# option 1 创建热词表
word_list = ["伽马/10","伽马=γ"]
create_request = HotWordRequest(vocab_name, word_list)
# 可选,热词语言,目前仅支持中文 chinese_mandarin。
create_request.set_language('chinese_mandarin')
# 可选,热词表描述信息
create_request.set_description('胸外科关键词')
create_result = hot_word_client.create(create_request)
vocabulary_id = create_result.get("vocabulary_id")
# 返回结果为json格式
print('成功创建热词表: {}'.format(vocabulary_id))
print(json.dumps(create_result, indent=2, ensure_ascii=False))
return vocabulary_id
查询单个热词表
def query_vocab(vocab_id):
config = SisConfig()
config.set_connect_timeout(10) # 设置连接超时
config.set_read_timeout(10) # 设置读取超时
# 设置代理,使用代理前一定要确保代理可用。 代理格式可为[host, port] 或 [host, port, username, password]
# config.set_proxy(proxy)
hot_word_client = HotWordClient(ak, sk, region, project_id, sis_config=config, service_endpoint=service_endpoint)
# option 4 根据热词表id查询具体热词表信息,使用前需确保热词表id已存在。
query_result = hot_word_client.query_by_vocabulary_id(vocab_id)
print(json.dumps(query_result, indent=2, ensure_ascii=False))
查询所有热词表
def query_all_vocab():
config = SisConfig()
config.set_connect_timeout(10) # 设置连接超时
config.set_read_timeout(10) # 设置读取超时
# 设置代理,使用代理前一定要确保代理可用。 代理格式可为[host, port] 或 [host, port, username, password]
# config.set_proxy(proxy)
hot_word_client = HotWordClient(ak, sk, region, project_id, sis_config=config, service_endpoint=service_endpoint)
# # option 3 查看热词表列表
query_list_result = hot_word_client.query_list()
print(json.dumps(query_list_result, indent=2, ensure_ascii=False))
删除热词表
def delete_vocab(vocab_id = ""):
config = SisConfig()
config.set_connect_timeout(10) # 设置连接超时
config.set_read_timeout(10) # 设置读取超时
# 设置代理,使用代理前一定要确保代理可用。 代理格式可为[host, port] 或 [host, port, username, password]
# config.set_proxy(proxy)
hot_word_client = HotWordClient(ak, sk, region, project_id, sis_config=config, service_endpoint=service_endpoint)
# option 5 根据热词表id删除热词表,使用前需确保热词表id已存在。
delete_result = hot_word_client.delete(vocab_id)
if delete_result is None:
print('成功删除热词表', vocab_id)
return
print(json.dumps(delete_result, indent=2, ensure_ascii=False))
修改热词表
def update_vocab(vocab_id, vocab_name = "test"):
# 初始化客户端
config = SisConfig()
config.set_connect_timeout(10) # 设置连接超时
config.set_read_timeout(10) # 设置读取超时
# 设置代理,使用代理前一定要确保代理可用。 代理格式可为[host, port] 或 [host, port, username, password]
# config.set_proxy(proxy)
hot_word_client = HotWordClient(ak, sk, region, project_id, sis_config=config, service_endpoint=service_endpoint)
# option 2 根据热词表id 更新热词表。新的热词表会替换旧的热词表。使用前需确保热词表id已存在。
word_list = ["HELLO"]
update_request = HotWordRequest(vocab_name, word_list)
update_result = hot_word_client.update(update_request, vocab_id)
# 返回结果为json格式
print('成功更新热词表', vocab_id)
print(json.dumps(update_result, indent=2, ensure_ascii=False))
FAQ&使用技巧
热词表中存在多个相似发音怎么办?
有些时候,我们需要配置的热词之间可能存在发音一致/相近的情况,如实时
vs实施
,述职
vs数值
。在实际应用中,我们往往需要这两个关键词均能在对应的场合正常识别,此时可以通过拓展热词的上下文,来消除相似发音的歧义问题。如可以配置成实时语音识别
、实施政策
,年底述职
、公式的数值
热词权重设置到最大仍然无法召回怎么办?
当我们想识别一些生僻词或者人工组合词的时候,可能存在无法正确召回的情况。此时可以将生僻词先用发音相同的常见词代替,再用替换热词来替换成自己想要的输出。如绿景佐阾
,霜颸
。
绿景左岭/10 # 先用常见词替代罕见词
绿景左岭=绿景佐阾 # 再替换成罕见词
霜思/6 # 先用常见词替代罕见词
霜思=霜颸 # 再替换成罕见词
我想识别出罗马字符或者特殊文字怎么办?
我们先配置特殊字符的谐音汉字作为热词(如配置成阿发,配置成贝塔,配置成伽马),然后再用替换热词输出自己想要的字符。
伽马射线/6
伽马射线=γ射线
- 点赞
- 收藏
- 关注作者
评论(0)