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

问题描述 投票:0回答:2

我正在做一个出于教育目的的个人项目,以学习 Keras 和机器学习。首先,我想对声音是拍手声还是跺脚声进行分类。

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

现在,我想将捕获的拍手或踩踏 FFT 信号作为训练数据提供,以便使用神经网络对它们进行分类。我为此研究了一整天,有些文章说应该使用卷积神经网络,有些文章说应该使用循环神经网络。

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

tensorflow keras neural-network tinyml
2个回答
2
投票

您需要处理 FFT 信号来分类声音是拍手声还是跺脚声。

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

CNN 可以从固定长度的输入中提取特征。具有最大池化功能的一维 CNN 在信号数据上效果最好(我个人在加速度计数据上使用它们)。

如果您的输入是固定长度并且具有显着特征,则可以使用它们。

对于循环神经网络:

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

时间特征(例如)可以用这种方式来识别拍手。拍手会立即发出高亢的声音,然后发出轻柔的声音(当拍手结束时)。 RNN 将按顺序学习这两个特征(上面提到的)。而且鼓掌也是一个连续的动作(它由顺序的各种活动组成)。

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

混合Conv LSTM:

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

如果您使用 Keras,这可能非常简单。

提示:

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

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

希望有帮助。


1
投票

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

VGGish 使用如下计算的音频特征进行训练:

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

注意 - 鼓掌已涵盖 (https://research.google.com/audioset/dataset/clapping.html)

© www.soinside.com 2019 - 2024. All rights reserved.