annyang语音识别与语音合成库

2023-09-14 21:47:36

*text 是 Annyang.js 中的一个通配符,表示匹配任何语音输入中的文本,并将其作为参数传递给命令回调函数。

例如,如果用户说 “search for cats”,则可以使用以下命令来捕获输入中的搜索词:

const commands = {
  'search for *text': (text) => {
    console.log('Search for:', text);
    // 在这里执行搜索操作...
  },
};

在这个例子中,*text 匹配 “cats”,并将其作为参数传递给回调函数。回调函数可以使用这个参数来执行搜索操作。

<!DOCTYPE html>
<html>
    <head>
        <title>Annyang Speech Recognition</title>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" crossorigin="anonymous" referrerpolicy="no-referrer" />
        <style>
            .microphone {
                width: 18px;
                height: 18px;
                background-color: #00ff7f; /* 浅绿色 */
                border-radius: 50%;
                margin-bottom: 10px;
                animation-name: pulse;
                animation-duration: 1s;
                animation-iteration-count: infinite;
                text-align: center;
            }

            @keyframes pulse {
                0% {
                    transform: scale(1);
                    box-shadow: 0 0 0 0 rgba(0, 255, 127, 0.7);
                }
                50% {
                    transform: scale(1.2);
                    box-shadow: 0 0 0 6px rgba(0, 255, 127, 0);
                }
                100% {
                    transform: scale(1);
                    box-shadow: 0 0 0 0 rgba(0, 255, 127, 0);
                }
            }
        </style>
    </head>
    <body>
        <input type="text" id="input" placeholder="说话后将回显到此处" />
        <i id="microphone" onclick="controlPhone()" class="fas fa-microphone"></i>

        <script src="https://cdnjs.cloudflare.com/ajax/libs/annyang/2.6.1/annyang.min.js"></script>
        <script>
            let starting = false;
            // 初始化Annyang
            if (annyang) {
                var input = document.getElementById('input');
                var microphone = document.getElementById('microphone');

                // 定义语音识别命令
                var commands = {
                    '*text': function (text) {
                        input.value = text;
                    }
                };

                // 添加语音识别命令
                annyang.setLanguage('zh-CN');
                annyang.addCommands(commands);
                // annyang.start();

                // 当语音识别开始时添加动效
                //   annyang.addCallback('start', function() {
                //     microphone.classList.add('microphone');
                //   });

                //   // 当语音识别结束时移除动效
                //   annyang.addCallback('end', function() {
                //     microphone.classList.remove('microphone');
                //   });

                function controlPhone() {
                    starting = !starting;
                    if (starting) {
                        // 启动语音识别
                        annyang.start();
                        // 播放动画
                        microphone.classList.add('microphone');
                    } else {
                        annyang.abort();
                        microphone.classList.remove('microphone');
                    }
                }
            }
        </script>
    </body>
</html>

web speech API

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>语音识别Demo</title>
  </head>
  <body>
    <h1>语音识别Demo</h1>
    <button id="startButton">开始识别</button>
    <button id="stopButton">停止识别</button>
    <input type="text" id="textInput" placeholder="语音识别结果" />

    <script>
      class SpeechRecognitionLibrary {
        constructor() {
          this.recognition = new webkitSpeechRecognition();

          this.recognition.lang = "zh-CN"; // 将语言设置为中文(简体中文)
          this.recognition.continuous = true;
          this.recognition.interimResults = false;

          this.isListening = false;

          // 识别结果回调函数
          this.onResultCallback = null;

          // 添加语音识别结果事件处理程序
          this.recognition.onresult = (event) => {
            // console.log(33, event);
            const result = event.results[0][0].transcript;
            console.log(1, result)
            if (this.onResultCallback) {
              this.onResultCallback(result);
            }
          };
        }

        startListening() {
          if (!this.isListening) {
            console.log(2);
            this.recognition.start();
            this.isListening = true;
          }
        }

        stopListening() {
          if (this.isListening) {
            this.recognition.stop();
            this.isListening = false;
          }
        }

        onResult(callback) {
          this.onResultCallback = callback;
        }
      }

      // 示例用法
      const speechRecognizer = new SpeechRecognitionLibrary();

      speechRecognizer.onResult((result) => {
        console.log("识别结果:", result);
      });
      speechRecognizer.onerror = (event) => {
        console.error("语音识别错误:", event.error);
      };

      document.getElementById("startButton").addEventListener("click", () => {
        speechRecognizer.startListening();
      });

      document.getElementById("stopButton").addEventListener("click", () => {
        speechRecognizer.stopListening();
      });
    </script>
  </body>
