如何使用 librosa.effects.split() 获得与 pydub.silence.detect_nonsilent() 相似的结果?

How to get similar results to pydub.silence.detect_nonsilent() using librosa.effects.split()?

我喜欢 pydub。这很容易理解。但是在检测非静默块时,librosa 似乎要快得多。所以我想尝试在项目中使用 librosa 来加速我的代码。

到目前为止,我一直这样使用 pydub(segment 是一个 AudioSegment):

thresh = segment.dBFS - (segment.max_dBFS - segment.dBFS)
non_silent_ranges = pydub.silence.detect_nonsilent(segment, min_silence_len=1000, silence_thresh=thresh)

thresh 公式在大多数情况下效果很好,当效果不佳时,将它向上或向下移动 5 个左右的 dbs 就可以了。

使用 librosa,我正在尝试这个(y 是一个加载了 librosa.load() 的 numpy 数组,sr 为 22050)

non_silent_ranges = librosa.effects.split(y, frame_length=sr, top_db=mistery)

为了获得与 pydub 类似的结果,我尝试将 mistery 设置为以下内容:

mistery = y.mean() - (y.max() - y.mean())

将 y 转换为 dbs 后相同:

ydbs = librosa.amplitude_to_db(y)
mistery = ydbs.mean() - (ydbs.max() - ydbs.mean())

在这两种情况下,结果都与从 pydub 获得的结果大不相同。

我没有音频处理方面的背景知识,虽然我阅读了 rms、dbFS 等,但我就是不明白——我想我老了:)

有人能给我指出正确的方向吗?什么相当于我在 librosa 中的 pydub 解决方案?或者至少,向我解释如何在 librosa 中获取 pydub 的 max_dBFSdBFS 值(由于出色的答案 here)?

max_dBFS 本质上总是 0。 dBFS 是声音比最大可能信号“安静”多少。

我怀疑你的问题的另一部分是 ydbs.max() 是 ydbs 中数据中的最大值,而不是可以存储的最大可能值(即可能的最大整数或浮点数)

与 pydub 的另一个区别是您使用 ydbs.mean(),pydub 在计算 dBFS 时使用 RMS。

您可以像这样将 ydbs.mean() 转换为 dbfs:

from numpy import mean, sqrt, square, iinfo

max_sample_value = iinfo(ydbs.dtype).max
ydbs_rms = sqrt(mean(square(ydbs))

ydbs_dbfs = 20 * log(ydbs_rms) / max_sample_value, 10)