帖子

[官方资源分享] 【官方】离线命令词识别(语法识别)混合模式怎么用

  [复制链接]
  • TA的每日心情
    开心
    2017-12-29 09:56
  • 签到天数: 46 天

    [LV.5]常住居民I

    2026566  楼主| 王水 发表于 2015-9-1 13:29:00 1#
    离线命令词识别可以识别出用户发出的命令,但是有个很大的缺点就是,无法识别开发者定义的语法之外的命令。但是还好我们的工程师们采用了一下策略解决这方面的不足:离线命令词识别的混合模式。这里的混合模式是指离线命令词识别和在线语义理解的混合。下面介绍一下如何实现这个混合模式。

    在官网离线命令词识别的Demo的基础上进行如下设置的修改即可:
    1.按照Asrdemo构建语法、设置本地语法路径资源等。
    2.设置引擎为混合模式:
    mAsr.setParameter(SpeechConstant.ENGINE_TYPE, "mix");
    3.设置在线语义参数:
    mAsr.setParameter("asr_sch", "1");//是否进行语义识别
    mAsr.setParameter(SpeechConstant.NLP_VERSION, "2.0");//通过此参数,设置开放语义协议版本号。
    mAsr.setParameter(SpeechConstant.RESULT_TYPE, "json");//返回文本结果类型
    mAsr.setParameter("mixed_type", "realtime");//混合模式的类型
    mixed_type参数的解释如下:
    java平台暂不支持此参数。在混合模式下,通过设置此参数,选择对应的混合类型:
    realtime:实时,同时向云端和本地发送音频,在云端超时,或本地置信门限大于指定值时,使用本地结果;
    delay: 延时,在云端识别超时后,向本地发送音频。即优先用云端的语义理解。
    是否必须设置:否
    默认值:"realtime"


    下面是我实现的一个Demo的测试效果,有需要的可以下载体验一下。
    这是我本地的bnf语法:
    1. #BNF+IAT 1.0 UTF-8;
    2. !grammar call;
    3. !slot <name>;
    4. !slot <age>;
    5. !slot <askPre>;
    6. !start <askStart>;
    7. <askStart>:[<askPre>]<name>|[<askPre>]<age>;
    8. <askPre>:请问|我想知道|告诉我;
    9. <name>:你叫什么名字|你叫什么|你的名字叫什么;
    10. <age>:今年你多大了|你今年多大了|今年你几岁了|你今年几岁了;
    复制代码
    我的应用在云平台上勾选的语义场景和问答库如下图所示: QQ截图20150****25404.png QQ截图20150****25449.png
    当mixed_type设为realtime时,说“你叫什么名字”,返回结果是离线语法识别的结果:
    360手机助手截图0901_13_01_01.png

    当mixed_type设为delay时,说“你叫什么名字”,返回的结果是在线语义理解的结果:
    360手机助手截图0901_13_02_01.png


    另外无论mixed_type设为delay还是realtime,当说话内容不在离线语法定义的范围时,都会调用在线语义理解,并返回语义理解的结果。
    例如当说“你好吗”和“明天合肥的天气怎么样”时返回结果分别为:
    360手机助手截图0901_13_05_01.png              360手机助手截图0901_13_09_01.png



    Demo下链接:http://pan.baidu.com/s/1c1Xn1RE 密码:jom5
    注意:Demo下载后需要   
    1:appid更改为自己的appid;
    2:使用自己的离线识别资源替换assets\asr目录下的common.jet,下载你对应appid的离线命令词识别的SDK(付费版本或者体验版)里面有。如果是体验版的SDK你需要保它还在有效的试用期和装机量之内。
    3:将libs\armeabi目录下的so库替换自己的对应appid的so库,so库和appid和一一对应的。

    其实在论坛里分享的大多数Demo都需要注意类似上述的问题,才能正常运行。
    大家对于离线命令词识别的混合模式还有什么问题,欢迎在下面留言。
    问题反馈即解答:
    离线命令词混合模式中如何上传热词(联系人)?
    http://bbs.xfyun.cn/forum.php?mo ... 12132&fromuid=33982
    (出处: 语音云社区)
    混合识别策略文档.pdf (226.04 KB, 下载次数: 120, 售价: 10 语点)

    评分

    参与人数 2语点 +10 收起 理由
    baxk + 5 赞一个!
    ycp007 + 5 很给力!

    查看全部评分

    amyrobot 发表于 2016-11-8 17:34:25
    推荐
    楼主,目前混合模式下怎么设置离线命令词的优先级高呢?我发现一个问题,我虽然在初始化的时候加了设置项,setParameter("local_prior", "1");,但在识别过程中,命令是在离线命令词集里的,但是返回的却是在线语义的结果。
    使用道具 举报 回复
     楼主| 王水 发表于 2015-9-9 14:49:09
    推荐
    语音+(语记)里面的离线命令词识别也是支持混合模式的,只需要在speechUtility初始化时将engine_mode设为PLUS即可,其他的设置和本帖的一样。当然前提是你已经安装了语记,并且下载了离线识别资源。
    使用道具 举报 回复
    andriod 发表于 2015-9-2 14:09:05
    4#
    Mark 顶一下水哥, 相当给力呀
    使用道具 举报 回复
    poseidon 发表于 2015-9-9 13:45:27
    5#
    Android平台语音+可以使用吗?怎么设置本地识别资源呢?
    使用道具 举报 回复
    poseidon 发表于 2015-9-9 21:09:08
    6#
    王水 发表于 2015-9-9 14:49
    语音+(语记)里面的离线命令词识别也是支持混合模式的,只需要在speechUtility初始化时将engine_mode设为P ...

    我完全按照您帖子里面说的设置的,我用的语音+,也下载了识别资源,但是一直报“23001,本地引擎错误”。不知道什么原因,SDK都换了好多个了,当时情况还是一样的啊,求大神帮助。。。
    使用道具 举报 回复
     楼主| 王水 发表于 2015-9-10 08:31:13
    7#
    楼上已解决,详见此帖
    原因是本地语法编译时,引擎类型必须设置为local,在识别时才能设置为mix。

    使用道具 举报 回复
    yangxu@inbot.cn 发表于 2015-9-17 00:28:41
    8#
    谢谢楼主的帖子,已经调通了,但这个mix模式,要集成到自己已有项目中,需要替换旧版本离线命令词识别的哪些文件?
    使用道具 举报 回复
     楼主| 王水 发表于 2015-9-17 11:12:42
    9#
    yangxu@inbot.cn 发表于 2015-9-17 00:28
    谢谢楼主的帖子,已经调通了,但这个mix模式,要集成到自己已有项目中,需要替换旧版本离线命令词识别的哪 ...

    so文件,离线命令词识别的.jet资源文件
    使用道具 举报 回复
    kangxin 发表于 2015-11-10 14:40:30
    10#
    这个可以在linux平台的SDK中实现吗?{:soso_e132:}
    使用道具 举报 回复
     楼主| 王水 发表于 2015-11-11 09:59:15
    11#
    kangxin 发表于 2015-11-10 14:40
    这个可以在linux平台的SDK中实现吗?

    linux平台也支持混合模式,具体的设置可以看一下对应的文档介绍。

    楼内回复

    居然有这个,我试试  详情 发表于 2017-1-17 14:30
    使用道具 举报 回复