我正在寻找在我的VoIP应用程序中调整麦克风级别的解决方案。我可以获得一定程度的声音,但也希望在实时太低或太高时调整麦克风的“音量”。就像在Skype ......
看起来很简单,但我认为算法应该更加智能,然后只需在音量达到上限/下限时调低音量。
我在Win平台上使用.Net 2.0。是否存在.Net甚至C语言的现成库(所以我可以移植它),甚至只是描述这些方法/算法?我试过谷歌,但没有运气。
谢谢!
答案 0 :(得分:0)
常用的名称是AGC (Automatic Gain Control),并不像听起来那么容易。在基本的AGC方案中,您有一个快速的“攻击”,这意味着当输入电平增加时,您可以非常快速地降低增益,然后在输入电平下降时使用更大的时间常数来更慢地增加增益。
答案 1 :(得分:0)
首先尝试此操作:Get and set the wave sound volume
它通过P / Invoke在C#中使用Windows API。
答案 2 :(得分:0)
这有两个部分。
首先,您需要开始从麦克风捕获音频并测量其信号强度。如果有人正在对着麦克风说话进行校准,那么您可以简单地查找前几秒内的最高峰值。如果它低于-6dB(比方说),请稍微提高一点,如果高于-3dB,则稍微降低一点。关键是您需要高信噪比,但不惜一切代价,您希望避免信号太大而导致削波或失真。
第二部分是确定混音器API返回的众多混音器控件中的哪一个是控制麦克风增益的控件。事实证明这比它应该更难,特别是如果你想让它适用于所有声卡以及XP和Vista / Win 7.请参阅this question以获得一些建议的解决方案。
您可以对这两个部分使用NAudio。它有waveIn和混合器API的包装器。
答案 3 :(得分:0)
我建议使用Speex-Pre-Processor。作为奖励,你可以获得噪音抑制。
我的Xiph项目包含绑定:
https://github.com/CodesInChaos/Xiph
特别需要这两个文件:
https://github.com/CodesInChaos/Xiph/blob/master/Easy/Speex/SpeexPreProcessor.cs
https://github.com/CodesInChaos/Xiph/blob/master/LowLevel/SpeexPreProcessor.cs
这可能不是生产质量,而是一个起点。如果你改进它们,请把改变发给我。