用WebAPI 和 Node.js 创建一个简单的 AI 聊天机器人
首先,我们要用 Node.js 搭建一个 Web 应用框架 。创建你的应用目录 , 就像这样:
.├── index.js├── public│├── css││└── style.css│└── js│└── script.js└── views└── index.html
然后 , 执行下面的命令来初始化你的 Node.js 应用:
nbsp;npm init -f
-f 命令表示接受默认的配置(你也可以去掉,然后手动配置你的应用),这样会生成一个 .json 文件,包含一些基本信息 。
现在,安装下面的依赖库:
nbsp;npm install express socket.io apiai --save
–save 命令将会在 .json 中自动更新依赖 。
我们将要使用库 , 一个 Node.js 写的 Web 应用服务框架 , 可以在本地运行服务器 。为了实现在浏览器和服务器之间实时双向交流,我们将会使用 .IO 。同时 , 我们将会安装自然语音处理服务工具,API.AI用来构建一个 AI 聊天机器人 。
.IO 是一个在 Node.js 中轻松使用的库 。通过在客户端和服务端建立连接,只要 WebAPI(语音消息)或者 API.AI API (AI 消息)返回了文本数据,我们的聊天信息就能在浏览器和服务器之间往返 。
现在,让我们创建 index.js 文件,并实例化以及监听服务器:
const express = require('express');const app = express();app.use(express.static(__dirname + '/views')); // htmlapp.use(express.static(__dirname + '/public')); // js, css, imagesconst server = app.listen(5000);app.get('/', (req, res) => {res.sendFile('index.html');});
下一步,我们将使用 WebAPI 集成前端代码 。
用接口接收语音
WebAPI 有一个主要的控制接口,叫 ,从麦克风接收用户的语音并加以识别 。
创建用户界面
这个应用的 UI 很简单:一个打开语音识别的按钮 。打开 index.html,将前端的 ja文件(.js)和 .IO包含进去 。
……
然后,我们在 body 中添加一个按钮:
为了让我们的按钮看起来像 demo 中的那样,我们需要在源代码中引用 style.css 文件 。
用 ja捕捉声音
在 .js 中 , 调用的实例,WebAPI 的控制接口:
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;const recognition = new SpeechRecognition();
我们同时使用了有前缀和没有前缀的对象,因为目前支持 API 的前缀属性 。
同时,我们使用了语法,因为 ES6,const 关键字和箭头函数以及API 接口和都在浏览器中支持 。
你可以随意地设置一些属性变量来自定义语音识别:
recognition.lang = 'en-US';recognition.interimResults = false;
然后,拿到按钮的 DOM 引用,监听点击事件来初始化语音识别:
document.querySelector('button').addEventListener('click', () => {recognition.start();});
一旦开始语音识别,就能用事件将刚刚说的话转成文本:
recognition.addEventListener('result', (e) => {let last = e.results.length - 1;let text = e.results[last][0].transcript;console.log('Confidence: ' + e.results[0][0].confidence);// We will use the Socket.IO here later…});
这将返回对象,你可以在这个对象的数组中得到文本结果 。同时,你可以看到上面代码中返回的转录 。
现在,是时候使用 .IO 来向服务端发送文本了 。
用 .IO 实时交互
你可能会好奇为什么我们不用简单的 HTTP 或者 AJAX 来代替 。你可以通过 POST 方法向服务端发送数据,但是,通过 .IO,我们使用发送数据 , 因为是双向交流的最佳解决方案,尤其是当我们从服务端向浏览器推送事件时 。通过持续的连接,我们不用重新加载浏览器或者频繁地持续发送 AJAX 请求 。
在 .js 中实例化 :
const socket = io();
然后插入你监听的事件代码:
socket.emit('chat message', text);
现在重新回到 Node.js 代码,接收这条文本,然后使用 AI 响应用户 。
从 AI 中得到答复
许多平台和服务都能够让你在应用中用语音-文本自然语言处理来集成 AI 系统,包括 IBM 的 ,微软的 LUIS 和 脸书的 Wit.ai 。为了快速构建对话界面,我们将使用 API.AI , 因为它提供了免费的开发者账户,让我们可以使它的 Web 接口和 Node.js 库快速地建立一个小型对话系统 。
设置 API.AI
创建一个账户后,你就创建了一个“代理” 。参考文档指南的第一步 。
接着,点击左边菜单的 “Small Talk”,然后开启启用服务选项 。
用 API.AI 界面自定义你的 small-talk 代理 。
点击菜单中你的代理名字旁边的齿轮图标,回到 “基本设置” 页面 , 拿到 API 密钥 。你将会在 Node.js SDK 中使用“客户端访问令牌” 。
使用 API.AI
我们将使用 Node.js SDK 来将我们的 Node.js 应用连接到 API.AI 。回到 index.js,用你的访问令牌初始化 API.AI:
const apiai = require('apiai')(APIAI_TOKEN);
如果你只想在本地运行,你可以在这里硬编码你的 API 密钥 。这里有几种方式来设置环境变量,但我通常使用 .env 文件来声明变量 。在中的源码中css如何做一个提交按钮,我用 . 隐藏了我的证书文件 。但是你可以参考 .env-test 文件看看它是如何设置的 。
现在我们要用服务端的 .IO 来接收浏览器的数据 。
一旦建立连接收到消息css如何做一个提交按钮,使用 API.AI 的接口来响应用户:
io.on('connection', function(socket) {socket.on('chat message', (text) => {// Get a reply from API.AIlet apiaiReq = apiai.textRequest(text, {sessionId: APIAI_SESSION_ID});apiaiReq.on('response', (response) => {let aiText = response.result.fulfillment.speech;socket.emit('bot reply', aiText); // Send the result back to the browser!});apiaiReq.on('error', (error) => {console.log(error);});apiaiReq.end();});});当 API.AI 返回结果后,用 Socket.IO 的 socket.emit() 方法发送到客户端 。
用接口让 AI 发出声音
回到 .js,用 WebAPI 的控制器接口创建一个合成声音的函数 。这个函数接收一个字符串参数,让浏览器读出文本:
function synthVoice(text) {const synth = window.speechSynthesis;const utterance = new SpeechSynthesisUtterance();utterance.text = text;synth.speak(utterance);}
上面的代码首先创建了一个 . 这个 API 接入点,你可能会注意到这次是没有前缀属性的 , 这个 API 比更广泛地被支持,所有的浏览器都弃用了的前缀 。
接着创建了一个 ance() ,然后设置要被合成声音的文本 。你可以设置其他的属性 , 比如 voice,来选择浏览器和操作系统支持的声音类型 。最终调用 .speak() 来发出声音 。
现在再次用 .IO 来获得服务端响应,一旦消息收到了,就调用上面的函数 。
socket.on('bot reply', function(replyText) {synthVoice(replyText);});
让我们来试试我们的 AI 机器人吧!
【创建简单聊天AI机器人】本文到此结束,希望对大家有所帮助 。
- 圣诞巧克力蛋糕怎么做好吃又简单
- ?除床虱最简单的方法
- 简单的家常菜素菜做法大全 ?家常菜有哪些 简单的素菜
- 新鲜地瓜怎么吃好吃又简单
- 简单又好吃的羊肉做法 ?白萝卜炖羊肉的做法
- 小孩鼻窦炎鼻塞怎么办最简单方法 ?小孩鼻炎总是鼻塞怎么办
- 女生聊天发微笑表情什么意思 ?女生回复一个微笑表情是啥意思
- ?情侣怎么聊天才不无聊,聊天时总是呆板无趣
- 1分钟合并100份Word文件居然这么简单?不用代码或插件,只需两步
- ?早上该怎么和喜欢的人聊天,早上起来该怎么和喜欢的女生聊天