我的主要目标是为人工神经网络提供mfcc功能。
然而,我陷入了数据预处理步骤,我的问题有两个部分
背景:
我有一个音频。
我有一个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的新手,所以,我可以接受有关最佳实践的建议。
非常乐意提供更多详细信息。 谢谢。
答案 0 :(得分:3)
第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
保存并稍后重新加载。我喜欢使用类来封装输入,输出和字典数据,但你可以选择适合你的任何东西。