根据带注释的文件

时间:2018-01-19 03:02:41

标签: python audio mfcc librosa

我的主要目标是为人工神经网络提供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的新手,所以,我可以接受有关最佳实践的建议。

非常乐意提供更多详细信息。 谢谢。

1 个答案:

答案 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保存并稍后重新加载。我喜欢使用类来封装输入,输出和字典数据,但你可以选择适合你的任何东西。