首页 > 解决方案 > 如何使用 Web Audio API 调整麦克风灵敏度 [不是音量]

问题描述

我想以与不和谐应用程序相同的方式实现,校准音频输入以在特定音量(分贝,...)下触发,而不是低于该音量。

不和谐的敏感性

我正在创建一个视频通话应用程序,我希望在通话之前允许用户正确设置他的设备。实际上灵敏度太高而且有很多不受欢迎的噪音(你甚至可以听到虫子飞)。

关于如何使用 Web Audio API 实现这一点,我做了很多不成功的研究。

一开始我尝试使用GainNode,但这只是一种像音量一样放大/衰减(+/-)声音的方法。

在我尝试使用BiquadFilterNode之后,它只是一些过滤器来衰减/放大某个频率附近的音频。

我认为可能有一种使用AudioWorklet的方法,但我没有找到任何关于如何解决我的问题的明确文档。

我想以同样的方式修改增益创建一个函数,该函数setVolumeThreshold针对某个 db(或其他类型的值)削减声音。

var start = () => navigator.mediaDevices.getUserMedia({audio: true})
  .then(stream => audio.srcObject = modifyGain(stream, 2.5))
  .catch(e => log(e));

var modifyGain = (stream, gainValue) => {
  var ctx = new AudioContext();
  var src = ctx.createMediaStreamSource(stream);
  var dst = ctx.createMediaStreamDestination();
  var gainNode = ctx.createGain();
  gainNode.gain.value = gainValue;
  [src, gainNode, dst].reduce((a, b) => a && a.connect(b));
  return dst.stream;
};

这是一个使用该代码片段的jsFiddle 。

非常感谢那些会尽力帮助我的人!

标签: javascriptwebrtcweb-audio-api

解决方案


我很久以前使用 ScriptProcessorNode 做了一个类似的项目 - https://github.com/cwilso/volume-meter/。它应该很容易移植到 AudioWorklet。同样令人感兴趣的是https://github.com/cwilso/Audio-Input-Effects中的“噪声门”效果,我认为它更接近您想要的?


推荐阅读