前端开发攻略---用原生JS在网页中也能实现语音识别

news2024/12/30 2:04:21

1、语音识别的过程

语音识别涉及三个过程:首先,需要设备的麦克风接收这段语音;其次,语音识别服务器会根据一系列语法 (基本上,语法是你希望在具体的应用中能够识别出来的词汇) 来检查这段语音;最后,当一个单词或者短语被成功识别后,结果会以文本字符串的形式返回 (结果可以有多个),以及更多的行为可以设置被触发。

2、示例 

2fbe7e5049a14d4b963d0a1005a44938.png

示例代码:

您如果想直接尝试的话可以先复制下面代码运气起来试试效果。

操作方法:将代码运行在浏览器,点击屏幕,允许麦克风权限,然后出说其中一种颜色。

结果1:识别成功,但是没听清楚您说的什么,页面不会有任何变化。

结果2:识别成功,页面背景切换为您说的那种颜色。

结果3:识别失败,失败原因将在页面底部展示。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width" />
    <title></title>
    <style>
      body,
      html {
        margin: 0;
      }

      html {
        height: 100%;
      }

      body {
        height: inherit;
        overflow: hidden;
        max-width: 800px;
        margin: 0 auto;
      }

      h1,
      p {
        font-family: sans-serif;
        text-align: center;
        padding: 20px;
      }

      div {
        height: 100px;
        overflow: auto;
        position: absolute;
        bottom: 0px;
        right: 0;
        left: 0;
        background-color: rgba(255, 255, 255, 0.2);
      }

      ul {
        margin: 0;
      }

      .hints span {
        text-shadow: 0px 0px 6px rgba(255, 255, 255, 0.7);
      }
    </style>
  </head>
  <body>
    <h1>语音识别转换器</h1>
    <p class="hints"></p>
    <div>
      <p class="output"><em>识别进度展示处</em></p>
    </div>
  </body>
  <script>
    var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition
    var SpeechGrammarList = SpeechGrammarList || window.webkitSpeechGrammarList
    var SpeechRecognitionEvent = SpeechRecognitionEvent || webkitSpeechRecognitionEvent

    var colors = [
      'aqua',
      'azure',
      'beige',
      'bisque',
      'black',
      'blue',
      'brown',
      'chocolate',
      'coral',
      'crimson',
      'cyan',
      'fuchsia',
      'ghostwhite',
      'gold',
      'goldenrod',
      'gray',
      'green',
      'indigo',
      'ivory',
      'khaki',
      'lavender',
      'lime',
      'linen',
      'magenta',
      'maroon',
      'moccasin',
      'navy',
      'olive',
      'orange',
      'orchid',
      'peru',
      'pink',
      'plum',
      'purple',
      'red',
      'salmon',
      'sienna',
      'silver',
      'snow',
      'tan',
      'teal',
      'thistle',
      'tomato',
      'turquoise',
      'violet',
      'white',
      'yellow',
    ]

    var recognition = new SpeechRecognition()
    if (SpeechGrammarList) {
      var speechRecognitionList = new SpeechGrammarList()
      var grammar = '#JSGF V1.0; grammar colors; public <color> = ' + colors.join(' | ') + ' ;'
      speechRecognitionList.addFromString(grammar, 1)
      recognition.grammars = speechRecognitionList
    }
    recognition.continuous = false
    recognition.lang = 'en-US'
    recognition.interimResults = false
    recognition.maxAlternatives = 1

    var bg = document.querySelector('html')
    var hints = document.querySelector('.hints')
    var diagnostic = document.querySelector('.output')
    var colorHTML = ''
    colors.forEach(function (v, i, a) {
      colorHTML += '<span style="background-color:' + v + ';"> ' + v + ' </span>'
    })
    hints.innerHTML = '点击页面,然后说出一种颜色来更改页面背景色' + '</br>' + colorHTML + '.'

    let flag = false
    document.body.onclick = function () {
      if (flag) return
      flag = true
      recognition.start()
      console.log('正识别中...')
      diagnostic.textContent = '正识别中...'
    }

    recognition.onresult = function (event) {
      var color = event.results[0][0].transcript
      bg.style.backgroundColor = color
      flag = false
      // console.log('Confidence: ' + event.results[0][0].confidence)
      console.log('识别成功,结果是:', color)
      diagnostic.textContent = '识别成功,结果是: ' + color + '.'
    }

    recognition.onspeechend = function () {
      recognition.stop()
      flag = false
      console.log('识别结束')
    }

    recognition.onnomatch = function (event) {
      flag = false
      console.log('识别成功,但是没有认出您说的颜色')
      diagnostic.textContent = '识别成功,但是没有认出您说的颜色'
    }

    recognition.onerror = function (event) {
      flag = false
      let msg = event.error == 'not-allowed' ? '没有麦克风权限' : event.error
      console.log('识别错误,原因是:', msg)
      diagnostic.textContent = '识别错误,原因是:' + msg
    }
  </script>
