如何使用 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_dBFS
和 dBFS
值(由于出色的答案 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)
我喜欢 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_dBFS
和 dBFS
值(由于出色的答案 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)