0

目的は、マイクの音量 (ノイズ) レベルを表す特定の数値 (デシベル単位または 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 の使用など) をお勧めする場合は、大いに感謝します。

4

0 に答える 0