ioa*_*_bl 2 python audio mfcc librosa
当我从音频中提取 MFCC 时,输出为(13, 22). 数字代表什么?是时间范围吗?我用的是librosa。
使用的代码是:
mfccs = librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=13, hop_length=256)
mfccs
print(mfccs.shape)
Run Code Online (Sandbox Code Playgroud)
输出是(13,22).
是的,这是时间范围,主要取决于您提供的样品数量y以及hop_length您选择的内容。
假设您有 10 秒的音频采样频率为 44.1 kHz(CD 质量)。当您使用 librosa 加载它时,它会重新采样到 22,050 Hz(这是 librosa 默认值)并缩混到一个通道(单声道)。然后,当您运行STFT、melspectrogram或MFCC之类的东西时,就会计算所谓的特征帧。
问题是,您在 10 秒的音频中获得了多少(特征)帧?
对此的决定性参数是hop_length. 对于所有提到的功能,librosa 在 1d 音频信号上滑动一定长度(通常为 )的窗口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 个样本上移动一段长度多少次?精确的数字取决于该段的长度。但让我们暂时忽略这一点,并假设当我们到达末尾时,我们只需对输入进行零填充,这样只要至少有一些输入,我们仍然可以计算帧。那么计算就变得微不足道了:
number_of_samples / hop_length = number_of_frames
Run Code Online (Sandbox Code Playgroud)
因此,对于我们的示例,这将是:
220500 / 256 = 861.3
Run Code Online (Sandbox Code Playgroud)
所以我们得到大约 861 帧。
请注意,您可以通过计算所谓的 来使此计算变得更加容易frame_rate。这是每秒的帧数,以 Hz 为单位。它是:
frame_rate = sample_rate / hop_length = 86.13
Run Code Online (Sandbox Code Playgroud)
要获取输入的帧数,只需乘以frame_rate音频长度即可设置(忽略填充)。
frames = frame_rate * audio_in_seconds
Run Code Online (Sandbox Code Playgroud)