很多文章都在使用CNN来提取音频特征。输入数据是具有时间和频率两个维度的语谱图。
在创建音频频谱图时,需要指定两个维度的确切大小。但它们通常不是固定的。可以通过窗口大小指定频率维度的大小,但是时域呢?音频样本的长度不同,但CNN的输入数据大小应该是固定的。
在我的数据集中,音频长度从1秒到8秒。填充或剪切总是对结果影响太大。
所以我想知道更多关于这个方法的信息。
发布于 2016-05-06 13:51:25
CNN是基于帧窗口计算的。你可以选取周围的30帧图像,然后训练CNN对它们进行分类。在这种情况下,您需要有帧标签,您可以从其他语音识别工具包中获得这些标签。
如果你想有纯粹的神经网络解码,你最好训练递归神经网络(RNN),它们允许任意长度的输入。为了提高RNN的准确性,你最好有CTC层,它允许在没有网络的情况下调整状态对齐。
如果您对这个主题感兴趣,可以尝试https://github.com/srvk/eesen,这是一个为使用递归神经网络进行端到端语音识别而设计的工具包。
还有相关的Applying neural network to MFCCs for variable-length speech segments
发布于 2020-09-22 15:26:34
好了,我终于找到了一个谈论这件事的paper。在论文中,他们说:
通过填充/剪辑到4秒的持续时间来标准化所有音频剪辑
所以,是的,你所说的对你的表现有影响的是他们在论文中所做的事情。
这类应用程序的一个示例可以是UrbanSoundDataset。它是一个不同长度音频的数据集,因此任何使用它的论文(对于非RNN网络)都将被迫使用这种或其他方法,将声音转换为相同长度的向量/矩阵。我推荐论文Deep Convolutional Neural Networks and Data Augmentation for Environmental Sound Classification或ENVIRONMENTAL SOUND CLASSIFICATION WITH CONVOLUTIONAL NEURAL NETWORKS。后者的代码是开源的,你可以看到它在this notebook的function _load_audio
上也有4秒的音频。
如何裁剪音频
from pydub import AudioSegment
audio = pydub.AudioSegment.silent(duration=duration_ms) # The length you want
audio = audio.overlay(pydub.AudioSegment.from_wav(path))
raw = audio.split_to_mono()[0].get_array_of_samples() # I only keep the left sound
Mel-spectrogram
标准是对这类应用程序使用mel-spectrum。您可以使用Python库Essentia并遵循this示例,或者像这样使用librosa:
# Attention, I do not cut / pad this example
y, sr = librosa.load('your-wav-file.wav')
mel_spect = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=2048, hop_length=1024)
https://stackoverflow.com/questions/37045126
复制相似问题