在本教程中,我们将使用 80 行 JavaScript 代码在浏览器中构建一个虚拟助理(如 Siri 或 Google 助理)。你可以在这里测试这款应用程序,它将会听取用户的语音命令,然后用合成语音进行回复。
你所需要的是:
Google Chrome(版本 25 以上)
一款文本编辑器
由于 Web Speech API 仍处于试验阶段,该应用程序只能在受支持的浏览器上运行:Chrome(版本 25 以上)和 Edge(版本 79 以上)。
我们需要构建哪些组件?
要构建这个 Web 应用程序,我们需要实现四个组件:
一个简单的用户界面,用来显示用户所说的内容和助理的回复。
将语音转换为文本。
处理文本并执行操作。
将文本转换为语音。
用户界面
第一步就是创建一个简单的用户界面,它包含一个按钮用来触发助理,一个用于显示用户命令和助理响应的 div
、一个用于显示处理信息的 p
组件。
const startBtn = document.createElement("button");
startBtn.innerHTML = "Start listening";
const result = document.createElement("div");
const processing = 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);
语音转文本
我们需要构建一个组件来捕获语音命令并将其转换为文本,以进行进一步处理。在本教程中,我们使用 Web Speech API 的 SpeechRecognition
。由于这个 API 只能在受支持的浏览器中使用,我们将显示警告信息并阻止用户在不受支持的浏览器中看到 Start 按钮。
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
if (typeof SpeechRecognition === "undefined") {
startBtn.remove();
result.innerHTML = "<b>Browser does not support Speech API. Please download latest chrome.<b>";
}
我们需要创建一个 SpeechRecognition
的实例,可以设置一组各种属性来定制语音识别。在这个应用程序中,我们将 continuous
和 interimResults
设置为 true
,以便实时显示语音文本。
const recognition = new SpeechRecognition();
recognition.continuous = true;
recognition.interimResults = true;
我们添加一个句柄来处理来自语音 API 的 onresult
事件。在这个处理程序中,我们以文本形式显示用户的语音命令,并调用函数 process
来执行操作。这个 process
函数将在下一步实现。
function process(speech_text) {
return "....";
}
recognition.onresult = event => {
const last = event.results.length - 1;
const res = event.results[last];
const text = res[0].transcript;
if (res.isFinal) {
processing.innerHTML = "processing ....";
const response = process(text);
const p = 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
函数,使助理更加智能。
function process(rawText) {
// remove space and lowercase text
let text = rawText.replace(/\s/g, "");
text = text.toLowerCase();
let response = 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 = new Date().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;
}
return response;
}
文本转语音
在最后一步中,我们使用 Web Speech API 的 speechSynthesis
控制器为我们的助理提供语音。这个 API 简单明了。
speechSynthesis.speak(new SpeechSynthesisUtterance(response));
就是这样!我们只用了 80 行代码就有了一个很酷的助理。程序的演示可以在这里找到。
// UI comp
const startBtn = document.createElement("button");
startBtn.innerHTML = "Start listening";
const result = document.createElement("div");
const processing = 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
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
let toggleBtn = null;
if (typeof SpeechRecognition === "undefined") {
startBtn.remove();
result.innerHTML = "<b>Browser does not support Speech API. Please download latest chrome.<b>";
} else {
const recognition = new SpeechRecognition();
recognition.continuous = true;
recognition.interimResults = true;
recognition.onresult = event => {
const last = event.results.length - 1;
const res = event.results[last];
const text = res[0].transcript;
if (res.isFinal) {
processing.innerHTML = "processing ....";
const response = process(text);
const p = document.createElement("p");
p.innerHTML = `You said: ${text} </br>Siri said: ${response}`;
processing.innerHTML = "";
result.appendChild(p);
// text to speech
speechSynthesis.speak(new SpeechSynthesisUtterance(response));
} else {
processing.innerHTML = `listening: ${text}`;
}
}
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);
}
// processor
function process(rawText) {
let text = rawText.replace(/\s/g, "");
text = text.toLowerCase();
let response = 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 = new Date().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}`;
}
return response;
}
×
Drag and Drop
The image will be downloaded
作者介绍:
Tuan Nhu Dinh,Facebook 软件工程师。
原文链接:
https://medium.com/swlh/build-your-own-hi-siri-with-80-lines-of-javascript-code-653540c77502
更多内容推荐
Android 自定义控件开发入门与实战(17)手势检测
onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上拖动事件。无论是用手拖动View,还是以抛的动作滚动,都会多次触发这个函数,在ACTION_MOVE动作发生时就会触发该函数
2021-11-07
开篇词|带你亲证 AI 应用开发的“奇点”时刻
面向 AI 时代,所有产品都值得用大模型重新升级。
2023-09-11
01|LangChain 系统安装和快速入门
LangChain 是一个全方位的、基于大语言模型这种预测能力的应用开发工具。
2023-09-11
移动 WEB 开发会用到的 5 个 API
作为开发人员,经常使用 Web API 来轻松实现复杂的功能,或者创建它们来抽象复杂性。Web API 允许服务之间进行对话,分享信息到朋友圈或显示地图等操作。
2021-09-13
3. ORM 框架概览:GORM 和 Ent 分析
2023-09-26
云小课|ModelArts Pro 视觉套件 零代码构建视觉 AI 应用
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。
2021-08-30
26|Visual ChatGPT 是如何做到边聊边画的?
Visual ChatGPT是如何做到边聊边画的?
2023-05-10
21|DID 和 PaddleGAN:表情生动的数字人播报员
DID和PaddleGAN
2023-04-24
Android6,阿里 P8 大佬亲自教你
| SENSORS | android.permission.BODY_SENSORS | || SMS | android.permission.SEND_SMS | || | android.permission.RECEIVE_SMS | || | android.permission.READ_SMS | || | android.permission.RECEIVE_WAP_PUSH | || | android.permission.RECEI
2021-11-02
机器学习无忧入门指南
驱动的应用程序可能是一件痛苦的事。对此我深有感触。我曾忍受了很多痛苦,因为使用这一技术所付出的代价往往是值得的。
架构师训练营 Week 03 关于反应式 Web 框架 Flower
反应式Web框架Flower的基本原理
2020-06-19
Ajax 之战:XMLHttpRequest 与 Fetch API
在本文中,我们将研究早期 XMLHttpRequest 和现代 Fetch 的优缺点,以确定哪种 Ajax API 最适合你的应用。
语音编程,软件开发领域的下一个前沿技术?
也许在将来,脑机接口会直接将你所想的内容转换成代码,或者说是软件本身。
13|代理(下):结构化工具对话、Self-Ask with Search 以及 Plan and execute 代理
趁热打铁,学习几种更为复杂的代理。
2023-09-28
语音信号处理 1:语音信号处理的发展
语音信号处理的研究工作最早可以追溯到1876年贝尔发明的电话,它首次完成了用声电—电声转换来实现远距离传输语音的技术。1939年,Dudley研制成功了第一个声码器,从此奠定了语音产生模型的基础,这一工作在语音信号处理领域具有划时代的意义。1947年,贝尔实
2021-12-21
Meta 宣布 CAIRaoke 项目:通过在对话式人工智能方面的突破打造未来语音助手
一种端到端的神经模型,它能支持更加个性化和上下文的对话。
JavaScript 事件捕获和事件冒泡
打开一个用户不能进行交互的网页,无论怎么点击网页都不会给出反应,要让网页和用户产生交互就会产生各种不同的事件。比如鼠标点击,鼠标滚动,键盘输入这些都是事件,在网页上发生的事件,触发之后并不会见到结束,而会触发事件流
2022-11-08
10 个不那么知名但很实用的 Web API
在本文中,我将介绍 10 个不那么流行的 Web API。不那么流行并不意味着它们没有用处。你可以在项目的各种用例中使用它们。
通过置信评分与更高准确率,在 Amazon Lex 上构建高质量对话服务
虽然人们在与机器人交互时,使用的词语往往不那么精确,但我们仍然需要努力提供自然顺畅的用户体验。Amazon Lex此次推出的一系列自然语言理解改进与置信度评分,将帮助大家结合更多上下文信息设计出智能度更高的对话过程。
生产式机器学习不再是困难
部署机器学习微服务变得更容易了。
推荐阅读
Mac 电脑触控板增强软件 Bettertouchtool 激活中文版
2023-11-11
22|易速鲜花聊天客服机器人的开发(上)
2023-10-27
改变游戏规则,微软推出 TTS 语言模型 VALL-E
100 个 Python 实战项目(十三)使用 Tkinter GUI 库构建闹钟应用程序
2023-04-22
23|易速鲜花聊天客服机器人的开发(下)
2023-10-30
14|工具和工具箱:LangChain 中的 Tool 和 Toolkits 一览
2023-10-09
搜索引擎要变天了:谷歌正式宣布推出 Bard,应对突然上线的增强型 Bing
电子书
大厂实战PPT下载
换一换 李梦云 | 字节跳动 Client Infra-App Health 高级研发工程师
游致远 | 字节跳动 ByteHouse 资深研发工程师
周廷帅 | 百度 App产品研发部/前端资深工程师
评论 1 条评论