学生休息室

分享学生如何在日常项目中使用MATLAB和Simulink的技术和现实例子#学生成功#万博1manbetx

使用机器学习和音频工具箱构建实时音频插件

本周的博客文章是由2019年金奖得主音频工程学会MATLAB插件学生比赛

简介

我叫基督教斯坦梅茨我目前是庞培法布拉大学的硕士研究生,学习声音和音乐计算。我在这两方面都有经验音频工程师他的工作是录制、混音和掌握音乐研究员为音乐创作者和音频工程师打造新工具。我对信号处理和机器学习应用的兴趣是针对音乐制作领域的问题。我要在这里分享的项目,flowEQ,是我使用机器学习制作现有音频信号处理工具的最新尝试参量均衡器,更容易使用。

竞争

这个项目是我参加音频工程学会MATLAB插件学生比赛.我在第147届AES大会与来自世界各地的其他学生一起(所有的参赛作品都可以在这里找到在这里),而我的作品也获得金奖。

比赛的目标是使用音频工具箱建立一个实时音频插件,帮助音频工程师实现一些新的东西。音频工具箱是独特的,因为它允许您编写MATLAB代码来定义如何处理音频,然后自动将其编译为可用于大多数数字音频工作站(daw)的VST/AU插件。这使得构建插件变得相当简单,然后我们可以更专注于算法的开发。

flowEQ

的目标flowEQ是为传统的五波段参数均衡器提供一个高级接口,简化了新手用户应用音色处理(即改变录音声音)的过程。为了有效地利用参数EQ,音频工程师必须深入了解增益、中心频率和Q控制,以及如何串联使用多个波段来实现所需的音色调整。对于业余音频工程师或音乐家来说,这通常会带来太多的复杂性,而flowEQ旨在通过提供面向这类用户的智能界面来解决这一问题。此外,该界面可以为有经验的工程师提供一种快速搜索多个音色剖面的新方法,也有可能解锁新的创意效果。

为了实现这一点,flowEQ使用解纠缠变分自编码器(β-VAE)来构造均衡器参数空间的低维表示。通过遍历解码器网络的这一习得的潜在空间,用户可以更快地搜索五波段参数均衡器的配置。这种方法提倡用耳朵来确定适当的均衡器设置,而不是看传递函数或特定的频率控制。

截图

插件演示

下面是最终插件的演示。您可以看到,随着左侧滑块的移动,右上方所示均衡器的频率响应平滑地变化。五个波段中的每一个(五个双四滤波器串联在一起)产生一个整体频率调整,以前需要同时改变13个参数才能实现的功能,现在可以通过调整两个滑块(在二维模式下)来实现。在接下来的部分中,我们将详细介绍它是如何工作的,以及它是如何实现的。(想知道这是什么声音,请看短片现场插件演示视频。)

细节

数据集

要训练任何一种模型,我们都需要数据。对于这个项目,我们使用SAFE-DB均衡器数据集,它提供了一个由真正的音频工程师使用的五波段参数均衡器的设置集合,以及每个设置的语义描述符。数据集中的每个样本都包含均衡器的配置(13个参数的设置)以及语义描述符(例如,温暖、明亮、尖锐等)。

在我们的公式中,我们认识到均衡器的参数空间是非常大的(如果我们说每个参数可以取20个不同的值,这将给我们~4e15个可能的配置,超过单元格数量在人体内。)然后我们假设数据集中的样本代表了这个参数空间的一部分,在音频工程师处理音乐信号时最有可能被利用。然后,我们的目标是建立一个模型,学习这个空间的良好结构,低维组织,这样我们就可以从中取样。

模型

为了实现这一点,我们使用a变分autoencoder.为了更好地介绍这个主题,我推荐这个YouTube视频来自Arxiv Insights频道。自动编码器是一种以无监督的方式学习数据分布的独特公式。这是通过迫使模型在将输入通过瓶颈(因此模型不能简单地将输入传递给输出)后重构自己的输入来实现的。变分自编码器扩展了一般的自编码器公式,为我们的用例提供了一些很好的特征。在这里,我将简要介绍我们如何使用这个模型来构建插件的核心。

在训练过程中,我们的模型学习在将原始输入通过低维瓶颈(1,2或3维)后重建均衡器的13个参数。我们测量输出和输入之间的误差(重构损失),然后更新编码器和解码器的权重,以减少当前示例的这个误差。

虽然这看起来似乎不是一个有用的任务,但我们发现,如果我们使用模型的解码器部分(将低维向量作为输入),我们可以使用非常少的旋钮(根据潜在空间的维数,1、2或3)重建大范围的均衡器曲线。下图演示了这个操作。在这里,我们已经丢弃了编码器和二维平面的样本点,并将这些点馈送到解码器。解码器然后尝试重新构造完整的13个参数。这种低维潜在空间提供了一种简单的方法来搜索可能的均衡器参数空间。

译码器操作

译码器操作

为了给用户提供更多的灵活性,并对潜在空间的复杂性进行实验,我们训练了具有不同潜在空间维度(1、2和3)的模型。在插件中,用户将能够在这些维度中进行选择,这将改变为了控制整个均衡器而需要改变的滑块数量。例如,在一维情况下,用户只需要移动一个滑块来控制均衡器。

我们通过引入解纠缠变分自编码器(β-VAE)进一步扩展了这一点,它对损失函数做了轻微的修改(请参阅详情)。重要的一点是,这为我们提供了一个新的超参数β,可以在我们训练时修改,以改变模型将学习的表示类型。因此,我们在不同的β值和不同的潜在空间维数下,总共训练了12个模型。然后我们在插件中提供这些模型,用户可以从中选择,并通过监听来评估。

表格

既然我们已经从较高的层次上理解了模型,我们将简要介绍一些实现细节。编码器和解码器都只有一个完全连接的隐藏层,包含1024个单元和一个ReLU激活。中心瓶颈层有1、2或3个具有线性激活的隐藏单元。解码器的最终输出层是一个完全连接的层,有13个单元和一个sigmoid激活函数(所有输入都在0到1之间标准化)。这使得一个非常小的模型(大约30k个参数),但由于非线性,我们可以学习一个强大的映射(比0到1更强大)主成分分析例如。)一个小模型很好,因为我们可以更快地训练它,而且推断时间也快得多。通过译码器网络的前向传输在CPU上只需要大约300 μs秒。

网络体系结构

网络体系结构

模型的实现和训练与Keras框架中,您可以看到用于训练模型的所有代码以及最终的权重火车目录GitHub库.这些模型后来在MATLAB中实现,因此可以包含在插件中。有关我们如何实现这一目标的细节,请参阅下面的挑战部分。

插件

这个插件可以分为两个主要部分:过滤器和经过训练的解码器。我们实现了一个基本的五波段参数均衡器,它由五个串联的双四方滤波器组成(这反映了在构建原始训练数据过程中使用的均衡器的结构)。最低和最高的波段是搁置滤波器,中心的三个波段是峰值滤波器。有关过滤器实现的更多细节,请参阅经典音频EQ食谱.搁置滤波器有两个控制:增益和截止频率,而峰值滤波器有三个:增益,截止频率和q。这些控制组成了均衡器的13个参数。我们使用这些参数的值和前面提到的过滤器公式来计算所有过滤器的系数,当它们发生变化时,然后使用基本的过滤器函数在MATLAB中应用滤波器到音频块。

现在我们在MATLAB中实现解码器,并将其输出连接到均衡器的控件。当用户移动x, y, z潜在空间滑块时,这些值将通过解码器生成相应的均衡器参数,并计算新的滤波器系数。主要有两种操作模式:遍历语义

遍历模式允许用户自由探索模型的潜在空间。在这种模式下,三个x, y, z滑块可以用来遍历解码器的潜在空间。每个潜在矢量解码为五波段均衡器中13个参数的一组值。

语义模式允许从潜在空间采样的不同方法。x, y, z滑块被禁用,并使用嵌入A和嵌入B组合框,以及插值滑块。训练后,利用语义标签识别潜在空间内的相关聚类。这些簇表示与特定语义描述符相关的潜在空间区域。Interpolate控件允许用户在潜在空间的两个语义描述符之间无缝移动。

插件框图

插件框图

上面的方框图提供了到目前为止我们提到的所有元素的概述。顶部部分显示了音频信号处理路径与五个级联的双四滤波器。中央部分显示解码器,其输出连接到滤波器的参数。在底部,我们看到用户可以从插件界面调整的控件(如下所示)。调谐参数在12个不同的训练解码器模型中进行选择,而不考虑模式遍历语义模式也会显示出来。在手册模式下,原来显示在界面底部的13个参数是主动控制均衡器,而不是使用解码器。

截图

完整的插件接口

评价

对这种性质的模型进行评估是具有挑战性的,因为我们没有“良好”潜在表征的客观度量。请记住,我们的目标不一定是创建一个可以完美地重建任何参数集的模型,而是有一个结构良好的潜在表示,允许用户快速搜索空间,找到他们正在寻找的声音。因此,我们的第一个评价措施是通过视觉检查潜在空间的流形。我们将在二维模型中这样做,因为这是最好的可视化模型。

