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

Correct audio volume output decibels using HTML5 / javascript, turn off pre-processing

本文关键字:输出 预处理 HTML5 javascript 音频 使用      更新时间:2023-09-26

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

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

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

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

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

我们需要一种方法来做到这一点,它可以跨平台(桌面,iOS,Android,不同的浏览器,不同的耳机/扬声器(,因此使用HTML5。

如果使用HTML5无法做到这一点,我们如何使用本机iOS/Android代码来做到这一点? 这似乎更像是一个硬件问题而不是软件问题,但也许有办法覆盖它。

谢谢

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

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