6.3 逻辑处理服务设计

 在硬件终端搭建完成后,需要设计一组逻辑对话,适用于语音控制场景。例如:“打开卧室的台灯”,“关闭厨房电源”,“设置空调温度为24摄氏度”等。以及部署控制指令转发的服务器地址。在dueros官网,这些逻辑处理的对话场景统称为技能,所以只需要设计好逻辑对话技能,然后在服务器上部署,就可以实现语音控制。
 首先需要在dueros官网,技能平台创建自定义技能,并编辑简单的对话模型,用于确定识别关键字位置。接着将常见控制关键字录入数据字典,dueros在分析对话内容时,通过关键字来确定是否是有效指令。在完成对话模型,字典设计后,可以通过网页端进行简单的语句理解测试,如果语句识别准确无误,即可以进行具体的逻辑设计了。
 逻辑设计的内容将来会部署在服务器上,dueros给开发者提供了两种部署方式,一种是百度云cfc函数计算,另一种是“web server”部署,也就是开发者在第三方平台上的云服务器。针对这两种方式提供了两中对应的开发模板。支持的开发语言为java、php、nodejs,逻辑设计我将采用nodejs来完成,因为cfc函数计算默认开发语言为nodejs,虽然支持Python、java但是兼容不是很友好。
 选用cfc函数计算,需要登陆百度云,创建cfc函数计算实例,选用模板创建会生成dueros匹配的代码模板,只需要改写入口参数,就可以在此基础上进行逻辑的扩展,且cfc函数计算代码可以直接在线编辑修改,非常方便。但是cfc函数计算运行环境是百度云提供的,只有一些必备的、常见的插件,我们没有办法去修改、添加或自定义自己的插件,所以cfc函数计算可以说是比较局限的,不太适合复杂,庞大的逻辑处理。因此,我将采用第二种方式,在自己云服务器上搭建一个web server,然后编写逻辑代码实现部署。
搭建“web server”首先需要搭建nodejs运行环境,具体步骤如下:

  • 1.首先使用ssh方式登陆到云服务器上,在home目录下创建个node文件夹。
    cd /home
    mkdir node
  • 2.下载git工具, centos默认工具是“yum”,ubuntu替换为“apt-get”即可
    sudo yum install git
  • 3.下载安装NVM版本管理工具
    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
  • 4.重新加载“.bashrc”文件
    source ~/.bashrc
    1. 查询全部可以安装的nodejs版本号
      nvm ls-remote
  • 6.安装指定版本(dueros要求nodejs版本必须大于v6.10)
    nvm install v8.1.2
  • 7.查看当前使用版本,验证安装是否成功
    nvm current
  • 8.现在需要在npm上下载“bot-sdk”包,以及依赖的软件包
    cd node
    npm install bot-sdk –save
    npm install express –save
  • 9.“web server”的方式,其实是搭建一个小型的http服务器,将逻辑对话按要求编写成文件,dueros服务器通过http请求访问逻辑服务器,逻辑服务器返回对应的对话,所以按照官网要求,需要用nodejs语言搭建个http服务器。
    新建一个名为index.js的文件:

vi index.js

编写http服务器,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const express = require('express');

const Bot = require('./Bot');
let app = express();
// 探活请求
app.head('/', (req, res) => {
res.sendStatus(204);
});
app.post('/', (req, res) => {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', chunk => {
req.rawBody += chunk;
});
req.on('end', () => {
let b = new Bot(JSON.parse(req.rawBody));
b.run().then(result => {
res.send(result);
});
});
}).listen(8016);
console.log('listen 8016');

 此段代码,启用http服务,监听8016端口,在官网技能服务配置时也应以“ip+端口”号方式来配置逻辑对话服务器地址,如:“http://154.36.24.8:8016”接下来就是设计编写逻辑对话的代码了,官方规定使用Bot.js来命名逻辑代码。下面注释了逻辑代码基础结构,自定义的逻辑对话内容的开发在此基础上迭代就可以,与设备云的连接控制,在逻辑处理的过程中以http请求的方式发送给设备云,即可对物联网只能家居硬件进行控制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
const BaseBot = require('bot-sdk');
class Bot extends BaseBot {
/**
* postData可以不传,由于DuerOS对bot是post请求,sdk默认自动获取
*/
constructor(postData) {
super(postData);
this.addLaunchHandler(() => {
return {
outputSpeech: '欢迎使用!'
};
});
this.addIntentHandler('personal_income_tax.inquiry', () => {
let ctrl = this.getSlot('dz');
let local = this.getSlot('home');
let device = this.getSlot('device');
if (!ctrl) {
let card = new Bot.Card.TextCard('请问您是要打开还是关闭');
this.nlu.ask(ctrl);
// 如果有异步操作,可以返回一个promise
return new Promise(function (resolve, reject) {
resolve({
directives: [this.getTemplate1('请问您是要打开还是关闭')],
outputSpeech: '请问您是要打开还是关闭'
});
});
}
if (!local) {
let card = new Bot.Card.TextCard('请问您要控制的设备在哪里');
this.nlu.ask('home');
return {
card: card,
outputSpeech: '请问您要控制的设备在哪里'
};
}
if (!device) {
let card = new Bot.Card.TextCard('请问您要控制的设备是什么');
this.nlu.ask(device);
return {
directives: [this.getTemplate1('请问您要控制的设备是什么')],
outputSpeech: '请问您要控制的设备是什么'
};
}
});
}

 到此,语音交互设计就基本完成了,在完成上述工作后,可以在dueros技能平台测试调试你所编写的对话技能,在树莓派端使用或者调试的技能需要通过语音指令的方式,切换到调试技能模式,然后打开“xxx”技能,即可完成调试测试,但对于控制类的技能,官方是不允许通过自定义的技能方式申请上线的,也就是说通过自定义技能创建的具有智能家居功能的自定义技能,只可以在测试模式下使用,且只能被你个人所用。虽然控制功能现在基本已经实现,但这并不满足我要的结果。