码迷,mamicode.com
首页 > 其他好文 > 详细

wukong-robot插件

时间:2021-06-02 17:35:31      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:实时   world   简单   插件   ext   active   支持   def   依次   

wukong-robot插件

wukong-robot 的工作机制:

  1. wukong-robot 被唤醒后,用户的语音指令先经过 ASR 引擎进行 ASR 识别成文本;
  2. 之后,wukong-robot 会对识别到的文本进行语义理解(NLU),得到解析结果;
  3. 轮询每个可用插件,进行技能匹配,交给适合处理该指令的技能插件去处理。
  4. 插件处理过程中,还可以根据需要使用 TTS 引擎合成成语音,播放给用户。

轮询机制

  1. 在初始化阶段,依次扫描 plugins 目录、$HOME/.wukong/contrib 目录和 $HOME/.wukong/custom 目录下的可用插件。可用插件的判定标准为:
  • 包含一个继承了 AbstractPlugin 基类的 Plugin 类;
  • 在配置文件中没有将这个插件的 enable 设为 false
  1. 在扫描过程中,如果存在插件设置了 PRIORITY 属性,则对其优先级进行重排。默认都为 0,PRIORITY 值设得越大,则优先级越高。
  2. 在轮询过程中,wukong-robot 会根据优先级逐个执行插件的 isValid() 方法,如果值为 True,则调用该插件的 handle() 方法进入处理

插件类型

wukong-robot 支持两类技能插件:

  1. 普通技能插件,适用于普通的查询、助手类技能。通常的交互模式是唤醒 wukong-robot 后,说出指令并触发该技能插件,由其完成处理并汇报结果。如果需要询问用户问题,则可以利用 self.activeListen() 方法进入主动聆听,从而实现多轮对话。
  2. 沉浸式技能插件,适用于音乐、电台等技能。通常的交互模式是唤醒 wukong-robot 后,说出指令并触发该技能插件,由其进入该技能的沉浸式场景中。在该技能的沉浸式场景下,用户唤醒 wukong-robot 后,允许响应更多指令以完成更丰富的操作(例如“下一首歌”、“这是什么歌”等指令)。如果唤醒后只是简单的聊天,还允许 wukong-robot 在回答后恢复该技能的沉浸式场景(例如,用户在音乐场景中唤醒 wukong-robot 并问完时间后,wukong-robot 可以自动恢复音乐播放)。

继承关系:

只需继承同一个基类 robot.sdk.AbstractPlugin ,并实现相应相关接口即可。其中:

  • 普通技能插件只需实现 isValid()handle() 两个接口,分别用来判断用户指令是否适合交给该技能插件处理,以及如何处理;
  • 沉浸式技能插件在普通技能插件的基础上,还需要设置 IS_IMMERSIVE 成员属性为 True ,此外还可以根据需求实现 isValidImmersive()restore()pause() 几个方法,分别用来支持沉浸模式下更多指令的响应以及恢复技能。

简单示例---普通技能

写之前思考:

  • 如何判断用户的指令是否适合用这个插件处理?
  • 需要暴露哪些配置项?
  • 如何处理用户的指令并得到需要的信息?

简单版本:

# -*- coding: utf-8-*-
from robot.sdk.AbstractPlugin import AbstractPlugin

class Plugin(AbstractPlugin):

    def handle(self, text, parsed):
        self.say(‘hello world!‘, cache=True)

    def isValid(self, text, parsed):
        return "打个招呼" in text
  • 第2行:我们将插件的基类 robot.sdk.AbstractPlugin 引入;
  • 第4行:我们编写一个名为 Plugin 的类,这个类集成了 AbstractPlugin 基类;
  • 第6行和9行:我们分别实现了 AbstractPlugin 的两个接口 handle()isValid() 。其中,isValid() 用于判断用户的指令是否适合交给这个插件处理;handle() 用于执行处理;
  • 第10行,我们设置让用户的指令中包含了 “打个招呼” 关键词就执行响应。
  • 第7行,插件的处理过程就是说一句“hello world”,可以利用 AbstractPlugin 基类中提供的 say() 方法来实现这个目的。而 cache 参数为 True 则告诉 wukong-robot 应该将这句话缓存下来,以后要说这句话就无需再请求 TTS 合成,而是直接播放缓存语音。一些相对固定的回复话术适合加上缓存功能,而一些实时变化的话术(例如当前时间)就不应该加上缓存,因为很可能再也不会有播放的机会。

常见问题:插件没有触发

原因:

  • 插件没有加载成功
  • ASR没有识别到触发词
  • 插件判断有冲突

插件加载成功:

  • 在启动日志中可以看到加载的模块名称

ASR没有识别到:

  • 这个需要查看日志或者打印,查看识别的内容

wukong-robot插件

标签:实时   world   简单   插件   ext   active   支持   def   依次   

原文地址:https://www.cnblogs.com/chenfengyijiu/p/14826727.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!