</html>

您可能出现的问题:

一、一直都提示没有麦克风权限

e9919631827f40399bc4129e1a3e4672.png

可能原因:

1、您没有开启当前页面的麦克风功能。

2、您的电脑或者手机没有麦克风功能。

解决方法:

1、您可以重新打开该页面,然后开启当前页面的麦克风权限。

2、佩戴耳机,利用耳机的麦克风功能

 

二、页面上只有文字显示,页面效果与示例图不一样

可能原因:

1、您使用的浏览器不支持语音识别。

2、代码有误。

解决方法:

1、pc端使用Chrome、Edge、Safari浏览器。手机端使用Safari、Samsung等浏览器或者在微信内部利用WebView打开链接进行访问。

2、检查代码。

三、建议使用Edge浏览器,成功率90%以上

3、代码解析

判断浏览器支不支持

var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition;
var SpeechGrammarList = SpeechGrammarList || webkitSpeechGrammarList;
var SpeechRecognitionEvent =
  SpeechRecognitionEvent || webkitSpeechRecognitionEvent;

将代码定义希望应用能够识别的语法。语法放在下面定义的变量grammar中:

var colors = [ 'aqua' , 'azure' , 'beige', 'bisque', 'black', 'blue', 'brown', 'chocolate', 'coral' ... ];
var grammar = '#JSGF V1.0; grammar colors; public <color> = ' + colors.join(' | ') + ' ;'

使用 
SpeechRecognition() 构造函数,定义一个 speech recognition 实例,控制对于这个应用的识别。还需要使用 SpeechGrammarList() 构造函数,创立一个 speech grammer list 对象

var recognition = new SpeechRecognition();
var speechRecognitionList = new SpeechGrammarList();

使用 SpeechGrammarList.addFromString() 把语法添加到列表 (list),这个方法接收两个参数,第一个是我们想要添加的包含语法内容的字符串,第二个是对添加的这条语法的权重 (权重值范围是 0~1),权重其实是相对于其他语法,这一条语法的重要程度。添加到列表的语法就是可用的,并且是一个
 SpeechGrammar 实例。

speechRecognitionList.addFromString(grammar, 1);

然后通过设置 
SpeechRecognition.grammars 属性值,把我们的  SpeechGrammarList添加到 speech recognition 实例。在继续往前走之前,我们还需要设置 recognition 实例其他的一些属性:

  • SpeechRecognition.lang :设置识别的是什么语言。
  • SpeechRecognition.interimResults :定义 speech recognition 系统要不要返回临时结果 (interim results),还是只返回最终结果。
  • SpeechRecognition.maxAlternatives :定义每次结果返回的可能匹配值的数量。这有时有用,比如要的结果不明确,你想要用一个列表展示所有可能值,让用户自己从中选择一个正确的。
recognition.grammars = speechRecognitionList;
//recognition.continuous = false;
recognition.lang = "en-US";
recognition.interimResults = false;
recognition.maxAlternatives = 1;

开始语音识别

document.body.onclick = function () {
   if (flag) return
   flag = true
   recognition.start()
   console.log('正识别中...')
   diagnostic.textContent = '正识别中...'
}

接收、处理结果

一旦语音识别开始,有许多 event handlers 可以用于做结果返回的后续操作,除了识别的结果外还有些零碎的相关信息可供操作,这在收到一个成功的结果时候触发。

