
作者 | Tuan Nhu Dinh
译者 | Sambodhi
策划 | 蔡芳芳
转发链接:https://mp.weixin.qq.com/s/rDlzTKr-ArxrPpdErlRKfw
前言
本文演示了如何使用 Web Speech API 构建一个简单的人工智能聊天机器人。
在本教程中,我们将使用 80 行 JavaScript 代码在浏览器中构建一个虚拟助理(如 Siri 或 Google 助理)。你可以前往下方网址测试这款应用程序,它将会听取用户的语音命令,然后用合成语音进行回复。
https://nhudinhtuan.github.io/mysiri/
你所需要的是:
- Google Chrome(版本 25 以上)
- 一款文本编辑器
由于 Web Speech API 仍处于试验阶段,该应用程序只能在 受支持的浏览器 上运行:Chrome(版本 25 以上)和 Edge(版本 79 以上)。
我们需要构建哪些组件?
要构建这个 Web 应用程序,我们需要实现四个组件:
- 一个简单的用户界面,用来显示用户所说的内容和助理的回复。
- 将语音转换为文本。
- 处理文本并执行操作。
- 将文本转换为语音。
用户界面
第一步就是创建一个简单的用户界面,它包含一个按钮用来触发助理,一个用于显示用户命令和助理响应的 div、一个用于显示处理信息的 p组件。
const startBtn = document.createElement("button");
startBtn.innerHTML = "Startlistening";
const result = document.createElement("div");
const processing = document.createElement("p");
document.write("<body><h1>My Siri</h1><p>Give it a trywith'hello','how are you','what's yourname', 'whattimeisit', 'stop', ... </p></body>");
document.body.append(startBtn);
document.body.append(result);
document.body.append(processing);
语音转文本
我们需要构建一个组件来捕获语音命令并将其转换为文本,以进行进一步处理。在本教程中,我们使用 Web Speech API 的SpeechRecognition。由于这个 API 只能在受支持的浏览器中使用,我们将显示警告信息并阻止用户在不受支持的浏览器中看到 Start 按钮。
constSpeechRecognition =window.SpeechRecognition ||window.webkitSpeechRecognition;
if(typeofSpeechRecognition ==="undefined") {
startBtn.remove();
result.innerHTML ="<b>Browser does not support Speech API. Please download latest chrome.<b>";
}
我们需要创建一个 SpeechRecognition 的实例,可以设置一组各种 属性 来定制语音识别。在这个应用程序中,我们将 continuous 和interimResults 设置为 true,以便实时显示语音文本。
constrecognition =newSpeechRecognition();
recognition.continuous =true;
recognition.interimResults =true;
我们添加一个句柄来处理来自语音 API 的 onresult 事件。在这个处理程序中,我们以文本形式显示用户的语音命令,并调用函数 process 来执行操作。这个 process 函数将在下一步实现。
functionprocess(speech_text){
return"....";
}
recognition.onresult =event=>{
constlast = event.results.length -1;
constres = event.results[last];
consttext = res[0].transcript;
if(res.isFinal) {
processing.innerHTML ="processing ....";
constresponse = process(text);
constp =document.createElement("p");
p.innerHTML =`You said:${text}</br>Siri said:${response}`;
processing.innerHTML ="";
result.appendChild(p);
// add text to speech later
}else{
processing.innerHTML =`listening:${text}`;
}
}
我们还需要将 用户界面的 button 与 recognition 对象连接起来,以启动 / 停止语音识别。
let listening =false;
toggleBtn=()=>{
if(listening) {
recognition.stop();
startBtn.textContent ="Start listening";
}else{
recognition.start();
startBtn.textContent ="Stop listening";
}
listening = !listening;
};
startBtn.addEventListener("click", toggleBtn);
处理文本并执行操作
在这一步中,我们将构建一个简单的会话逻辑并处理一些基本操作。助理可以回复“hello”、“what's your name?”、“how are you?”、提供当前时间的信息、“stop”听取或打开一个新的标签页来搜索它不能回答的问题。你可以通过使用一些 AI 库进一步扩展这个process 函数,使助理更加智能。
functionprocess(rawText){
// remove space and lowercase text
lettext = rawText.replace(/\s/g,"");
text = text.toLowerCase();
letresponse =null;
switch(text) {
case"hello":
response ="hi, how are you doing?";break;
case"what'syourname":
response ="My name's Siri.";break;
case"howareyou":
response ="I'm good.";break;
case"whattimeisit":
response =newDate().toLocaleTimeString();break;
case"stop":
response ="Bye!!";
toggleBtn();// stop listening
}
if(!response) {
window.open(`http://google.com/search?q=${rawText.replace("search","")}`,"_blank");
return"I found some information for "+ rawText;
}
returnresponse;
}
文本转语音
在最后一步中,我们使用 Web Speech API 的 speechSynthesis 控制器为我们的助理提供语音。这个 API 简单明了。
speechSynthesis.speak(newSpeechSynthesisUtterance(response));
就是这样!我们只用了 80 行代码就有了一个很酷的助理。程序的演示可以在下方链接中找到。
https://nhudinhtuan.github.io/mysiri/
// UI comp
conststartBtn =document.createElement("button");
startBtn.innerHTML ="Start listening";
constresult =document.createElement("div");
constprocessing =document.createElement("p");
document.write("<body><h1>My Siri</h1><p>Give it a try with 'hello', 'how are you', 'what's your name', 'what time is it', 'stop', ... </p></body>");
document.body.append(startBtn);
document.body.append(result);
document.body.append(processing);
// speech to text
constSpeechRecognition =window.SpeechRecognition ||window.webkitSpeechRecognition;
lettoggleBtn =null;
if(typeofSpeechRecognition ==="undefined") {
startBtn.remove();
result.innerHTML ="<b>Browser does not support Speech API. Please download latest chrome.<b>";
}else{
constrecognition =newSpeechRecognition();
recognition.continuous =true;
recognition.interimResults =true;
recognition.onresult =event=>{
constlast = event.results.length -1;
constres = event.results[last];
consttext = res[0].transcript;
if(res.isFinal) {
processing.innerHTML ="processing ....";
constresponse = process(text);
constp =document.createElement("p");
p.innerHTML =`You said:${text}</br>Siri said:${response}`;
processing.innerHTML ="";
result.appendChild(p);
// text to speech
speechSynthesis.speak(newSpeechSynthesisUtterance(response));
}else{
processing.innerHTML =`listening:${text}`;
}
}
letlistening =false;
toggleBtn =()=>{
if(listening) {
recognition.stop();
startBtn.textContent ="Start listening";
}else{
recognition.start();
startBtn.textContent ="Stop listening";
}
listening = !listening;
};
startBtn.addEventListener("click", toggleBtn);
}
// processor
functionprocess(rawText){
lettext = rawText.replace(/\s/g,"");
text = text.toLowerCase();
letresponse =null;
switch(text) {
case"hello":
response ="hi, how are you doing?";break;
case"what'syourname":
response ="My name's Siri.";break;
case"howareyou":
response ="I'm good.";break;
case"whattimeisit":
response =newDate().toLocaleTimeString();break;
case"stop":
response ="Bye!!";
toggleBtn();
}
if(!response) {
window.open(`http://google.com/search?q=${rawText.replace("search","")}`,"_blank");
return`I found some information for${rawText}`;
}
returnresponse;
}
×
Drag and Drop
The image will be downloaded
推荐JavaScript学习相关文章
《玩转前端 Video *放播**器 》
《纯JavaScript实现HTML5 Canvas 6种特效滤镜 》
《使用reveal.js制作精美的网页版PPT 》
《15个简单的JS编码标准让你的代码更整洁》
《Node 中的全链路式日志标记及处理》
《使用 Node 开发服务器项目时如何高效地打日志?》
《一文带你搞懂前端如何玩转 Word 文档》
《高频面试题:JavaScript事件循环机制解析》
《手写一个Promise/A+ 完美通过官方872个测试用例》
《你不知道的前端图片处理(上)》
《你不知道的前端图片处理(下)》
《钉钉前端-如何设计前端实时分析及报警系统》
《前端实现最佳截图方案(上)》
《前端实现最佳截图方案(下)》
《Node.js 实现抢票小工具&短信通知提醒(上)「干货」》
《Node.js 实现抢票小工具&短信通知提醒(下)「干货」》
《那些不常见,但却非常实用的JS知识点(上)》
《那些不常见,但却非常实用的JS知识点(下)》
《如何为团队定制自己的 Node.js 框架?》
《细品原生JS从初级到高级知识点汇总(一)》
《细品原生JS从初级到高级知识点汇总(二)》
《细品原生JS从初级到高级知识点汇总(三)》
《细品原生JS从初级到高级知识点汇总(四)》
《学习 jQuery 源码整体架构,打造属于自己的 js 类库》
《细说RTSP实现前端直播流探索记「干货」》
《一文带你搞懂前端登陆设计》
《使用 Node.js 将图片中的苹果变成橘子「实践」》
《基于Canvas实现的高斯模糊(上)「JS篇」》
《基于Canvas实现的高斯模糊(下)「JS篇」》
《由浅入深,66条JavaScript面试知识点(一)》
《由浅入深,66条JavaScript面试知识点(二)》
《由浅入深,66条JavaScript面试知识点(三)》
《由浅入深,66条JavaScript面试知识点(四)》
《由浅入深,66条JavaScript面试知识点(五)》
《由浅入深,66条JavaScript面试知识点(六)》
《由浅入深,66条JavaScript面试知识点(七)》
作者 | Tuan Nhu Dinh
译者 | Sambodhi
策划 | 蔡芳芳
转发链接:https://mp.weixin.qq.com/s/rDlzTKr-ArxrPpdErlRKfw