</html>

<!DOCTYPE html>
<html>
<head>
    <title>中文语音识别示例</title>
</head>
<body>
    <h1>中文语音识别示例</h1>

    <button id="startButton">开始语音识别</button>
    <p id="result"></p>

    <script>
        const startButton = document.getElementById('startButton');
        const result = document.getElementById('result');

        if ('webkitSpeechRecognition' in window) {
            const recognition = new webkitSpeechRecognition();
            recognition.lang = 'zh-CN'; // 设置识别语言为中文

            startButton.addEventListener('click', () => {
                recognition.start();
                startButton.disabled = true;
                startButton.textContent = '正在识别...';
            });

            recognition.onresult = (event) => {
                const transcript = event.results[0][0].transcript;
                result.textContent = '识别结果:' + transcript;
                startButton.disabled = false;
                startButton.textContent = '开始语音识别';
            };

            recognition.onend = () => {
                startButton.disabled = false;
                startButton.textContent = '开始语音识别';
            };
        } else {
            result.textContent = '抱歉,你的浏览器不支持语音识别。';
            startButton.disabled = true;
        }
    </script>
</body>
</html>

<!DOCTYPE html>
<html>
  <head>
    <title>中文语音识别示例</title>
  </head>
  <body>
    <h1>中文语音识别示例</h1>

    <button id="startButton">开始语音识别</button>
    <p id="result"></p>

    <script>
      const startButton = document.getElementById("startButton");
      const result = document.getElementById("result");

      if ("webkitSpeechRecognition" in window) {
        const recognition = new webkitSpeechRecognition();
        recognition.lang = "zh-CN"; // 设置识别语言为中文
        recognition.interimResults = true;
        recognition.maxAlternatives = 5; // 获取多达5个备选结果
        recognition.mode = "speech"; // 或 'audio',根据你的需求

        startButton.addEventListener("click", () => {
          recognition.start();
          startButton.disabled = true;
          startButton.textContent = "正在识别...";
        });

        recognition.onresult = (event) => {
          console.log(1, )
          const transcript = event.results[0][0].transcript;
          result.textContent = "识别结果:" + transcript;
          startButton.disabled = false;
          startButton.textContent = "开始语音识别";
        };
        recognition.onerror = function (event) {
          // 处理错误
          console.error("发生错误:" + event.error);
        };

        recognition.onend = () => {
          startButton.disabled = false;
          console.log('识别结束')
          startButton.textContent = "开始语音识别";
        };
      } else {
        result.textContent = "抱歉,你的浏览器不支持语音识别。";
        startButton.disabled = true;
      }
    </script>
  </body>
</html>

更多推荐

盘点数字人源头厂商哪家公司OEM定制能力好!

在当今的科技盛世,我们与数字人的互动越来越频繁。无论是在工作中的智能助手,还是数字人播,数字员工,还是在生活中的个性化推荐,数字人都在为我们的生活增添色彩。然而,大家可能并未意识到,这些数字人背后的源头——数字人源头厂家,数字人源头厂商,数字人源头公司,正是在默默推动着人工智能(AI)的发展。数字人技术源头厂商主要负责

六、不root不magisk不xposed lsposed frida原生修改定位

