首页 > 解决方案 > 如何使用 librosa.effects.split() 获得与 pydub.silence.detect_nonsilent() 相似的结果?

问题描述

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

到目前为止,我一直在使用这样的 pydub(segmentis an 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是一个加载了 的 numpy 数组librosa.load(),其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_dBFS和值(由于这里dBFS的出色答案,我知道如何转换并转换AudioSegment为等效的 librosa numpy 数组)?

标签: librosapydub

解决方案


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)

推荐阅读