recognition.onresult = function (event) {
   var color = event.results[0][0].transcript
   bg.style.backgroundColor = color
   flag = false
   // console.log('Confidence: ' + event.results[0][0].confidence)
   console.log('识别成功,结果是:', color)
   diagnostic.textContent = '识别成功,结果是: ' + color + '.'
}

停止语音识别服务

一旦一个单词被识别就不能再说咯 (必须再点击屏幕再次开启语音识别)

recognition.onspeechend = function () {
   recognition.stop()
   flag = false
   console.log('识别结束')
}

处理未能识别的语音

你说的内容不在定义的语法中所以识别不了

recognition.onnomatch = function (event) {
   flag = false
   console.log('识别成功,但是没有认出您说的颜色')
   diagnostic.textContent = '识别成功,但是没有认出您说的颜色'
}

处理 error

识别出现问题

recognition.onerror = function (event) {
   flag = false
   let msg = event.error == 'not-allowed' ? '没有麦克风权限' : event.error
   console.log('识别错误,原因是:', msg)
   diagnostic.textContent = '识别错误,原因是:' + msg
}

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1624654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Qt 学习笔记】Qt常用控件 | 输入类控件 | Text Edit的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 输入类控件 | Text Edit的使用及说明 文章编号&#xff…

Jsoncpp搭建交叉编译环境(移植到arm)

1. 官网下载源码 github地址&#xff1a;GitHub - open-source-parsers/jsoncpp at update 2. 交叉编译环境 当前平台/开发平台-编译环境&#xff1a; [rootlocalroot ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalroot ~]# uname -a Lin…

大型语言模型LLM的数据管理与应用

大型语言模型&#xff08;LLM&#xff09;风靡全球&#xff0c;尤其是 OpenAI 的最新发展。LLMs 的魅力来自于其理解、解释和生成人类语言的能力&#xff0c;而这曾被认为是人类的专属领域。像 CoPilot 这样的工具正在迅速融入开发人员的日常生活&#xff0c;而以 ChatGPT 为动…

使用 Redux 管理全局状态

Redux 是个状态集中管理框架&#xff0c;状态可以跨组件共享&#xff0c;状态更新后&#xff0c;调用监听器。其实状态可以认为就是个全局对象&#xff0c;为什么要做一个框架来管理呢&#xff1f;如果我们自己使用一个全解字典来管理状态是不是也行&#xff1f;如果不做任何控…

不同语言在算法使用方面的差异(Java 、C++篇)

由于我认为的会了是能得到结果了&#xff0c;所以我亲自去把题解的C代码给改成了Java的&#xff0c;尽管代码和逻辑上的高度统一。编译器还是报错了。 第三个死都过不去。而且后面的还超时了。 这使我十分怀疑是不是超时或者空间不够所导致的。但是去问讯飞星火&#xff0c;它…

自有道 更从容——林肯携“四大美式客厅”登陆北京国际车展,以传世豪华 优雅从容为品牌注入全新内涵

【北京 2024年4月25日】传世豪华&#xff0c;优雅从容。今日&#xff0c;第十八届北京国际汽车展览会正式启幕。作为美式豪华品牌的引领者&#xff0c;林肯在此次北京车展为“豪华 自有其道”注入全新内涵&#xff0c;并以车展首创的四大美式客厅形式诠释不同的人生境界&#x…

AWS制作WordPress在国内外的利弊?

AWS作为全球领先的云计算服务供应商&#xff0c;为WordPress提供了强大且灵活的托管环境&#xff0c;使用AWS来搭建和运行WordPress无疑是个不错的选择。即便如此使用AWS制作还是会有些许利弊&#xff0c;九河云作为AWS的合作伙伴来为读者们仔细探讨AWS在WordPress的利弊。 利&…

diskMirror docker 使用容器部署 diskMirror 服务器!!!

Welcome to diskMirror-docker 获取项目 这个项目是 diskMirror-spring-boot 镜像版本的项目&#xff0c;您可以使用下面的命令将此项目编译为一个镜像&#xff01; # 进入到您下载的源码包目录 cd diskMirror-docker# 点击脚本来进行版本的设置以及对应版本的下载 设置 和 编…

Linux 安装 nvm,并使用 Jenkins 打包前端

