我的主要目标是将mfcc功能提供给ANN。
但是,我被困在数据预处理步骤中,我的问题分为两个部分。
背景 :
我有声音
我有一个带有注释和时间戳的txt文件,如下所示:
0.0 2.5 Music
2.5 6.05 silence
6.05 8.34 notmusic
8.34 12.0 silence
12.0 15.5 music
我知道对于一个音频文件,我可以使用librosa这样计算mfcc:
import librosa
y, sr = librosa.load('abcd.wav')
mfcc=librosa.feature.mfcc(y=y, sr=sr)
第1部分:我无法围绕两件事:
如何根据注释中的片段计算mfcc。
第2部分:如何最好地存储这些mfcc,以将其传递给keras DNN。也就是说,应将每个音频段计算出的所有mfcc都保存到单个列表/词典中。还是最好将它们保存到不同的词典中,以便将属于一个标签的所有mfcc放在一个位置。
我是音频处理和python的新手,所以我愿意接受有关最佳做法的建议。
乐意提供更多详细信息。
谢谢。
最佳答案
第1部分:MFCC到标签的转换
从librosa文档中看不出来,但是我相信mfcc的计算大约是23mS的帧速率。将您的代码放在mfcc.shape
之上,将返回(20, x)
,其中20是要素数量,而x对应于x帧数。 mfcc的默认hop_rate
是512个样本,这意味着每个mfcc样本的跨度约为23mS(512 / sr)。
使用此功能,您可以计算出文本文件中哪个框架与哪个标签一起使用。例如,标记Music
的时间为0.0到2.5秒,因此将是mfcc帧0到2.5 * sr / 512〜=108。它们的输出将不完全相等,因此需要四舍五入。
第2A部分:DNN数据格式
对于输入(mfcc数据),您需要确定输入的外观。您将具有20个功能,但是要向网络输入一个帧还是要提交时间序列。您是mfcc数据已经是一个numpy数组,但是其格式为(feature,sample)。您可能想将其反转以输入到Keras。您可以使用numpy.reshape
来做到这一点。
对于输出,您需要为文本文件中的每个标签分配一个数值。通常,您将tag to integer
存储在字典中。然后,这将用于创建网络的训练输出。每个输入样本应有一个输出整数。
第2B部分:保存数据
最简单的方法是使用pickle
保存并稍后重新加载。我喜欢使用一个类来封装输入,输出和字典数据,但是您可以选择任何适合自己的方法。
关于python - 根据带注释的文件为音频片段生成mfcc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48333516/