前面讲解了如何配置技能的意图、常用表达语、创建槽位、创建字典。接下来讲解技能平台的服务端开发,撸起袖子,撸代码的时间又到了。
1、回顾上文
上一篇结尾讲解到了配置服务,如下图:
如果自己没有服务器只能选择CFC来调试自己的技能了。今天先讲解如何在自己的服务器上使用PHP SDK来调试自己的技能。后面陆续会讲解Node.js以及百度CFC上Node.js的使用。
2、安装PHP SDK
2.1 点击上图的“PHP SDK 技术文档”链接查看文档。
如文档所述:PHP版本的SDK采用PSR-4规范自动加载,执行如下命令进行安装。
composer require dueros/bot-sdk
执行此命令我猜你会出问题,哈哈因为你没有安装composer。
2.2 安装composer
请移步到composer官网或composer中文网查看各个系统的安装教程,安装过程有点慢,请耐心等待。安装完composer后即可下载bot-sdk了
3、SDK目录
vendor目录里面是PHP SDK的全部内容,
cd vendor/dueros/bot-sdk
ll
上面是bot-sdk目录结构,这里我们主要看下samples目录,里面有栗子哦。
我们来看下BAE的例子,我们进入查看下目录结构
cd bae-sample
好了,这里我们最关心的其实四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环境,我的配置如下:
将服务器端的代码下载下来,默认会有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的讲解就到此了。希望能对大家有所帮助,同时欢迎大家踊跃点赞。
上一篇: