librosa - 如何使用 librosa.effects.split() 获得与 pydub.silence.detect_nonsilent() 相似的结果?
问题描述
我喜欢pydub。这很容易理解。但是在检测非静默块时,librosa 似乎要快得多。所以我想尝试在项目中使用 librosa 来加速我的代码。
到目前为止,我一直在使用这样的 pydub(segment
is 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 数组)?
解决方案
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)
推荐阅读
- java - Recursive method to replace all occurrences of a value in a 2D array
- python - 在 seaborn 中使用 catplot 时更改 x-labels 和宽度
- python - 在数据框中搜索索引值
- c - 警告:“root”声明中的类型默认为“int”[-Wimplicit-int]|
- vue.js - axios api 身份验证标头 jwt 和安全性
- python - 删除圆形蒙版周围的空白区域
- rust - 嵌套宏未正确扩展
- javascript - VueJS - 为什么 forEach / push 和 .filter 返回不同的结果?
- reactjs - 如何消除两行之间的间隙?
- knitr - 一致的代码格式内联和带有 bookdown 的块