浏览器 实时监听音量 实时语音识别 vue js

一、需求

最近前端需要实现实时语音识别的功能, 但如果24小时不停识别会消耗很多资源,所以我写了一段代码来监听音量, 当音量大于阈值开启录音, 当音量连续小于阈值3秒停止录音, 由于是命令识别,我加了一个条件,若已经录音10秒也会自动停止录音。

二、代码

javascript 复制代码
  let isDoing = false;  // 是否正在录音
  let doingTime = 0;      // 本次录音时长
  let doingNone = 0;      // 录音无声时长

  let maxTime = 10;     // 自定义最大录音时长
  let stopTime = 3;     // 自定义连续3秒无声断开
  let startVolume = 80; // 自定义达到80音量开始录音


  // 获取麦克风流并创建音频上下文
  const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  const audioContext = new AudioContext();
  const analyser = audioContext.createAnalyser();
  const microphone = audioContext.createMediaStreamSource(stream);

  // 连接分析节点
  microphone.connect(analyser);
  analyser.fftSize = 256;
  const bufferLength = analyser.frequencyBinCount;
  const dataArray = new Uint8Array(bufferLength);

  // 实时计算音量
  function getVolume() {
    analyser.getByteFrequencyData(dataArray);
    let sum = 0;
    for (let i = 0; i < bufferLength; i++) {
      sum += dataArray[i];
    }
    const avgVolume = sum / bufferLength;
    return avgVolume.toFixed(2);
  }
  try {
  setInterval(() => {
    console.log(`开始检测`);
    let volume = getVolume(); // 开始检测
    if (volume > startVolume) {
      doingNone = 0;
      if (isDoing) {
        doingTime = doingTime + 1;
        if (doingTime > maxTime) {
          //todo 超过10秒结束录音
        }
      }else {
        doingTime = 0;
        //todo 调用开始录音方法
      }
    }else if(isDoing) {
      doingNone = doingNone + 1;
      if (doingNone > stopTime) {
        //todo 超过3秒无声音结束录音
      }
    }
  }, 1000)
  } catch (error) {
    console.error('麦克风访问错误:', error)
  }
相关推荐
TeleostNaCl12 分钟前
解决 Chrome 无法访问网页但无痕模式下可以访问该网页 的问题
前端·网络·chrome·windows·经验分享
前端大卫2 小时前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友2 小时前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
小李小李不讲道理4 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻4 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
mapbar_front5 小时前
在职场生存中如何做个不好惹的人
前端
牧杉-惊蛰5 小时前
纯flex布局来写瀑布流
前端·javascript·css
一袋米扛几楼986 小时前
【软件安全】什么是XSS(Cross-Site Scripting,跨站脚本)?
前端·安全·xss
向上的车轮6 小时前
Actix Web适合什么类型的Web应用?可以部署 Java 或 .NET 的应用程序?
java·前端·rust·.net
XiaoYu20026 小时前
第1章 核心竞争力和职业规划
前端·面试·程序员