【问题标题】:pydub computes rms differently to soxpydub 计算 rms 与 sox 不同
【发布时间】:2019-10-07 17:17:45
【问题描述】:

我对@9​​87654321@ 如何计算 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

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

【问题讨论】:

    标签: python audio speech sox pydub


    【解决方案1】:

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

    【讨论】:

    • 感谢@AkselA! -s 参数似乎不起作用。 sox sample_audio.mp3 -n stats -s 65536sox FAIL stats: parameter 'p->scale' must be between -99 and 99 sox FAIL stats: usage: [-b bits|-x bits|-s scale] [-w window-time]
    • 另外,来自问题中的示例。 1041/65536=0.015884 这不是 sox 给出的 0.031763。这里的缩放有点令人困惑。如果我做 1041/(232/216)=0.031768 接近 0.031763.. 但为什么。
    • @Blue482:您需要将-sstat 一起使用,而不是stats。从有符号 32 到有符号 16 位时除以 2^16,但从有符号 16 位到 [-1,1] (2^1) 时除以 2^15。记住与指数的乘法是如何工作的。 16-1 = 15。
    猜你喜欢
    • 2013-04-01
    • 2020-08-25
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多