新知榜官方账号
2023-09-19 00:27:02
本文介绍如何用WebSpeechAPI和Node.js创建一个简单的AI聊天机器人,通过Socket.IO实现浏览器和服务器之间实时双向交流,使用API.AI进行自然语言处理,最终实现与AI进行交互的功能。
首先,我们要用Node.js搭建一个Web应用框架。创建你的应用目录,就像这样:
.├── index.js├── public│ ├── css│ │ └── style.css│ └── js│ └── script.js└── views └── index.html
然后,执行下面的命令来初始化你的Node.js应用:
$ npm init -f
-f
命令表示接受默认的配置(你也可以去掉,然后手动配置你的应用),这样会生成一个package.json
文件,包含一些基本信息。现在,安装下面的依赖库:
$ npm install express socket.io apiai --save
--save
命令将会在package.json
中自动更新依赖。我们将要使用Express库,一个Node.js写的Web应用服务框架,可以在本地运行服务器。为了实现在浏览器和服务器之间实时双向交流,我们将会使用Socket.IO。同时,我们将会安装自然语音处理服务工具,API.AI用来构建一个AI聊天机器人。
用SpeechRecognition接口接收语音WebSpeechAPI有一个主要的控制接口,叫SpeechRecognition,从麦克风接收用户的语音并加以识别。创建用户界面这个应用的UI很简单:一个打开语音识别的按钮。打开index.html
,将前端的javascript文件(script.js
)和Socket.IO包含进去。
<html lang="en"> <head>…</head> <body> … <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.1/socket.io.js"></script> <script src="js/script.js"></script> </body></html>
然后,我们在body
中添加一个按钮:
<button>Talk</button>
为了让我们的按钮看起来像demo中的那样,我们需要在源代码中引用style.css
文件。
在script.js
中,调用SpeechRecognition的实例,WebSpeechAPI的控制接口:
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;const recognition = new SpeechRecognition();
我们同时使用了有前缀和没有前缀的对象,因为Chrome目前支持API的前缀属性。同时,我们使用了ECMAScript6语法,因为ES6,const
关键字和箭头函数以及SpeechAPI接口SpeechRecognition和SpeechSynthesis都在浏览器中支持。你可以随意地设置一些属性变量来自定义语音识别:
recognition.lang = 'en-US';recognition.interimResults = false;
然后,拿到按钮的DOM引用,监听点击事件来初始化语音识别:
document.querySelector('button').addEventListener('click', () => { recognition.start();});
一旦开始语音识别,就能用result
事件将刚刚说的话转成文本:
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…});
这将返回SpeechRecognitionResultList对象,你可以在这个对象的数组中得到文本结果。同时,你可以看到上面代码中返回的confidence
转录。
现在,是时候使用Socket.IO来向服务端发送文本了。用Socket.IO实时交互你可能会好奇为什么我们不用简单的HTTP或者AJAX来代替。你可以通过POST方法向服务端发送数据,但是,通过Socket.IO,我们使用WebSocket发送数据,因为socket是双向交流的最佳解决方案,尤其是当我们从服务端向浏览器推送事件时。通过持续的socket连接,我们不用重新加载浏览器或者频繁地持续发送AJAX请求。
在script.js
中实例化http://Socket.IO:
const socket = io();
然后插入你监听SpeechRecognition的result
事件代码:
socket.emit('chat message', text);
现在重新回到Node.js代码,接收这条文本,然后使用AI响应用户。
许多平台和服务都能够让你在应用中用语音-文本自然语言处理来集成AI系统,包括IBM的Watson,微软的LUIS和脸书的Wit.ai。为了快速构建对话界面,我们将使用API.AI,因为它提供了免费的开发者账户,让我们可以使它的Web接口和Node.js库快速地建立一个小型对话系统。
创建一个账户后,你就创建了一个“代理”。参考文档指南的第一步。接着,点击左边菜单的“SmallTalk”,然后开启启用服务选项。用API.AI界面自定义你的small-talk代理。点击菜单中你的代理名字旁边的齿轮图标,回到“基本设置”页面,拿到API密钥。你将会在Node.jsSDK中使用“客户端访问令牌”。
我们将使用Node.jsSDK来将我们的Node.js应用连接到API.AI。回到index.js
,用你的访问令牌初始化API.AI:
const apiai = require('apiai')(APIAI_TOKEN);
如果你只想在本地运行,你可以在这里硬编码你的API密钥。这里有几种方式来设置环境变量,但我通常使用.env
文件来声明变量。在GitHub中的源码中,我用.gitignore
隐藏了我的证书文件。但是你可以参考.env-test
文件看看它是如何设置的。
现在我们要用服务端的Socket.IO来接收浏览器的数据。一旦建立连接收到消息,使用API.AI的接口来响应用户:
io.on('connection', function(socket) { socket.on('chat message', (text) => { // Get a reply from API.AI let 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()
方法发送到客户端。
回到script.js
,用WebSpeechAPI的SpeechSynthesis控制器接口创建一个合成声音的函数。这个函数接收一个字符串参数,让浏览器读出文本:
function synthVoice(text) { const synth = window.speechSynthesis; const utterance = new SpeechSynthesisUtterance(); utterance.text = text; synth.speak(utterance);}
上面的代码首先创建了一个window.speechSynthesis
这个API接入点,你可能会注意到这次是没有前缀属性的,这个API比SpeechRecognition更广泛地被支持,所有的浏览器都弃用了SpeechSysthesis的前缀。接着创建了一个SpeechSynthesisUtterance()
,然后设置要被合成声音的文本。你可以设置其他的属性,比如voice
,来选择浏览器和操作系统支持的声音类型。最终调用SpeechSynthesis.speak()
来发出声音。
现在再次用Socket.IO来获得服务端响应,一旦消息收到了,就调用上面的函数。
socket.on('bot reply', function(replyText) { synthVoice(replyText);});
让我们来试试我们的AI机器人吧!
相关工具
相关文章
相关快讯
推荐
亲测真香!这6个AI工具让工作效率翻倍,同事追着问链接
2025-06-17 16:21
FLUX.1 Kontext 一出,AI生图领域 “地震” 了!
2025-06-06 15:38
用Deepseek写AI绘图提示词,像呼吸一样简单!
2025-02-19 16:12
你以为AI绘画是黑科技?其实早成了“路边摊生意”!
2025-02-19 10:15
Flux爆火,全网最全面最详细的Flux使用教程!
2025-02-18 14:19
用AI如何创作音乐,实战教学来啦!
2025-02-17 17:23
MidJourney让你秒变绘画大神,从零开始画哪吒!
2025-02-17 14:56
AI应用新境界:让人工智能成为你的得力助手
2025-02-14 15:45
AI短片革命:当创作遇上智能,人人都能成为导演
2025-02-14 14:53
AI狂潮下的人类职场:是失业危机还是进化契机?
2025-02-13 16:53