答案是肯定的。

全栈措辞JavaScript

就全栈编程措辞而言,与python 并驾齐驱的要算是JavaScript了:

基于JavaScript的前端框架百花齐放,Vue、React、Angular都有广泛的运用;

用JavaScript打造AI应用从Nodejs SDK 看DuerOS的技能开拓

桌面运用有NW.js(Node +webkit),以及现在的Electron;

嵌入式系统中,也有着Espruino(被称为微掌握器的 JavaScript),Tessel (一个集成了Wi-Fi的JavaScript 微处理器)以及海内的ruff.io,详见拙文《探索嵌入式运用框架(EAF)》;

后台做事基本上便是Nodejs的天下,有着丰富的工具集;

在人工智能领域,就机器学习而言,Javascript也有着诸多的开源框架,TensorFlow.js, Brain.js , Synaptic.js等

......

关于JavaScript 的一些编程根本,可以拜会《全栈必备JavaScript根本》。

那对付JavaScript的开拓者如何开拓人工智能干系的运用呢?

这还是须要明确详细的运用处景,但是人工智能操作系统(可拜会《感知人工智能操作系统》一文)的产生扩大了AI运用的领域。
就对话式AI系统(例如DuerOS)而言,平台化更是Javascript开拓者的福音。
基于AI操作系统和开拓平台,Javascript开拓者可以更加高效地开拓AI运用。

DuerOS 的 Nodejs 运用示例

关于DuerOS的详细先容,可以拜会《面向接口/协议?看DuerOS的技能开拓》,当然对NLP的更多理解(可以拜会《感知自然措辞理解(NLU)》一文),对付开拓对话式AI系统上的技能运用,是大有裨益的。
DuerOS供应的Javascript支持是开拓技能做事(Skill Bot)的SDK,采取npm加载 , 支持node.js 6.10及以上版本。

构建一个DuerOS的技能做事,一样平常如下步骤:

1)在DBP(DuerOS Bot Platform)创建并配置技能做事

2)构建基于Nodejs的开拓环境

3)创建web做事及调用入口

4)编辑详细的业务逻辑

5)调试后发布技能做事

关于在DBP平台创建和配置技能,以及调试和发布技能,可以详细拜会官网解释dueros.baidu.com/dbp。

环境构建

基于DuerOS的技能做事开拓,基本上只须要安装Node,Javascript bot SDK,以及相应的httpserver模块例如express,koa等,就可以完成开拓环境的搭建:

cd /myworkspace

mkdir js-bot-test

cd js-bot-test

npm init

npm install express --save

npm install bot-sdk --save

Web 做事入口

和Java 开拓技能做事类似(拜会《从Java SDK看DuerOS的技能开拓》),须要创建一个做事启动的入口,在这里是index.js:

const express = require('express');

const Bot = require('./Bot');

let myapp = express();

myapp.post('/', (req, res) => {

req.rawBody = '';

req.setEncoding('utf8');

req.on('data', chunk => {

req.rawBody += chunk;

});

req.on('end', () => {

let mybot = new Bot(JSON.parse(req.rawBody));

mybot.run().then(result => {

res.send(result);

});

});

}).listen(8888);

利用express 构建了一个监听8888端口的web做事,完成与DuerOS平台之间的通信,在生产环境中,要增加证书的验证。

编写Bot的业务逻辑

最主要的,须要创建详细的技能做事,实现详细的业务逻辑,示例的Bot.js 文件组织构造如下:

const BaseBot = require('bot-sdk');

