为什么 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 值。因此,第一帧总是具有高能量。可以通过
获取合适的样本
- 增加 top_db,其中包含更多低能量帧(如
@jonnor 建议)
- 将 hop_length 从 100 增加到 1000 所以
一帧中包含完整的 1000 个样本
- 减少 frame_length 以在计算 RMS 时获得更高的分辨率。我可以得到
通过以下命令获取前 1050 个样本
librosa.effects.split(wave, top_db=10, frame_length=100, hop_length=50)
我们可能必须使用这些参数才能获得所需的结果
我使用了
具体变化是
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 值。因此,第一帧总是具有高能量。可以通过
获取合适的样本- 增加 top_db,其中包含更多低能量帧(如 @jonnor 建议)
- 将 hop_length 从 100 增加到 1000 所以 一帧中包含完整的 1000 个样本
- 减少 frame_length 以在计算 RMS 时获得更高的分辨率。我可以得到 通过以下命令获取前 1050 个样本
librosa.effects.split(wave, top_db=10, frame_length=100, hop_length=50)
我们可能必须使用这些参数才能获得所需的结果