目的は、マイクの音量 (ノイズ) レベルを表す特定の数値 (デシベル単位または 1 ~ 100 のスケール) を返す関数 (ユーザーの要求に応じて起動される) を作成することです。
調査しましたが、必要なものが見つかりませんでした。私が見つけた最も近いものは次のコードでしたが、問題は「onaudioprocess」のために無限に実行され続けることです。
すぐに正確な数字が出始めるわけではないので、数秒待ってからお約束としてボリュームを戻し、機能を停止する条件を設定することを考えました。何らかの理由で機能しなかったため、遅延時間が経過する前に、(最初のいくつかの値から) 不正確な値が返されました。
navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(function (stream) {
let audioContext = new AudioContext();
let analyser = audioContext.createAnalyser();
let microphone = audioContext.createMediaStreamSource(stream);
let javascriptNode = audioContext.createScriptProcessor(2048, 1, 1);
analyser.smoothingTimeConstant = 0.8;
analyser.fftSize = 1024;
microphone.connect(analyser);
analyser.connect(javascriptNode);
javascriptNode.connect(audioContext.destination);
javascriptNode.onaudioprocess = function () {
var array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
var values = 0;
var length = array.length;
for (var i = 0; i < length; i++) {
values += (array[i]);
}
var average = values / length;
console.log(Math.round(average));
return;
}
})
.catch(function (err) {
console.log(err);
});
以前のコードを私が特に必要としているものに変えることができる変更や、その他の提案 (AudioWorklet の使用など) をお勧めする場合は、大いに感謝します。