class Bot extends BaseBot {

constructor(postData) {

super(postData);

//做事入口要求的处理

this.addLaunchHandler(() => {

return {

outputSpeech: '欢迎利用!'

};

});

//干系意图处理

this.addIntentHandler('myintent1', () => {

let targetSlot1 = this.getSlot('slot1');

// 意图1 的逻辑处理以及槽位添补,return 相应的 directives 和 outspeech等

});

this.addIntentHandler('myintent1', () => {

let targetSlot2 = this.getSlot('slot2');

});

//事宜处理

this.addEventListener(‘event1’,() => {

//对付于事宜1的干系处理,return 相应的 directives 和 outspeech等

});

//......

// 退出会话

this.addSessionEndedHandler(function({

// clear status

// 清空状态,结束会话。

return null;

});

}

//其他业务逻辑的干系方法

紧张的框架还是对话的开启和关闭,以及对意图和事宜的处理。
所有的逻辑处理函数的返回结果可以是json Object 也可以是Promise包裹的json Object。

至此,就可以运行做事来调试技能了,一旦验证完成,即可在DBP 发布自己的技能了。

DuerOS Javascript Bot SDK 代码浅析

“磨刀不误砍柴功”,理解JS Bot SDK的源代码,对基于Nodejs开拓DuerOS的技能做事大有裨益。

在github上bot-sdk-node.js/lib/ 的目录下,是JS bot sdk 的核心代码,紧张是6个文件:

Bot.js

Certificate.js

NLU.js

Request.js

Response.js

session.js

NLU 模块

NLU 模块紧张完成槽位的设置\获取\确认,以及通过ask()方法完成槽位添补。
同时,可以获取意图的名称并确认意图及确认意图状态。
须要把稳的是setDelegate()方法的利用,只有在DBP平台完成了意图配置,setDelegate()才有效,该方法只是将明确的意图判断交给了DuerOS代为处理。

Session 模块

正像《面向接口/协议?看DuerOS的技能开拓》一文中指出的,Session 和浏览器中的cookie 非常类似,用于在客户端和做事器之间通报持久化数据。
Javascript bot sdk 中的Session 模块紧张供应了getData()和setData()两个方法,用于存储/读取key/value形式的数据。

Certificate 模块

安全性一贯是DuerOS 平台所关注的一个主要方面,在DuerOS 与技能做事bot之间是安全通信,只管在技能调试的时候可以关闭证书的验证。
Certificate 模块通过enableVerifyRequestSign()方法开启验证要求参数署名,阻挡造孽要求, disableVerifyRequestSign()关闭验证要求参数署名,verifyRequest()验证发送要求者是否合法。
关于DBP 平台的安全性,可以往后专门研究谈论。

Request 模块

Request 模块完成了对DBP协议request 要求的封装,紧张功能包括:

获取数据工具:getData(),getSession(),getNlu()

根据高下文获取终端状态信息和事宜信息:getAudioPlayerContext(),getVideoPlayerContext(), getScreenContext() 和getEventData()

获取用户信息: getUserId(),getQuery(),getLocation()

获取运用信息: getBotId(),getApiAccessToken() ,getApiEndPoint() ,getExternalAccessTokens()

判断对话状态:isLaunchRequest() ,isSessionEndedRequest() ,isDialogStateCompleted()

Response 模块

Response 模块完成了对DBP协议Response相应的封装,紧张功能包括:

返回结果封装:buildResult(data),buildResult(data),defaultResult()是默认结果

对话干系:setShouldEndSession(),

非常处理:illegalRequest(),setFallBack() 是兜底话术

麦克风掌握: setExpectSpeech(expectSpeech)

设置指令次序:setAutoDirectivesArrangement(),setStrictDirectivesArrangement()

设置expectResponse:addExpectTextResponse(text), addExpectSlotResponse(slot)

expectResponse用于推测用户可能的回答,开拓者的技能Bot在相应DuerOS要求时,可以添加expectResponse 信息,见告DuerOS用户不才次交互时可能话术的某些关键词,DuerOS将不才一轮对话中提高语音识别能力,进而提高了意图的准确性,从而提高了用户利用该技能的用户体验。

还有一个语音播报干系的方法formatSpeech(mix) ,该方法自动识别SSML和纯文体,其余在extension 目录下还有还TTS干系的模块,往后可以对TTS和SSML做更多的磋商。

Bot模块

Bot 模块是所有技能bot的基类,实现了一个范例技能做事的根本功能和逻辑框架。
Bot 类的布局函数如下:

constructor(postData) {

this.request = new Request(postData);

this.session = this.request.getSession();

this.nlu = this.request.getNlu();

this.response = new Response(this.request, this.session, this.nlu);

this._eventHandler = new Map();

this._intentHandler = new Map();

this.botMonitor = new BotMonitor(postData);

}

Bot的布局以request为参数,完成对request,NLU和Session的获取,天生Response工具,创建意图和事宜的处理映射,并且构建了技能做事的监控器。

Bot 类中的紧张方法分类如下:

对话干系:addLaunchHandler(handler) ,addSessionEndedHandler(handler) ,waitAnswer() ,endDialog()

意图干系:addIntentHandler(intent, handler),getIntentName(),getSlot(field, index = 0), setSlot(field, value, index = 0)

事宜干系:addDefaultEventListener(handler)

安全干系:initCertificate(headers, body),setPrivateKey(filename)

会话干系:endSession() ,getSessionAttribute(field = null, defaultValue = null),setSessionAttribute(field, value, defaultValue = null)和setSessionAttribute(field, value, defaultValue = null),

设备属性判断:isSupportDisplay(),isSupportAudioPlayer(),isSupportVideoPlayer()

对Response中expectResponse的封装:addExpectSlotResponse(slot)

运用干系,对request中的方法封装: getApiAccessToken(),getApiEndPoint() ,sendMateappNotification(data)

用户干系:getUserProfile(),getRecordSpeech(audioToken),getDeviceLocation()

Run()方法是Bot 实行的主体,流程如下:

为了简洁起见,流程图中忽略了botMonitor的干系操作。

其余, Bot类中还实现了对音视频播放器指令,以及展示卡片和模版的处理。

Directive 指令实现

DuerOS JS Bot SDK 对DBP协议中的Directive指令实现了较为完全的封装。
所有的指令都派生自BaseDirective类,指令的种类包括:

启动app指令

录音指令

支付指令

授权指令

音频播放器指令

视频播放器指令

显示指令及干系模版

指令干系源代码位于https://github.com/dueros/bot-sdk-node.js/tree/master/lib/directive。

展示模版和卡片

针对有屏设备,DuerOS Bot SDK 供应了较为丰富的展现模版和展示卡片。

展现模板分body template和list template两种类型。
个中body template由图片和笔墨组成,list template由一系列list item组成,每个list item由图片和笔墨组成。
不同的展现模板适宜不同的场景,开拓者可以根据技能展现的需求选择得当的模板。
模版指令示意如下:

{

\公众directives\公众: [

{

\"大众type\"大众: \"大众Display.RenderTemplate\公众,

\公众template\公众: {

\公众type\"大众: \公众{{STRING}}\公众,

\"大众token\"大众: \"大众{{STRING}}\"大众,

\"大众backgroundImage\公众: {{ImageStructure}},

\公众title\"大众: \"大众{{STRING}}\公众,

\公众textContent\公众: {

\"大众position\"大众: \公众{{ENUM}}\公众,

\"大众text\"大众: {{TextStructure}}

}

}

}

]

}

当技能做事回答用户的时候,可以通过利用卡片形式来展现更生动、丰富的内容。
常用的展现卡片类型有文本卡片、标准卡片、标准列表卡片、图片卡片。
展现卡片随Response一起发送给DuerOS。
卡片在response中的json格式如下:

\公众card\公众: {

\"大众type\公众:\"大众txt\"大众,

\公众token\公众:\公众{{STRING}}\"大众,

\"大众content\"大众:\"大众{{STRING}}\公众,

\"大众url\"大众:\"大众{{STRING}}\"大众,

\"大众anchorText\"大众: \公众{{STRING}}\"大众,

\"大众cueWords\"大众:[

\"大众{{STRING}}\公众,

\公众{{STRING}}\"大众,

\"大众{{STRING}}\"大众,

...

]

}

针对展现模版和展示卡片,github上给出了比较详细的示例,在DuerOS官网上则给出了详细的布局示意例子。

示例代码

作为一个Javascript开拓者,如果开拓基于DuerOS的技能做事的话, 从示例代码开始每每是个不错的选择。
在github上,给出了10多个示例代码,有音乐播放的技能做事,个税打算器,历史上的本日等等。