我正在尝试测量电视内容的各种剪辑(约 2-40 秒)的“响度”。我感兴趣的是内容的相对响度 - 人们在哪些场景中大喊大叫与窃窃私语、嘈杂的音乐与安静的场景等。
我认为这意味着我有兴趣捕捉增益(输入响度)而不是音量(输出响度)...
我用 Python 尝试了两种方法:
librosa 的 RMS:
np.mean(librosa.feature.rms(spectrogram, center=True).T, axis=0)
pyloudnorm:(实现 ITU-R BS.1770-4 响度算法 (LUFS))
meter = pyln.Meter(samplerate) loudness = meter.integrated_loudness(waveform)
当我比较两者的结果时,它们有时是对齐的,但往往是不同的(同样的文章显示 RMS 相对较高,但响度较低,反之亦然)。更重要的是,虽然他们似乎都把一些事情做对了,但似乎都不能非常准确地代表电视的内容。我想知道我是否需要采取一些步骤来过滤掉一些未被感知但以某种方式影响这些指标的频率,或者我是否只是遗漏了一些重要的东西?
最佳答案
响度,即感知某物的响度,可能非常棘手。众所周知,它与频率有关,我们对中间频率范围更敏感。它相对于振幅是非线性的。在某个时候是两倍。
在短尺度上也有时间相关的影响,突然响亮的声音会导致随后的声音看起来比没有先前声音的声音更小(时间掩蔽)。从长远来看——我们倾向于适应逐渐增加的数量(脱敏)。我们倾向于过滤掉信息很少的声音(如静态/重复噪音)。等等。
您至少应该应用频率加权。 A-weighting是常用的。这可以通过对来自 librosa 的 STFT 频谱图进行加权来完成。然后你可以计算它的 RMS。您还应该将其转换为分贝。
关于python - 测量音频 "loudness": RMS vs. LUFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59429684/