【发布时间】:2020-10-24 21:02:32
【问题描述】:
当我从音频中提取 MFCC 时,输出为 (13, 22)。数字代表什么?是时间框架吗?我使用 librosa。
使用的代码是:
mfccs = librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=13, hop_length=256)
mfccs
print(mfccs.shape)
输出是(13,22)。
【问题讨论】:
当我从音频中提取 MFCC 时,输出为 (13, 22)。数字代表什么?是时间框架吗?我使用 librosa。
使用的代码是:
mfccs = librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=13, hop_length=256)
mfccs
print(mfccs.shape)
输出是(13,22)。
【问题讨论】:
是的,这是时间框架,主要取决于您通过y 提供的样本数量以及您选择的hop_length。
假设您有 10 个以 44.1 kHz(CD 质量)采样的音频。当您使用 librosa 加载它时,它会重新采样到 22,050 Hz (that's the librosa default) 并下混到一个通道(单声道)。然后,当您运行 STFT、melspectrogram 或 MFCC 之类的东西时,会计算所谓的特征框架。
问题是,你 10 多岁的音频可以获得多少(特征)帧?
对此的决定性参数是hop_length。对于所有提到的功能,librosa 在一维音频信号上滑动一个特定长度的窗口(通常为n_fft),即,它一次查看一个较短的片段(或帧),计算该片段的特征并继续前进到下一段。这些段通常是重叠的。两个这样的段之间的距离是hop_length,它以样本数指定。它可能与n_fft 相同,但通常hop_length 是n_fft 的一半甚至四分之一。它允许您控制特征的时间分辨率(光谱分辨率由n_fft 或n_mfcc 控制,具体取决于您实际计算的内容)。
44.1 kHz 的 10 秒音频是 441000 个样本。但请记住,librosa 默认重新采样到 22050 Hz,所以它实际上只有 220500 个样本。如果我们在每一步中移动 256 个样本,我们可以在这 220500 个样本上移动一段长度多少次?确切的数字取决于段的长度。但是让我们暂时忽略这一点,假设当我们到达终点时,我们只是零填充输入,这样只要至少有 一些,我们仍然可以计算帧/em> 输入。然后计算变得微不足道:
number_of_samples / hop_length = number_of_frames
所以对于我们的示例,这将是:
220500 / 256 = 861.3
所以我们得到了大约 861 帧。
请注意,您可以通过计算所谓的frame_rate 来简化此计算。这是每秒帧数,以赫兹为单位。它是:
frame_rate = sample_rate / hop_length = 86.13
要获得输入的帧数,只需将 frame_rate 与音频的长度相乘即可(忽略填充)。
frames = frame_rate * audio_in_seconds
【讨论】:
n_fft 未及时在样本中指定。我在答案中添加了一个综合示例,以便更容易理解。
n_mfcc=13。