通过通过麦克风的声音去除噪音功能实现只识别真人说话的声音,电脑播放的声音不识别,完整的演示代码如下:
点击查看全文
<!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>
网友回复
DLNA与UPnP的区别和不同?
苏超自建抢票app,通过先预约再抽签化解高并发抢票?
python如何让给电脑在局域网中伪装成电视接收手机的投屏图片视频播放?
如何结合python+js如何自己的视频编码与加密播放直播?
python如何在电脑上通过局域网将本地视频或m3u8视频投屏电视播放?
腾讯视频爱奇艺优酷vip电影电视剧视频如何通过python绕过vip收费直接观看?
有没有可免费观看全球电视台直播m3u8地址url的合集?
有没有实现观影自由的免vip影视苹果 CMS V10 API的可用url?
python如何实时检测电脑usb插入检测报警?
如何判断真人操作的鼠标移动直线轨迹与机器操作的轨迹?