通过通过麦克风的声音去除噪音功能实现只识别真人说话的声音,电脑播放的声音不识别,完整的演示代码如下:
点击查看全文
<!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>
网友回复