神经网络的音频分析
将 Audio 对象(或音频文件)转换为适合神经网络的格式的基本工具是 NetEncoder. Wolfram 语言本身提供了几种基于不同类型的特征计算的音频编码器. 这些编码器都利用底层、并行实现以允许非常快速的计算.
编码器类型
"Audio" | 信号波形 |
"AudioMelSpectrogram" | 信号的短时傅立叶变换 |
"AudioMFCC" | 信号的频谱 |
"AudioSpectrogram" | 频率在梅尔标度上等间隔的频谱 |
"AudioSTFT" | 梅尔频谱的对数的 FourierDCT |
"Audio" 编码器简单地提取信号的波形. 这保留了所有信息,但结果的维度对于神经网络并不理想.
"AudioSTFT" 编码器对信号进行分区,并在每个分区上计算 Fourier 变换(整个操作称为短时傅立叶变换,或STFT). 这提供了时间和频率信息,并且由于傅立叶变换是可逆的,因此保留了原始信号中的所有信息.
"AudioSpectrogram" 编码器计算 STFT 的平方幅度,并丢弃冗余部分. 这降低了特征的维数,但是相位信息丢失了. 仍然可以计算原始信号的近似重建(有关详细信息,请参阅 InverseSpectrogram).
"AudioMelSpectrogram" 编码器将滤波器组应用于频谱图. 滤波器组的中心频率在梅尔尺度上线性地间隔开,这是一种非线性频率尺度,模仿人类对音调的感知. 这进一步降低了维度.
绘制 "AudioMelSpectrogram" 编码器的结果:
数据增强
在处理有限或缩小尺寸的数据集时,数据增强非常有用,并且使网络对于训练数据中的人为/无关趋势更加健壮. 例如,如果你要对猫和狗的录音进行分类,并且在训练数据中所有的狗都是用嘈杂的麦克风录制的,那么网络最终可能会识别出噪音而不是狗.
"TimeShift" | 将输入移动一个可以随机化的量 | |
"Noise" | 通过特定的 Audio 或文件或白噪声为输入添加噪声 | |
"Volume" | 将输入与可以随机化的常数相乘 | |
"Convolution" | 通过特定的 Audio 或文件对输入卷积脉冲响应 | |
"VTLP" | 将声道长度扰动应用于输入 |
ConvolutionLayer 支持可变长度输入. 这可以通过将 "Interleaving" 选项设置为 True 来实现. 然后可以基于 "LeNet" 架构构建非常简单的卷积网络,该架构广泛用于图像处理. 需要对最终层进行一些调整以适应音频数据的可变长度性质.
另一种方法是创建一个完全循环的网络. 网络基于 GatedRecurrentLayer 堆栈,后面是一个简单的分类部分. 为了添加一些正则化,在循环层的输入处使用丢弃 (dropout).
在某些情况下,目标是训练网络以在记录中定位声音事件,但数据被“弱标记”,其中标签仅表示记录中是否存在某个事件,而不是在哪里. 尽管数据有限,但通过对弱标记数据的训练,可以在声音事件定位中获得良好的结果.
使用 "AudioMelSpectrogram" 编码器将音频信号馈入网络. 由于数据量相对较小,因此可以进行数据增强以使训练更有效.
具有对比损失的暹罗 (Siamese) 网络
学习嵌入的第一个策略是使用对比损失训练暹罗网络. 这涉及将两个输入馈送到完全相同的网络,计算两个输出之间的距离并将其馈送到对比损失. 如果两个输入属于同一个类,则距离将最小化;如果它们不是同一类,则距离将最大化.
此示例将使用非常简单的循环网络来生成嵌入. 它还将定义一个网络来训练嵌入. 这将需要将两个输入馈送到同一网络并计算所得嵌入的距离. 使用 NetInsertSharedArrays 确保两个输入由完全相同的网络处理.
使用学习嵌入定义 NearestFunction,并从示例中找到最近和最远的信号:
预训练的音频特征提取器
从头开始学习嵌入的替代方法是利用预训练的音频分析网络. Wolfram Neural Net Repository 是一个很好的资源.
AudioIdentify 使用深度神经网络作为后端来执行音频分类. 网络在 AudioSet 数据集上进行了训练,其中每个音频信号都使用录音中存在的声音类/源进行注释. 标签被组织在大约 600 个类的本体中,这些类跨越非常广泛的声音类型或来源,从乐器和音乐类型到动物,机械和人类声音.
导入 AudioIdentify 网并将其应用于 Audio 对象:
在 AudioIdentify 网中,信号被分成固定大小的块,并且主网被应用于每个块的梅尔频谱图. 使用 NetExtract 来获取它. 与 "CNN Architectures for Large-Scale Audio Classification" 中呈现的架构类似,主网络具有 CNN 架构(基于 MobileNet v2).
在 NetMapOperator 的核心提取网络:
AudioIdentify 中使用的网络不仅可用于识别声音,还可用于从录音中提取特征. 这允许任何信号嵌入在语义上有意义的空间中,其中可以计算相似性和距离.
可以删除负责分类任务的最后几个层,并且可以将生成的网络重新插入到原始 NetChain 中. 该网络将为每个音频输入产生一个固定大小,语义上有意义的向量. 它可以用作系统中所有高级机器学习功能的特征提取器,或者作为训练新神经网络的起点.
创建一个特征提取器网并在 FeatureSpacePlot 中使用它:
另一个替代方案是 "VGGish Feature Extractor Trained on YouTube Data" 模型,这是一个结构相似的网络,由谷歌专门用于音频特征提取的 YouTube 数据训练的.
使用 VGGish 网络作为 FeatureSpacePlot 中的特征提取器:
首先下载 ESC-50 数据集.
使用 AudioIdentify 中的网络作为起点.
不是重新训练全网并在 NetTrain 中指定 LearningRateMultipliers 选项来仅训练分类层,而是预先计算特征提取器网的结果并训练分类器. 这避免了在训练期间对完整网络的冗余计算.