【Dueross|技能进修】家居控制-服务端开发
D****s · D****s 发布于2017-12-11 13:37 浏览:1900 回复:1

前面讲解了如何配置技能的意图、常用表达语、创建槽位、创建字典。接下来讲解技能平台的服务端开发,撸起袖子,撸代码的时间又到了。

1、回顾上文

上一篇结尾讲解到了配置服务,如下图:

image.png

如果自己没有服务器只能选择CFC来调试自己的技能了。今天先讲解如何在自己的服务器上使用PHP SDK来调试自己的技能。后面陆续会讲解Node.js以及百度CFC上Node.js的使用。

2、安装PHP SDK

2.1 点击上图的“PHP SDK 技术文档”链接查看文档。

image.png

如文档所述:PHP版本的SDK采用PSR-4规范自动加载,执行如下命令进行安装。

composer require dueros/bot-sdk

执行此命令我猜你会出问题,哈哈因为你没有安装composer。

2.2 安装composer

请移步到composer官网composer中文网查看各个系统的安装教程,安装过程有点慢,请耐心等待。安装完composer后即可下载bot-sdk了


3、SDK目录

image.png

vendor目录里面是PHP SDK的全部内容,

cd vendor/dueros/bot-sdk
ll

image.png

上面是bot-sdk目录结构,这里我们主要看下samples目录,里面有栗子哦。

image.png

我们来看下BAE的例子,我们进入查看下目录结构

cd bae-sample

image.png

好了,这里我们最关心的其实四src目录的文件,Bot的实现都在src目录,进入src查看

cd src

呵呵,里面只有Bot.php文件,如果你已经看过PHP SDK的文档的话,你就会感觉很简单了。

4、Bot 讲解

4.1 先看下文件内容:

class Bot extends \Baidu\Duer\Botsdk\Bot{
    /**
     * @param null
     * @return null
     **/
    public function __construct($postData = []) {
        parent::__construct($postData);

        $this->addHandler('LaunchRequest', function(){
            $this->waitAnswer();
            $card = new TextCard('欢迎进入');
            return [
                    'card' => $card,
                    //'outputSpeech' => '欢迎光临'
                    'outputSpeech' => '欢迎进入',
            ];

        });


        //注意注意注意 这里可以换成新的方法addIntentHandler
        $this->addHandler('#test.inquiry888', function(){
            if($this->request->isDialogStateCompleted()) {
                $card = new TextCard('你应该缴税121212');
                $this->endDialog();
                $directive = new Play('http://other.web.rh01.sycdn.kuwo.cn/f2e1e2e47647e9644a1a736804ac1338/59de0d2c/resource/n2/9/66/3331052726.mp3');
                return [
                    'directives' => [$directive],
                    'card' => $card,
                    'outputSpeech' => '你应该缴税121212',
                ];
            }

            if(!$this->getSlot('city')) {
                $card = new TextCard('这是来自于测试程序返回的结果,请问你在哪?');
                $this->nlu->ask('city');
                return [
                    'card' => $card,
                    'reprompt' => '这是来自于测试程序返回的结果,请问你在哪?',
                    'outputSpeech' => '这是来自于测试程序返回的结果,请问你在
哪?',
                ];
            }else{
                $this->nlu && $this->nlu->setDelegate();
            }
        });
    }
}

挺简单吧。只要照猫画虎就可以实现自己的技能服务。

4.2 主要方法讲解

4.2.1 监听意图

