我的 Rokid 之路 附:记事本技能全部源代码

极客教程

(xqbumu) #1

今天(2017年12月25号,圣诞节,Rokid有心啦,木有收到圣诞节礼物的我,给我送来Rokid All in ONE 全栈语音智能开发套件作为圣诞节惊喜)

开箱后只能说做工相当不错,很精致。

废话不多说,正式走一遍遇到的坑,官方的开发指南其中已经写好了很多必要的入门流程。

目前开发的技能

  1. 记事本
    • 基本功能框架完成
    • 欢迎各位开发提交PR

本人遇坑及经验总结如下

  1. 没迅速找到官方的开发指南,直接进官方文档就上,然后无法通过APP内置的点击6下的开发模式连接Rokid,查询官方文档,可得知,需要通过Pebble设备方式进行连接,如果以后还有其它问题建议先进入开发套件常见问题解决方案汇总

  2. 在配置WiFi时,本人路由器名称设置了默认隐藏,因此在通过蓝牙配置WiFi连接时,一直无法配置通过,总结以往raspberry pi把玩经验,果断尝试关闭隐藏WiFi,得以解决无法配置连接WiFi的问题,导致该问题需要修改固件里的WiFi连接脚本,这个本人就先不尝试了,具体问题及解决方案已经发送到Rokid讨论里了,希望能改进无法正常连接隐藏的WiFi,解决资料

  3. 如果在APP的配网蓝牙连接这里搜索不到设备,要么使用点击6下的方式进入配网流程,要么使用Pebble设备的配网流程。

  4. 本人测试通过的可信刷机镜像(其实就是官方镜像)

  5. CPU板正对USB Type-c 的那个按键就是刷机用的按键,先按住,再通电,看出USB_Burning_Tool上出现设备,就可以松了,比用Debug板进行刷机方便很多,很人性化。

  6. 在Windows下使用adb shell连接到开发板后,使用ls命令,如果出现类似如下的内容,可能是自带的字符串着色与Windows的console不兼容,登入shell后,直接执行 alias ls=‘busybox ls --color=never’ 即可。建议Rokid预安装bash作为备用选项,或者开发者自行下载使用Cmder软件,可解决以上问题。(不怎么直接使用sh,一直用的bash或者zsh,没有出现过类似问题)

    e[0;0mdefault.prope[0m  e[1;36mlib64e[0m         e[1;34mopte[0m           e[1;34msrve[0m
    e[1;34mdeve[0m           e[1;34mlibexece[0m       e[1;34mproce[0m
    

关于WiFi连接及配网

  • 坑走完之后就是Demo了,能正式配置Rokid的WiFi连接,剩下的就很方便了,通过官方开发指南先做一个简单的人机对话,在开发过程中与Rokid的直接交流语言的JavaScript,因此若要开发更为灵活的服务功能,需要依托其它的后台接口开发。

关于入口词的一些事

  • Rokid 中可能涉及的入口词问题,本人发现Rokid是针对技能貌似是独占的(还没有完全确定这一点),前期可能刺激开发者或者其他人员抢占入口词,建议平台针对这点进行入口词融合、增加针对用户或者设备调试不同技能的优先级功能。

技能开发过程需要知道的事情

技能类型说明

属性 开放性 开发平台
公有 所有用户 云端
私有 - 云端 指定用户 云端
私有 - 本地 指定用户 本地(/opt/apps或/data/apps目录)

关于rokidos-cli

整理中。。。

关于语言交互的设置

  1. 词表

    • Rokid 预定义词表

    • 自定义词表
      自定义词表除了可以通过普通的一行一个词的方式设定自己的词表,还可以通过如下的方式引用其它词表(引用词表以 $ 符号开头)

      $ROKID.YES_ZH
      $ROKID.NO_ZH
      
    • setConfirm
      如果要通过setConfirm获取用户对话过程的任意内容,可以参考如下方式
      意图定义:

        ```json
        {
            "intent": "RecordAny",
            "slots": [
                {
                    "name": "content",
                    "type": "ROKID.ANY"
                }
            ],
            "user_says": [
                "!$content"
            ]
        }
        ```
      

      服务代码中对应handler中使用如下setConfirm语句:

        ```javascript
        this.setConfirm({
            confirmIntent: 'RecordAny',
            confirmSlot: 'content'
        });
        ```
      
  2. Session

    • this.setSession(key, value)中,所传value为null时,该值不会被记录。
  3. dbServer

    • dbServer.set(key, value, callback) 该方法为异步形式,因此涉及数据库操作时,应该将其后的业务逻辑放于callback中,否则数据还没取回就执行到后面的业务中。
    • get:Rokid.dbServer.get(key, callback)与Rokid.dbServer.delete(key,callback)是否为异步形式尚未验证,建议同样将数据库操作之后的业务逻辑放于callback中。
    • 鉴于关于数据库操作为异步形式,因此建议相关开发者自建统一的数据库存取管理的相关代码以避免多层嵌套(具体参考代码稍后会以GitHub的形式放出),或者改写为Promise形式,目前尚未改写成功。
    • 集成测试中的后端服务测试与服务列表中的测试用例在逻辑上不属于同一个会话,因此在调试中需要做区别,也就是数据库里的数据不共享,需要单独各自添加测试数据。

后续进一步整合raspberry pi与Rokid

该文章持续更新中。。。

本文参与了 SegmentFault「Rokid 开发板试用,开启你的嵌入式开发之旅」活动,欢迎正在阅读的你申请试用,一起交流开发心得。


用若琪的源代码打造属于自己的人工智能 | 开发日记精选
(大发) #2

撒花~~~~~~
:star_struck:


(xqbumu) #3

:sparkler:
markdown编辑预览貌似有问题


(大发) #4

等等我们修复下~


(咪酱酱) #5

学习个 我也在写开发日记!


(xqbumu) #6

严重欢迎
:sparkler:


(pengfei.lv) #7

最后的一个建议,我觉得很棒诶。入口次的问题,要好好考虑一下了。


(misa.zhu) #8

太赞了


(xqbumu) #9

谢谢misa大大 :tada: