pydub 计算 rms 的方式与 sox 不同

pydub computes rms differently to sox

我对 pydub 计算 rms 的方式感到困惑。

In [187]: audio = AudioSegment.from_mp3("sample-mp3")
In [188]: audio.rms
Out[188]: 1041

In [189]: audio.dBFS
Out[189]: -29.959984108983633

但是使用 sox:

$ sox sample.mp3 -n stat
Samples read:         130231296
Length (seconds):   1476.545306
Scaled by:         2147483647.0
Maximum amplitude:     1.000000
Minimum amplitude:    -1.000000
Midline amplitude:    -0.000000
Mean    norm:          0.017384
Mean    amplitude:    -0.000023
**RMS     amplitude:     0.031763**
Maximum delta:         1.308396
Minimum delta:         0.000000
Mean    delta:         0.015841
RMS     delta:         0.028429
Rough   frequency:         6282
Volume adjustment:        1.000

谁能告诉我这些有效值是如何计算的??谢谢。

它们代表相同的价值,只是比例不同。 pydub 似乎适用于带符号的 16 位值(可能是因为 mp3 文件的 16 位深度?),而 SoX 默认将内部 32 位带符号值缩放为 [-1,1]。您可以通过按 2^15 缩放使两个输出一致,或者通过使用 -s 参数告诉 SoX 使用带符号的 16 位缩放。因为 2^31/2^15 是 2^16,所以应该是 -s 65536.