如何使用FFT和神经网络对声音进行分类?我应该使用CNN还是RNN?

时间:2019-05-03 22:51:51

标签: tensorflow keras neural-network

我正在做一个个人项目,目的是为了学习Keras和机器学习。首先,我想对声音是拍手还是踩脚进行分类。

我正在使用触发声音并在20usec采样声音的微控制器。然后微控制器会将原始的ADC数据发送到PC进行Python处理。我目前正在取1000点,并使用numpy获取FFT(使用rfft并获取其绝对值)。

现在,我想将捕获的FFT信号拍手或踩踏作为训练数据,以使用神经网络对其进行分类。我整天都在研究此问题,有些文章说应该使用卷积神经网络,而有些文章应该使用递归神经网络。

我看了卷积神经网络,它提出了另一个问题,是否应该使用Keras的1-D或2-D转换。

2 个答案:

答案 0 :(得分:1)

您需要处理FFT信号以区分声音是拍手声还是脚踩声。

对于卷积神经网络(CNN):

CNN可以从固定长度的输入中提取特征。带有Max-Pooling的一维CNN在信号数据上效果最好(我个人将它们用于加速度计数据上。)

如果您的输入是固定长度并且具有重要功能,则可以使用它们。

对于递归神经网络:

当信号具有时间特征时应使用。

  

可以以这种方式考虑时态特征(例如),以便识别拍手。拍手立即发出高​​声,然后发出轻声(拍手结束时)。 RNN将按顺序学习这两个功能(如上所述)。拍手也是一个顺序动作(它由依次的各种活动组成)。

如果RNN和LSTM具有出色的功能,它们可能是最佳选择。

混合Conv LSTM:

此NN是CNN和LSTM(RNN)的混合体。他们使用CNN进行特征提取,然后LSTM学习此序列。 CNN提取的特征还包含时间特征。

如果您使用Keras,这可能非常容易。

提示:

在执行音频分类时,我还将建议使用MFCC提取特征。

我认为您应该尝试所有3种方法,然后看看哪种方法最合适。 RNN和ConvLSTM很可能会适合您的用例。

希望有帮助。

答案 1 :(得分:1)

由于在这种情况下,训练/测试系统不是嵌入式系统,因此请查看VGGish(https://github.com/tensorflow/models/tree/master/research/audioset-也指包括拍手的论文和数据集),它使用以下内容来计算集合功能:

VGGish经过训练,具有如下音频功能:

  • 所有音频都重新采样为16 kHz单声道。
  • 使用一个短时傅立叶变换的幅值来计算频谱图,其窗口大小为25 ms,窗口跳跃为10 ms,并且周期为Hann窗口。
  • 通过将光谱图映射到64个mel箱来计算mel光谱图 覆盖范围125-7500 Hz。
  • 稳定的对数梅尔谱图是 通过应用log(mel-spectrum + 0.01)计算,其中偏移为 用于避免取零的对数。
  • 然后这些功能 构成0.96秒的非重叠示例,其中每个 该示例涵盖了64个梅尔频段和每个10 ms的96帧。

注意-拍手已被涵盖(https://research.google.com/audioset/dataset/clapping.html