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


