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

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.mfbz.cn/a/583169.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于EBAZ4205矿板的图像处理:02生成测试彩条图像

基于EBAZ4205矿板的图像处理&#xff1a;02生成测试彩条图像 生成测试彩条图像可以有两种方式 VDMA缓存PS端生成彩条图像数据&#xff0c;PL端输出 这里可以直接看超级大电工开源的代码&#xff0c;写的很好详细&#xff0c;我就不再班门弄斧了&#xff08;下面是链接&#…

22 - Hadoop HA 高可用集群搭建、手动模式、自动模式以及HA模式集群

目录 1、HA 概述 2、HDFS-HA 集群搭建 2.1、HDFS-HA 核心问题 3、HDFS-HA 手动模式 3.1、环境准备 3.2、规划集群 3.3、配置 HDFS-HA 集群 3.4、启动 HDFS-HA 集群 4、HDFS-HA 自动模式 4.1、HDFS-HA 自动故障转移工作机制 4.2、HDFS-HA 自动故障转移的集群规划 4.…

AI助力后厨可视化智慧监管,让“舌尖安全”看得见

一、背景与需求分析 夏天是食物易腐败的季节&#xff0c;高温容易引发食品安全问题。在后厨环境中&#xff0c;食品安全问题可能涉及食品加工、后厨环境、食品是否被污染等方面&#xff0c;而不合格的食品安全管理可能导致食品中毒事件等风险&#xff0c;损害消费者的健康和餐…

Asp .Net Core 系列:国际化多语言配置

文章目录 概述术语 本地化器IStringLocalizer在服务类中使用本地化 IStringLocalizerFactoryIHtmlLocalizerIViewLocalizer 资源文件区域性回退 配置 CultureProvider内置的 RequestCultureProvider实现自定义 RequestCultureProvider使用 Json 资源文件 设计原理IStringLocali…

你的动漫AI女友 Anime gf :自定义创建各种独特个性、语言风格的虚拟角色

一个本地且开源的 CharacterAI 替代工具 Anime gf&#xff0c;提供了一个用户友好的界面&#xff0c;允许用户在桌面上与虚拟角色互动。你可以自定义创建各种角色&#xff0c;让每个虚拟角色都有自己的独特个性和语言风格&#xff0c;可以接入OpenAI、Anthropic、Mistral和 Tog…

建立外贸网站常用的WordPress插件

我们最近使用hostease的虚拟主机在创建wordpress外贸网站时&#xff0c;需要选择安装一些插件。对于wordpress建站选择合适的WordPress插件至关重要。面对琳琅满目的插件选择&#xff0c;根据多年的实践经验&#xff0c;我为您推荐以下必备插件清单&#xff0c;让您的网站建设更…

电商红利再现,“视频号小店”即将顶替“抖音小店”

哈喽~我是电商月月 电商行业发展迅速&#xff0c;除了“刚兴起”就入驻的商家&#xff0c;竞争少&#xff0c;市场大&#xff0c;能简简单单吃到第一批红利&#xff0c;后来入驻的商家就需要运用技巧与同行竞争了【要么认真选品&#xff0c;有独特的卖点。要么就是打价格战&am…

系统性文献综述的撰写(Systematic Review)

文献综述 什么是文献综述 对某一个“领域、专业、课题、问题、研究专题”&#xff0c;通过搜集大量的相关资料&#xff08;别人发表的论文&#xff09;&#xff0c;然后通过“阅读、分析、归纳、整理”给出最新进展、学术见解或建议。对其做出综合性介绍和阐述的一种学术论文…

基于SpringBoot和PostGIS的各省与地级市空间距离分析

目录 前言 一、PostGIS时空库 1、时空表设计 2、空间数据管理与查询 二、后台接口设计 1、ORM层设计与实现 2、业务层设计与实现 3、控制层设计 三、web可视化设计与实现 1、省份范围展示 2、城市距离可视化 3、成果展示 总结 前言 在上一篇博客中基于Java和GDAL实…

力扣HOT100 - 78. 子集