系列文章目录第一章安卓aosp源码编译环境搭建第二章手机硬件参数介绍和校验算法第三章修改安卓aosp代码更改硬件参数第四章编译定制rom并刷机实现硬改(一)第五章编译定制rom并刷机实现硬改(二)第六章不root不magisk不xposedlsposedfrida原生修改定位第七章安卓手机环境检测软件分享第八章硬改之设

论文阅读《2022WWW:Rethinking Graph Convolutional Networks in Knowledge Graph Completion》

论文链接论文工作简介KCN在建模图结构方面很有效。基于GCN的KGC模型通常使用编码器-解码器框架,GCNs和KGE模型分别充当编码器和解码器。许多基于GCN的KGC模型虽然引入了额外的计算复杂度,但未能超越最先进的KGE模型?作者发现GCNs中的图结构并没有对KGC的性能有显著提升,相反实体表示的转换为性能带来提升。

Vue 组件的单元测试

1、基本的示例单元测试是软件开发非常基础的一部分。单元测试会封闭执行最小化单元的代码,使得添加新功能和追踪问题更容易。Vue的单文件组件使得为组件撰写隔离的单元测试这件事更加直接。它会让你更有信心地开发新特性而不破坏现有的实现,并帮助其他开发者理解你的组件的作用。这是一个判断一些文本是否被渲染的简单的示例:<templ

Rxjs操作符理解篇

创建运算符ajaxbindCallback:把回调API转化为返回Observable的函数bindNodeCallback:把Node.js式回调API转换为返回Observable的函数。deferemptyfromfromEventfromEventPatterngenerateintervalofrangeth

【音视频笔记】Mediacodec+Muxer生成mp4,浏览器无法播放问题处理

文章目录背景解决过程曲线修复方案解决问题根源背景最近在测试视频录制功能时发现,AudioRecord+MediaCodec+MediaMuxer生成的MP4,PC浏览器无法播放,但是Android、Windows、Mac的播放器应用都能正常播放。虽然不禁想吐槽浏览器视频组件的容错性差,但我也意识生成的文件格式肯定也是有

Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单

项目说明随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要求;通过电子化平台提高招投标工作的公开性和透明性;通过电子化招投标,使得招标采购的质量更高、速度

Spring MVC 八 - 内置过滤器

SpringMVC内置如下过滤器:FormDataForwardedHeadersShallowETagCORSFormData浏览器可以通过HTTPGET或HTTPPOST提交formdata(表单数据),但是非浏览器客户端可以通过HTTPPUT、HTTPDELETE、HTTPPATCH提交表单数据。但是Servle

如何使用 Node.js和Express搭建服务器?

如何使用NodeJs搭建服务器1.准备工作1.1安装Node.js2.安装express2.1初始化package.json2.2安装express2.3Express应用程序生成器1.准备工作1.1安装Node.jsNode.js是一个开源、跨平台的JavaScript运行时环境。下载链接:Node.js官网下载建议

【数据分享】我国主要城市的商圈范围数据(免费获取\shp格式)

大家对于商圈这个概念肯定都不陌生!商圈,简单来说,就是商业聚集的区域。我国比较知名的商圈有比如北京的三里屯商圈、上海的南京东路商圈。商圈是城市商业发展的重要体现,一个城市的商圈越多、商圈范围越大、商圈能级越高,代表这个城市的商业越发达!商圈的概念也越来越深入人心,比如在大众点评上可以以商圈(商区)为规则进行店铺搜索,比

【Redis】Redis实现分布式锁

【Redis】Redis常见面试题(1)文章目录【Redis】Redis常见面试题(1)1.为什么要用分布式锁2.Redis如何实现分布式锁3.Redis接受多个请求模拟演示4.使用Redis实现分布式锁会存在什么问题4.1一个锁被长时间占用4.2锁误删【Redis】Redis常见面试题(1)1.为什么要用分布式锁之前

热文推荐