一个简单的算数技能,使用到confirm,词表,js engine 传值


(1119519985) #1

实现的效果是获取到用户输入的值然后进行基本数字运算最后返回运算结果
效果图:

下面是意图配置代码:
{
“intents”: [
{
“intent”: “sum”,
“slots”: [
{
“name”: “a”,
“type”: “ROKID.NUMBER_ZH”
},
{
“name”: “b”,
“type”: “ROKID.NUMBER_ZH”
},
{
“name”: “mark”,
“type”: “mark_list”
}
],
“user_says”: [
"^$a$mark$b$"
]
},
{
“intent”: “confirmsum”,
“slots”: [],
“user_says”: [
“加法”,
“除法”,
“减法”,
“加减乘除”,
“乘法”
]
}
]
}

下面是js Engine配置:
exports.handler = function (event, context, callback) {
var rokid = Rokid.handler(event, context, callback);
rokid.registerHandlers(handlers);
rokid.execute();
};

var handlers = {
‘ROKID.INTENT.WELCOME’: function () {
try{
this.emit(’:tts’, { tts: ‘您好,请问有什么可以帮您。’ });
this.callback(null);
}catch(e){
this.callback(e);
}
},
‘confirmsum’: function () {
try{
this.setConfirm({
confirmIntent: ‘confirmsum’,
confirmSlot: ‘confirmSlot’,
optionWords: [‘你要算什么’]
});
//正常完成意图函数时emit(’:done’)
this.emit(’:done’);
}catch(e){
this.callback(e);
}
},
‘sum’: function () {
try{
//通过Rokid 内置参数获得输入的值
var param = Rokid.param.request.content;
//得到slots类型的值
var slots = param.slots;
var a = parseInt(slots.a);
var b = parseInt(slots.b);
var mark = slots.mark;
var sum ;
if(mark == ‘加’){
sum = a+b;
}else if(mark == ‘减’){
sum = a-b;
}else if(mark == ‘乘’){
sum = a*b;
}else {
sum = a/b;
}
this.emit(’:tts’, { tts: ‘答案是’+sum});
this.callback(null);
}catch(e){
this.callback(e);
}
}
};

这就是一个简单的算数的skill,这个主要是想展示一下confirm怎么使用,词表的建立,以及针对意图的参数怎么在自己js engine里面获得,然后进行自己的业务逻辑。当然还有在js engine 实现http远程调用等功能都是很不错的亮点。

过程中有一个坑:就是参数a和b意图匹配的是number类型,在自己的js代码里面,通过json的格式获得参数a后 其实是字符串类型,对此需要做下类型转换。具体可以根据自己的业务做处理,只是牵扯都非字符串类型的时候在开发过程中可以多注意一下。

**小技巧:**在开发者平台进行后段服务测试的时候,可以通过查看js日志的形式查看传输的数据和格式,方便对输入的值进行核对和调试。


(chao.xuc) #2

cool