$this->addHandler('#test.inquiry888', function(){
或$this->addIntentHandler('意图标识名')

还记得创建意图时自己填写的意图标识名吗?这里就有用了,这里用来监听你的意图。

4.2.2 获取槽位值

$this->getSlot('槽位标识')

这个方法获取槽位的值,还记得自己意图中的槽位吧,这个方法就会获取到我们意图中的槽位值(也就是我们自定义的词典中的值)

4.2.3 询问槽位

$this->nlu->ask('槽位标识')

这个方法用来询问槽位的值,如果通过getSlot方法没有获取到指定的槽位的值,可以使用此方法来询问用户

4.2.4 槽位信息填充完

确认意图中的槽位信息都填充完,调用

$this->request->isDialogStateCompleted()

当槽位信息都填充完后,我们就可以使用槽位的值来进行自己的业务逻辑了,比如查询信息、控制设备、播放音频等

4.2.5 返回数据

return [
       'card' => $card,
       'reprompt' => '这是来自于测试程序返回的结果,请问你在哪?',
       'outputSpeech' => '这是来自于测试程序返回的结果,请问你在
哪?',
];

当意图处理完后,我们就可以返回信息了。返回数据格式请移步文档。到此PHP SDK就讲解到这里,我的技能就是使用demo改写的。

5、服务配置

我使用的是百度的BAE服务,如何购买BAE服务这里就不多讲了,请移步百度云,BAE我选的是PHP环境,我的配置如下:

image.png

将服务器端的代码下载下来,默认会有app.conf、index.php两个文件。


6、自己的技能

在代码目录创建src目录

midr src

将vendor/dueros/bot-sdk/samples/bae-sample/src的Bot.php文件拷贝到src目录。

cp vendor/dueros/bot-sdk/samples/bae-sample/src/Bot.php ./src

如步骤4所写的,我们只需要修改下意图标识名改为自己的意图标识名,再修改获取的槽位标识名为自己槽位标示名等即可完成自己的技能。完成后将代码提交的服务器并部署就可以测试自己的技能了。


7、代码分享

class Bot extends \Baidu\Duer\Botsdk\Bot{
    /**
     * @param null
     * @return null
     **/
    public function __construct($postData = []) {
        parent::__construct($postData);

        $this->addHandler('LaunchRequest', function(){
            $this->waitAnswer();
            $card = new TextCard('欢迎使用家居控制!请告诉我您要查找什么智能设备,比如"查找我的空调"');
            return [
                   'card' => $card,
	            'outputSpeech' => '欢迎使用家居控制!请告诉我您要查找什么智能设备,比如"查找我的空调"',
	    ];
        });

        /**
        * 查找我的设备
        */
        $this->addIntentHandler('dueros.device_interface.smart_device.search', function(){
            if (!$this->getSlot('deviceName')) {
                # code...
                $this->nlu->ask('deviceName');
                $card = new TextCard('您要查找什么智能设备呢? 比如"查找我的空调"');
                return [
                    'card' => $card,
                    'outputSpeech' => '您要查找什么智能设备呢? 比如"查找我的空调"',
                ];
            }else{
                $deviceName = $this->getSlot('deviceName');
                $text = '已查到卧室和客厅的智能' . $deviceName .',请告诉我要控制哪里的'. $deviceName.'呢? 比如"控制卧室的'. $deviceName .'"';
                $card = new TextCard($text);
                return [
                    'card' => $card,
                    'outputSpeech' => ''. $text .'',
                ];
            }
        });
        
        /**
        * 控制哪里的设备
        */
        $this->addIntentHandler('dueros.device_interface.smart_device.control', function(){

            if (!$this->getSlot('location')) {
                # code...
                $this->nlu->ask('location');
                $deviceName = $this->getSlot('deviceName');
                $card = new TextCard('请告诉我要控制哪里的' . $deviceName . '呢?比如"控制卧室的空调"');

                return [
                    'card' => $card,
                    'outputSpeech' => '请告诉我要控制哪里的' . $deviceName . '呢?比如"控制卧室的空调"',
                ];
            }else{
                $card = new TextCard('请告诉您的指令,比如"调小空调风速、设置温度为30度');

                return [
                    'card' => $card,
                    'outputSpeech' => '请告诉您的指令,比如"调小空调风速、设置温度为30度',
                ];
            }

        });
        
        /**
        * 调节风速
        */
        $this->addIntentHandler('dueros.device_interface.smart_device.control_wind', function(){

            if($this->request->isDialogStateCompleted()) {

                //action 这里实现自己的业务逻辑

                //处理完返回给用户

                $location = $this->getSlot('location');
                $deviceName = $this->getSlot('deviceName');
                $deviceAction = $this->getSlot('device_action');
                $deviceFunction = $this->getSlot('device_function');
                $text = '您' . $location . $deviceName . '的'. $deviceFunction .'已经'. $deviceAction . ',你可以继续发送指令给我哦';
                $card = new TextCard($text);
                
                $this->endDialog();
                return [
                    'card' => $card,
                    'outputSpeech' => '' . $text .'',
                ];


            }

            if (!$this->getSlot('device_action')) {
                # code...
                $card = new TextCard('请问您要怎么控制设备呢,比如调小、调大');
                return [
                    'card' => $card,
                    'outputSpeech' => '请问您要怎么控制设备呢,比如调小、调大',
                ];

            }elseif (!$this->getSlot('device_function')) {
                # code...
                $card = new TextCard('请问您要控制设备的什么功能呢,比如风速');
                return [
                    'card' => $card,
                    'outputSpeech' => '请问您要控制设备的什么功能呢,比如风速',
                ];
            }

        });
      }
   }

代码比较简陋,勿喷哈!到此PHP SDK的讲解就到此了。希望能对大家有所帮助,同时欢迎大家踊跃点赞。


上一篇:

【Dueross|技能进修】家居控制-配置意图


【Dueross|技能进修】技能进修目录


【Dueross|开发日记Nov.】 Dueros、Python SDK开发日记目录


点赞  ( 0 )
收藏
评论(1)
共1条回复 最后由逐****g回复于2018-01-03 18:43
#2逐****g回复于2018-01-03 18:43:14

mark

0
TOP