Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pydub计算rms的方式与sox不同_Python_Audio_Speech_Sox_Pydub - Fatal编程技术网

Python pydub计算rms的方式与sox不同

Python pydub计算rms的方式与sox不同,python,audio,speech,sox,pydub,Python,Audio,Speech,Sox,Pydub,我对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): 14

我对
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

有人能告诉我这些rms值是如何计算的吗??Thx

它们代表相同的值,只是在不同的尺度上
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 65536
sox FAIL stats:参数'p->scale'必须介于-99和99之间sox FAIL stats:用法:[-b位|-x位|-s scale][w窗口时间]同样来自问题中的示例。1041/65536=0.015884,这不是sox给出的0.031763。这里的缩放有点混乱。如果我做1041/(232/216)=0.031768,接近于0.031763。。但是为什么。@Blue482:您需要将
-s
stat
一起使用,而不是
stats
。从有符号32位到有符号16位时除以2^16,但从有符号16位到[-1,1](2^1)时除以2^15。记住指数乘法是如何工作的。16-1 = 15.