用于控制频谱图大小的参数



我正在尝试按照以下说明获取频谱图。

每个音频片段的持续时间为 5 秒。 大小相等的帧是 从音频中提取(连续帧之间有重叠),每个帧由 1024 样品。梅尔刻度分为 128 个箱。因此, 音频段的频谱图的维度为 192×128。

据我所知,该指令意味着melspectrogram函数中的n_mels=128n_fft=1024。所以我试图用以下代码获取频谱图:

from librosa import load, power_to_db
from librosa.display import specshow
from librosa.feature import melspectrogram
audio_path = r'5s.wav'
y, sr = load(audio_path,sr=44100)
S = melspectrogram(y,sr,n_mels=128,n_fft=1024,hop_length=512)
print(S.shape)

y的形状是(220500,)的,采样率sr44100而我得到的频谱图形状是(128, 431)的。128 mel-scale大小是正确的,但我得到的帧数是431的,而不是指令中提到的192帧。

为了获得 192 帧,我将采样率更改为22050并不断调整hop_lenght,直到频谱图有192帧:

audio_path = r'5s.wav'
y, sr = load(audio_path,sr=22050)
S = melspectrogram(y,sr,n_mels=128,n_fft=1024,hop_length=575)
print(S.shape)

但是,我不确定这是否是获得我想要的频谱图维度的正确方法。似乎这个过程只是反复试验。我想知道是否有更科学的方法可以在不猜测参数值的情况下获得具有我想要的形状的频谱图?

如果你把你的y_shape长度除以hop_length- 你会得到帧数:

220500 / 512 = 430.6

如果需要 192 帧,请在y中输入193 * 512 = 98816样本。

最新更新