语音交互服务 热词3.0尝鲜体验

举报
ASR-beginer 发表于 2024/01/18 17:11:40 2024/01/18
【摘要】 基本介绍为了解决用户领域关键词、实体命名的识别准确率问题,华为云语音交互服务推出了热词3.0的功能。热词3.0由两部分组成:热词区和可选区,如下图所示。为了尽可能扩展热词的功效,高效解决用户领域偏置问题,SIS服务编排了三种热词的具体形式。 普通热词保留该热词形式的原因主要有两个:对于常见的命名实体,如地名、景点、商品名、领域关键词,我们一般无需指定权重,减少维护参数为了兼容旧接口,让存量...

基本介绍

为了解决用户领域关键词、实体命名的识别准确率问题,华为云语音交互服务推出了热词3.0的功能。热词3.0由两部分组成:热词区可选区,如下图所示。

image.png

为了尽可能扩展热词的功效,高效解决用户领域偏置问题,SIS服务编排了三种热词的具体形式。

普通热词

保留该热词形式的原因主要有两个:

  1. 对于常见的命名实体,如地名、景点、商品名、领域关键词,我们一般无需指定权重,减少维护参数
  2. 为了兼容旧接口,让存量用户依旧可以稳定使用热词接口
普通热词的配置规则:
  1. 最多可以创建100个热词表,每个热词表支持10000个热词,每个热词最多支持32个字符
  2. 所有含英文的热词均需大写,如:Eiffel铁塔(正确示例为:EIFFEL铁塔)。
  3. 所有数字均用相应的汉字表示,不能使用阿拉伯数字 ,如:12345服务热线(正确示例为:一二三四五服务热线)。
  4. 热词内容仅包含英文和中文,中文热词长度不超过32个字符(含空格),不能包含标点符号、特殊字符,如:。,?.*等。
  5. 尽量避免配置单音节的英文单词,避免误召回,如:MAY/TEE等。

自定义权重热词

为了提升热词召回率,我们增加了自定义权重的功能,它主要在以下场景中应用:

  1. 所配置的关键词与常见词发音一样,导致热词不能百分百生效。如雇工 vs 故宫。由于故宫更加常见,所以可能存在即使配置了雇工这个热词,也无法召回的情况。

  2. 所配置的关键词含有生僻字,如葳蕤霜蟾。这些生僻字出现的概率较低,所以在热词搜索过程中,可能不生效。

  3. 所配置的关键词较常见,与其他高频词容易混淆(误召回),如述职 vs 数值

    # 设置关键词 述职 后:
    (√)年底了,我们都要述职了。
    (×)这个公式计算得出的述职是多少?
    
    # 设置关键词 述职/1 后:
    (√)年底了,我们都要述职了。
    (√)这个公式计算得出的数值是多少?
    

综上所述,有的可能需要增大热词权重,以提升其召回率,如雇工/10葳蕤/10。有的可能需要降低热词权重,如实时/1述职/1,以防止误召回。

自定义权重热词的配置规则:
  1. 自定义权重热词用/将热词分为两个部分,左边即为普通热词,遵循普通热词的配置规则
  2. 右边为1~10的整数(包含),数值越大热词的偏置力度越强,召回率越高(但误召回的风险越大)。

强制替换热词

该形式作为热词的补充,主要为了解决以下两个问题:

一些极其罕见的词语,如绵绵瓜瓞龙行龘(dá)龘,即使配置了热词,也无法识别,所以需要将谐音词进行强制替换:绵绵瓜叠=绵绵瓜瓞龙行达达=龙行龘龘

自定义格式输出,如特殊符号γ、β、奈雪の茶,数学公式x^2+1=0

强制替换热词的配置规则:
  1. 强制替换重热词用=将热词分为两个部分,左边为待替换词,遵循普通热词的配置规则
  2. 等号右边为最终输出词,仅校验长度(不超过32字符)。

创建方法

语音交互服务为用户提供了两种热词表的创建方法,一种是通过华为云Console来创建,另一种是直接调用后端接口

前端Console管理热词表

进入语音交互服务->热词表配置->创建热词表,在编辑框填写关键词,关键词之间用英文逗号隔开支持格式校验,待校验通过后,提交点击确认。

image.png

image.png

后端API管理热词表(推荐)

语音交互服务提供了多个语言的SDK,戳这里下载。这里以Python SDK为例进行介绍。

image.png

在安装完SDK后,首先填写鉴权信息,akskproject_idregion是必填项。

创建热词表
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        # 先用常见词替代罕见词
霜思=霜颸      # 再替换成罕见词
我想识别出罗马字符或者特殊文字怎么办?

我们先配置特殊字符的谐音汉字作为热词(如α\alpha配置成阿发,betabeta配置成贝塔,γ\gamma配置成伽马),然后再用替换热词输出自己想要的字符。

伽马射线/6
伽马射线=γ射线
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。