图像

二维潜空间流形

在这里,我们展示了x和y维中从-2到2的二维潜在空间中的每个点的频率响应曲线(y轴为增益-20 dB到20 dB, x轴为频率从20 Hz到20 kHz),这给了我们这个示例网格。我们对每个二维模型在我们训练的所有β值上都这样做。这将让我们看到β的影响以及每个模型的潜在空间的结构。

我们观察到,随着β的增加,潜在空间变得更加正则化,对于β=0.020的情况,许多点似乎解码为相同的均衡器传递函数,而我们不希望出现这种行为。这是一个可能被认为是过度正则化的例子。因此,β=0.001的模型可能是最好的选择,因为它在保持连贯和平滑的结构的同时显示出最大的多样性。这意味着当用户搜索整个空间时,声音会有一些可解释的变化,而且变化的方式不会太突然。简而言之,使用较大的β值迫使模型以单位高斯的形状构造潜在空间,因此失去了一些表现力。

评估这些不同模型的最佳方法是进行用户研究,即盲目地给音频工程师提供不同的模型,并要求他们实现某个目标。用户能最快找到他们想要的目标的模型就是最好的模型。出于这个原因,我们在插件中包含了所有12个模型,希望我们能得到用户对哪种模型工作最好的反馈。

挑战

目前在音频软件(如音频插件或嵌入式软件)中实现在常用开源框架(如Keras)中开发的深度学习模型所面临的挑战之一是缺乏将这些网络转换为C或c++的自动化方法。MATLAB提供了一种自动的方法来构造和运行我们的Keras模型importKerasNetwork函数从深度学习工具箱.这将在Keras中训练后加载HDF5模型的权重和架构,并将模型作为DAGNetwork对象。不幸的是,这些对象目前不支持自动生成通用的c++代码(尽管Deep Learning To万博1manbetxolbox中的其他类型的网络架构和层可以生成优化的CUDA和C代码,以运行在gpu、ARM或Intel内核上)。对于我们的音频插件,我们最终需要独立于目标的c++代码在不同操作系统的不同CPU目标上运行。

为了解决这个问题,我们自己用纯MATLAB代码实现了网络。这相当简单,因为我们的网络相对较小。我们首先转换。h5文件中保存的权重从Keras到。文件,然后将这些权重加载为矩阵(W1W2对于解码器隐藏层和输出层)。预测函数如下所示,仅由几个带有输入潜在变量的矩阵操作组成z层权值,加上激活函数。要查看模型的完整实现,请参见译码器我们建立的班级。

函数y_hat = predict(obj, z)%取一个具有适当维数的潜在向量z% output是一个13x1的归一化(0到1)均衡器参数向量。z1 = (z * obj.W1) + obj.b1;a1 = obj.ReLU(z1);z2 = (a1 * obj.W2) + obj.b2;A2 = obj.sigmoid(z2);Y_hat = a2;结束

顺便提一句,我还遇到了MathWorks内部开发的一个工具,它能够从高级深度网络对象自动生成类似于上面代码片段的低级MATLAB代码。对于这个项目,这将进一步简化从经过训练的Keras模型到插件实现的转换。我知道这个工具目前还没有与任何官方的MATLAB插件产品一起发布,但如果你感兴趣的话,你可以联系MathWorks。

在实时音频插件中实现深度学习模型仍然是一个相对未开发的领域。无论使用什么框架,我们仍然没有明确的方法来实现这一目标。实时音频应用程序还施加了严格的运行时间限制,这意味着我们的深度模型必须足够快,以免在音频流中造成中断,或者在用户更改参数时出现声音延迟,从而导致糟糕的用户体验。

未来的发展方向

flowEQ在很大程度上仍然是一个概念的证明,目前的实现在一定程度上受到MATLAB框架的限制。下面是进一步改进插件并扩展其功能的一些未来开发领域。

  • 连接潜在空间均衡器和手动均衡器控件的元参数
  • 基于音频内容的自适应潜空间(即条件VAE)
  • 利用语义描述符寻找/收集更多的数据,扩大潜在空间的多样性
  • 进一步进行超参数优化,确定训练时间、β、网络结构等。

资源

如果你觉得这个项目有趣,请在Twitter上关注我@csteinmetz1查看我最新项目的更新,也可以查看我用MATLAB +深度学习+音频完成的其他项目,比如NeuralReverberator,它使用卷积自编码器合成新的混响效果。

|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。