解题思路&#xff1a; class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> lists new ArrayList<>(); // 解集lists.add(new ArrayList<Integer>()); // 首先将空集加入解集中for(int i 0; i < n…

【nginx】http2 配置造成 多进程请求变成单进程

一、环境简要说明 #访问请求过程 用户&#xff08;浏览器&#xff09; ——> 防火墙映射 ——> nginx ——> app服务&#xff08;java&#xff09; http2是什么&#xff0c;简单来说是继HTTP1.1版本之后的新版HTTP协议&#xff0c;支持二进制分帧、多路复用、首部压缩…

认识Linux及一些基本

目录 linux简介&#xff1a; 1. 发展史 UNIX发展的历史 Linux发展历史 2. 开源 3. 企业应用现状 Linux在服务器领域的发展 Linux在桌面领域的发展 Linux在移动嵌入式领域的发展 Linux在云计算/大数据领域的发展 4. 发行版本 Debian Ubuntu 红帽企业级Linux Cent…

数据结构复习指导之数组和特殊矩阵

文章目录 数组和特殊矩阵 考纲内容 复习提示 前言 1.数组的定义 2.数组的存储结构 3.特殊矩阵的压缩存储 3.1对称矩阵 3.2三角矩阵 3.3三对角矩阵 4.稀疏矩阵 5.知识回顾 数组和特殊矩阵 考纲内容 &#xff08;一&#xff09;栈和队列的基本概念 &#xff08;二&a…

ubuntu neo4j 下载与配置(一)

neo4j 官方下载页面 https://neo4j.com/deployment-center/#community 进入页面之后&#xff0c;往下滑 咱们在下载neo4j时&#xff0c;官方可能要咱们填写一下个人信息&#xff0c;比如&#xff1a;姓名组织结构邮箱等&#xff1a; 咱们可以观察一下&#xff0c;ne4j的下载链…

iOS 实现类似抖音翻页滚动效果

这里是效果图 参考抖音的滚动效果&#xff0c;需要我们在结束拖动的时候&#xff0c;动画设置偏移量 这里有一个注意点&#xff0c;由于我们是在拖动结束的时候&#xff0c;手动改变tableview的偏移量&#xff0c; 改变了tableView 自身原有的的滚动效果&#xff0c;所以我们…

C++奇迹之旅:类和对象const成员static关键字友元内部类

文章目录 &#x1f4dd;const成员&#x1f320; const 成员函数是什么&#xff1f;&#x1f320; 取地址及const取地址操作符重载 &#x1f309;static成员&#x1f320;概念&#x1f320;static特性&#x1f309;static小题 &#x1f320;友元&#x1f309; 友元函数&#x1f…

npm安装时一直idealTree:npm: sill idealTree buildDeps卡住不动

npm安装时一直idealTree:npm: sill idealTree buildDeps卡住不动 解决步骤&#xff1a; 1.去以下的目录中删掉.npmrc文件&#xff08;只在C:\User.npmrc&#xff09; 2.清除缓存&#xff0c;使用npm cache verify 不要用npm cache clean --force&#xff0c;容易出现npm WAR…

国产AI大模型加速“上车”

上海白领刘先生&#xff0c;坐上他的汽车主驾&#xff0c;向右扭头说&#xff1a;“打开那窗户。”话音刚落&#xff0c;副驾驶的车窗自动开了。 这辆车搭载了基于国产AI大模型的智能系统&#xff0c;就像有了人的大脑和神经网络&#xff0c;通过学习提升语音、视觉等多模态感…

VCSA6.7重置root密码

VCSA6.7重置root密码 1、登录VCSA所运行的ESXI主机 2、打开VCSA虚拟机Web控制台&#xff0c;先拍摄一个快照&#xff0c;然后重启虚拟机&#xff0c;在如下界面按"e" 3、找到linux开头的段落&#xff0c;在末尾追加rw init/bin/bash; 4、输入完成后&#xff0c;按&…

《异常检测——从经典算法到深度学习》27 可执行且可解释的在线服务系统中重复故障定位方法

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …
最新文章