使用 HTML5/javascript 校正音频音量输出分贝,关闭预处理

Posted

技术标签:

【中文标题】使用 HTML5/javascript 校正音频音量输出分贝,关闭预处理【英文标题】:Correct audio volume output decibels using HTML5 / javascript, turn off pre-processing 【发布时间】:2014-12-22 02:07:02 【问题描述】:

我们观察到,在许多系统上使用基于 javascript 的浏览器音频时,输出电平与输入信号电平的线性比例并不正确。例如,如果您“播放”两个幅度变化 20dB 的正弦波,则来自不同设备/设置的结果差异可能与 20dB 明显不同,例如远达 10dB 或更少。 我们需要将简单的音频信号(例如正弦波)以相互校准的分贝水平发出,例如以一个音量发出一个正弦波,然后发出另一个比第一个安静 20dB 的正弦波,并有他们实际上是这样出来的。 我们希望通过使用 html5/javascript 的浏览器来执行此操作。 我们尝试通过多种方式做到这一点,例如使用预先创建、校准的 .mp3 文件,直接使用 Web Audio API 生成具有校准 dB 电平的振荡器。我们得到了(对我们来说)非常令人惊讶且基本上不正确的结果。 当我们使用校准的麦克风测量从设备发出的声音时,观察到各种奇怪的东西,这表明音频不仅仅是以线性方式“播放”,而是正在对其进行复杂的预处理在它真正得到输出之前。这似乎取决于目前我们无法控制的各种变量。它的工作方式与“普通”音频放大器的工作方式不同,即无论绝对电平设置为多少,20dB 的输入都会产生 20dB 的输出。 我们发现使用相同的 javascript 代码会产生非常不同的结果,这取决于各种变量,包括硬件(例如,在 Mac 上浏览与 iPhone 上的浏览​​)、选择的音量设置(甚至 relative 值也不不同当音量为 1/2 时,输入差异为 20dB 时增加 20dB),如果使用耳机等。

在进一步的测试中,主要问题似乎与使用外部扬声器有关。使用耳机时,效果看起来好多更好。

基本问题是,如果您创建两个具有已知音量差异(例如 20dB)的不同信号,并以几种方式中的任何一种方式将它们都输出,则测得的差异通常不会是 20dB,并且在某些情况下会很糟糕为 10dB。

有没有办法以编程方式做到这一点?

有没有办法覆盖似乎正在调整音量的任何预处理或音频音量压缩(导致输出与输入不正确成比例)?

我们需要一种可以跨平台(桌面、iosandroid、不同浏览器、不同耳机/扬声器)工作的方法,因此需要使用 HTML5。

如果使用 HTML5 无法做到这一点,我们如何使用原生 iOS/Android 代码来做到这一点?这似乎更多是硬件问题而不是软件问题,但也许有办法解决它。

谢谢

【问题讨论】:

许多声卡和操作系统级别的驱动程序会提升安静的声音以使输出更稳定,因此即使使用声音播放应用程序而不是网络也会出现这个“问题”。您将不得不调整操作系统提供的声音属性(如果可用)。还要记住,很少有扬声器具有平坦的线性效率,并且需要 10 倍的瓦特才能使感知的 DB 翻倍。不过,您可以通过校准做得更好;也许使用设备的麦克风来采样不同的输出并进行补偿。这会通过麦克风响应曲线引发更多的不规则性,但总比没有好。 似乎唯一能保证扬声器发出的声音有 20dB 差异的方法是使用麦克风建立一个反馈回路,但这仍然远非完美。跨度> 【参考方案1】:

我们已经通过重要的进一步研究回答了这个问题。 经过详细的测试,以下已经变得清晰了: 1) 在所有测试的系统上,无论其他设置如何,在使用耳机时,声音幅度输出与输入几乎完美地 1:1 线性相关。这适用于多种浏览器、多种设备、iOS、Android、OSX、多种有源和无源耳塞和耳罩式耳机。 2) 在许多系统/设置/音量级别中,当使用外部扬声器时,声音幅度输出与输入不是 1:1 线性相关。相反,声音通常是线性的,斜率小于 1,通常明显更小(例如 1/2)。除了这个斜率之外,许多系统还在较高的音量水平下饱和。这似乎是因为外部扬声器正在使用补偿机制。

因此,正确答案是:只要使用耳机,使用 HTML5/javascript 音频生成的音频输出幅度与输入的线性关系接近 1:1。当在许多常用设备上使用外部扬声器时,它与输入的线性关系并不接近 1:1。

【讨论】:

以上是关于使用 HTML5/javascript 校正音频音量输出分贝,关闭预处理的主要内容,如果未能解决你的问题,请参考以下文章

如何在iPad上使用HTML5 / Javascript合成音频

HTML5/Javascript/jQuery 音频播放器不响应事件?

音频处理使用 PolyPhone 软件修正 SoundFont 音源中的不规范音符 ( 设置音符频率校正 )

在 html5 应用上录制音频

检测视频/音频是不是在 html5 视频标签中停止

音频混音是啥