通过通过麦克风的声音去除噪音功能实现只识别真人说话的声音,电脑播放的声音不识别,完整的演示代码如下:
点击查看全文
 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Microphone Recognition</title>
</head>
<body>
    <button id="startRecognition">Start Recognition</button>
    <div id="result"></div>
    <script>
      let utterance = new SpeechSynthesisUtterance();  
      const synth = window.speechSynthesis;
    let audioContext = new (window.AudioContext || window.webkitAudioContext)();                          navigator.mediaDevices.getUserMedia({ 'audio': true }).then(function (stream) {
                
                
                  // 创建麦克风音频流
    let microphoneStream = audioContext.createMediaStreamSource(stream);
    
        // Check if the browser supports the Web Speech API
        if (!('webkitSpeechRecognition' in window)) {
            alert("Your browser does not support the Web Speech API. Please use Google Chrome.");
        } else {
            
            
                // 创建降噪、变声等音频处理节点
    let noiseReducer = audioContext.createBiquadFilter();
    noiseReducer.type = 'lowpass'; // 低通滤波器,用于降噪等
    noiseReducer.frequency.value = 2000; // 设置频率
    let pitchShifter = audioContext.createScriptProcessor(4096, 1, 1);
    pitchShifter.onaudioprocess = function(event) {
      let inputBuffer = event.inputBuffer;
      let outputBuffer = event.outputBuffer;
      for (let channel = 0; channel < outputBuffer.numberOfChannels; channel++) {
        let inputData = inputBuffer.getChannelData(channel);
        let outputData = outputBuffer.getChannelData(channel);
        
        
        
        // 简单的移动平均滤波器来平滑声音信号
const bufferSize = 10; // 缓冲区大小
let buffer = [];
for (let sample = 0; sample < inputBuffer.length; sample++) {
  // 将新的样本添加到缓冲区
  buffer.push(inputBuffer[sample]);
  // 如果缓冲区超过指定大小,则移除最旧的样本
  if (buffer.length > bufferSize) {
    buffer.shift();
  }
  // 计算平均值作为输出数据
  let sum = buffer.reduce((acc, val) => acc + val, 0);
  outputData[sample] = sum / buffer.length;
}
        // 在这里实现变声逻辑
        //for (let sample = 0; sample < inputBuffer.length; sample++) {
         // outputData[sample] = inputData[sample]; // 这里可以做一些声音变化的操作
       // }
      }
    };
    // 连接音频处理节点
    microphoneStream.connect(noiseReducer);
    noiseReducer.connect(pitchShifter);
    pitchShifter.connect(audioContext.destination);
    
    
    
            // Initialize the SpeechRecognition object
            const recognition = new webkitSpeechRecognition();
            recognition.continuous = true;
            recognition.interimResults = true;
            recognition.lang = 'zh-CN';
            // Add event listeners for the recognition events
            recognition.onstart = () => {
                console.log("Recognition started.");
            };
            recognition.onresult = (event) => {
                let text="";
                 console.log(event)
                            for (let i = event.resultIndex; i < event.results.length; ++i) {
                                if (event.results[i].isFinal) {
                                   
                                } else {
                                     text += event.results[i][0].transcript;
                                }
                            }
             
                document.getElementById('result').innerText = text;
            };
            recognition.onerror = (event) => {
                console.error("Recognition error: " + event.error);
            };
            recognition.onend = () => {
                console.log("Recognition ended.");
            };
            // Add event listener to the start button
            document.getElementById('startRecognition').addEventListener('click', () => {
                
                  //这个是声音播报,无法干扰正常的人声识别
     utterance.text = "上来看底甲方上来看分离可上搭建发的老是会计法拉斯柯达局,收快递费即时搭建分离可是,上来看京东方克里斯荆防颗粒圣诞节疯狂拉三等奖分离式可,上来看答复介绍可多了几分了开始减肥克里斯丁";
    // 播放语音
    synth.speak(utterance);
                recognition.start();
            });
        }
    });
  
    </script>
</body>
</html>
							网友回复
- threejs如何做个三维搭积木的游戏?
- three如何实现标记多个起始路过地点位置后选择旅行工具(飞机汽车高铁等),最后三维模拟行驶动画导出mp4?
- ai实时驱动的3d数字人可视频聊天的开源技术有吗
- swoole+phpfpm如何实现不同域名指向不同目录的多租户模式?
- 如何用go替换nginx实现请求phpfpm解析运行php脚本?
- 有没有浏览器离线运行进行各种文档、图片、视频格式转换的开源工具?
- 如何使用go语言搭建一个web防火墙?
- linux如何检测特定网络协议比如http协议中报文是否包含特点关键词并阻止返回给客户?
- 如果在nginx外过滤包含某些关键词的网页并阻止打开?
- 程序员怎么做副业赚钱?



 
				 
			 
			 
				 
			