为什么 librosa splits 提供了不正确的非静音样本

Why librosa splits provides incorrect non-silent samples

我使用了 的代码并将 hop_length 修改为 100。为什么我得到不正确的输出?

具体变化是

print(wave.shape)
non_silent_interval = librosa.effects.split(wave, top_db=0.1, hop_length=100) 
print(non_silent_interval)

我得到输出

(2000,)
[[  0 100]]

但信号包含 1000 个非零样本。为什么它表明非静音样本仅在 0 到 100 之间?

librosa.effects.split 将默认使用信号最大值的参考点 (0 dB)。 top_db 调整静音阈值。如果值低于 -top_db,则认为它们是无声的。因此,对于 top_db=0.1,只有 -0.1 db 到 0.0 db 之间的帧被认为是非静音的,这是极不可能的。第一帧发生这种情况可能只是运气。

为静音阈值使用更大的值 top_db,例如 24。或者任何适合录音动态范围的值。

我找到了答案。

对于 split(),默认 frame_length = 2048。我选择 hop_length 为 100。所有随机样本都落在计算的第一帧(当信号具有计算 RMS 值)。对于下一跳,包括许多来自静默样本的零,这会降低后续帧的 RMS 值。因此,第一帧总是具有高能量。可以通过

获取合适的样本
  1. 增加 top_db,其中包含更多低能量帧(如 @jonnor 建议)
  2. 将 hop_length 从 100 增加到 1000 所以 一帧中包含完整的 1000 个样本
  3. 减少 frame_length 以在计算 RMS 时获得更高的分辨率。我可以得到 通过以下命令获取前 1050 个样本

librosa.effects.split(wave, top_db=10, frame_length=100, hop_length=50)

我们可能必须使用这些参数才能获得所需的结果