前言
当你在给乐器调音时、又或者在小提琴、二胡这样的无品格乐器上演奏但无法确定音准时,你可以借助电脑或者移动设备的麦克风采集当前演奏乐器的声音,并通过算法实时分析声音的基音音高以及响度,这可以更好地帮助我们把握乐器的音准。
开始
在浏览器获取麦克风权限
在这里我们使用 Web Api 中的 getUserMedia 方法来获取设备麦克风。
async function getMicroPhoneDevice() {
if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
console.log("浏览器不支持音频输入");
return;
}
try {
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const audioContext = new window.AudioContext();
const mediaStreamSource = audioContext.createMediaStreamSource(stream);
const processor = audioContext.createScriptProcessor(4096, 1, 1);
mediaStreamSource.connect(processor);
processor.connect(audioContext.destination);
processor.onaudioprocess = (e) => {
let inputBuffer = e.inputBuffer.getChannelData(0); // 读取第一个声道的数据
console.log(inputBuffer);
};
} catch (error) {
console.error("音频解析失败,请检查麦克风或重新尝试!", error);
}
}
这里的 inputBuffer
就是麦克风实时获取的音频数据,格式为 Buffer 数组。
处理获取的音频数据
现在我们得到了原始的音频数据,如果想要知道这段音频的频率,我们还需要使用自相关算法得出音频的基音以及周期。
1.首先使用 RMS 计算信号强度
let rms = 0;
let SIZE = inputBuffer.length;
for (let i = 0; i < SIZE; i++) {
let val = inputBuffer[i];
rms += val * val;
}
rms = Math.sqrt(rms / SIZE);
if (rms < 0.01) {
console.log("信号强度不足");
}