文章目录 nvm是什么nvm下载nvm安装设置 nvm 环境变量设置 Jenkins 打包命令 nvm是什么 nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装…

artifactory配置docker本地存储库

​一、概述 本地 Docker 存储库是我们部署和托管内部 Docker 镜像的位置。实际上&#xff0c;它是一个 Docker 注册表&#xff0c;能够托管的 Docker 镜像的集合。通过本地存储库&#xff0c;你可以保存、加载、共享和管理自己的 Docker 镜像&#xff0c;而无需依赖于外部的镜像…

简单的jmeter脚本自动化

1、创建线程组&#xff0c;定义自定义变量&#xff0c;保存请求默认值 2、用csv编写测试用例 3、使用csv文件读取测试用例 4、创建http请求 5、添加相应断言 6、运行结果

vue中使用echarts实现X轴动态时间(天)的折线图表

项目要求x轴以一天为间隔&#xff0c;时间是动态返回的数据&#xff0c;折线图平滑展示 实现代码如下&#xff1a; <div class"echarts-main"><v-chart ref"echarts" :options"options" /> </div>// 局部引入vue-echarts im…

ios CI/CD 持续集成 组件化专题一 iOS 将图片打包成bundle

一、 创建 选择 macos 下的Bundle 二 、取名点击下一步 三、Base SDK 选择ios 四 、Build Active Architecture Only 五、Installation后面的内容删除 六、Skip Install 选择NO 七、Strip Debug Symbols During Copy 中"Release"项设置为 "YES" 八、COM…

ansible-copy用法

目录 概述实践 概述 ansible copy 常用用法举例 实践 # with_fileglob 是 Ansible 中的一个循环关键字&#xff0c;用于处理文件通配符匹配的结果 # 遍历 addons/files/*.txt文件 # dest: /data/soft/test 目录要事先存在,才能正常的copy - name: Copy configuration filescop…

【threejs教程8】threejs添加3D场景键盘控制

【完整效果代码位于文章末】 目录 准备工作 目标 步骤1&#xff1a;初始化按键状态对象 步骤2&#xff1a;监听键盘事件 步骤3&#xff1a;编写事件处理函数 步骤4&#xff1a;更新相机移动方向 总结 完整代码如下 在3D应用开发中&#xff0c;用户交互是一个关键…

JS实现对用户名、密码进行正则表达式判断,网页跳转

目标&#xff1a;使用JS实现对用户名和密码进行正则表达式判断&#xff0c;用户名和密码正确时&#xff0c;进行网页跳转。 用户名、密码的正则表达式检验 HTML代码&#xff1a; <button type"submit" id"login-btn" /*onclick"login();alidate…

openstack界面简单修改

openstack Ubuntu主题登录界面修改修改登陆界面背景登录框边缘添加透明效果修改登录界面logo更换站点图片更换项目logo图片 本实验基于VMware17&#xff0c;使用Ubuntu2310搭建openstack-B版 Ubuntu主题 以下配置只对Ubuntu主题生效 登录界面修改 原界面 关闭登录界面域名输…

HTTP与HTTPS 对比,区别详解(2024-04-25)

一、简介 HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模型之上&#xff0c;通常使用端口 80。 HTTPS&#xf…

百度沈抖:智能,生成无限可能

4月16日&#xff0c;Create 2024百度AI开发者大会在深圳举行。会上&#xff0c;百度集团执行副总裁、百度智能云事业群总裁沈抖正式发布新一代智能计算操作系统——百度智能云万源。它能管理万卡规模的集群&#xff0c;极致地发挥GPU、CPU的性能&#xff1b;它有强大的大模型作…

【树莓派】yolov5 Lite,目标检测,树莓派4B,推理v5lite-e_end2end.onnx,摄像头实时目标检测

文章目录 YOLOv5 Lite: 在树莓派上轻松运行目标检测1. 环境配置2. 克隆项目3. 安装依赖项4. 下载模型权重5. 理解end2end的含义6. 示例推理7. 文件介绍8. 把文件弄到树莓派4B执行9. 进一步尝试fp16的onnx&#xff08;行不通&#xff09;10. 视频流检测 这里有大概的环境配置&am…