Neutons SDK是研究人员的工具,使他们能够包装自己的音频模型,并使用我们的Netons插件将其运行。我们提供功能,既可以将模型在插件中加载,又要将它们贡献到默认的型号列表中,该模型可供运行该插件的任何人使用。我们希望这将使研究人员能够轻松地尝试使用DAW,但也为创作者提供了一系列有趣的模型。
朱奇(Juce)是构建音频插件的行业标准。因此,需要了解C ++才能构建非常简单的音频插件。但是,AI音频研究人员很少能在C ++方面拥有丰富的经验并能够构建这样的插件。此外,这是一项严肃的时间投资,可以花在开发更好的算法。 Neutons可以使用诸如Pytorch之类的熟悉工具建立模型,并以最少的Python代码包装这些模型来构建模型,从而可以由Netoson插件执行。可以在不到一天的时间内完成模型并在DAW中运行,而无需任何C ++代码或知识。
SDK为您的模型以及即时的样本率和立体声速度转换提供了自动缓冲输入和输出的支持。它使一个模型只能以任何采样率和任何缓冲尺寸无缝地在DAW中使用预定义的样品执行。此外,在SDK工具中进行基准测试和分析的工具可以很容易地获得,因此您可以轻松调试并测试模型的性能。
您可以使用pip安装neutone_sdk :
pip install neutone_sdk
NEUTONS插件可在https://neutone.space上找到。我们目前提供VST3和AU插件,可用于加载使用此SDK创建的模型。请访问网站以获取更多信息。
如果您只想在不详细描述所有事情的详细说明中包装模型,我们为您准备了这些示例。
SDK提供了将现有Pytorch模型包装的功能,该模型可以使它们在VST插件中可执行。在其核心上,插件将以一定的样本速率作为输入发送大量音频样品,并期望输出时有相同数量的样本。 SDK的用户可以指定其模型最佳性能的样本率和缓冲区大小。然后,SDK保证该模型的正向通过将在以下(sample_rate,buffer_size)组合中接收音频。有四个旋钮可让插件的用户在运行时以其他参数为模型。可以通过SDK根据需要启用或禁用它们。
使用随附的导出函数,一系列测试会自动运行,以确保模型按预期行事,并准备由插件加载。
基准测试和分析CLI工具可用于进一步调试和测试包装模型。可以在一系列模拟的公共DAW(sample_rate,buffere_size)组合以及配置内存和CPU使用情况下基于模型的速度和延迟。
我们在示例目录中提供了几种模型。我们将浏览最简单的模型之一,即失真模型。
假设我们有以下pytorch模型。参数将在稍后介绍,我们将暂时关注输入和输出。假设此模型接收形状的张量(2, buffer_size)作为一个输入,其中buffer_size是可以指定的参数。
class ClipperModel ( nn . Module ):
def forward ( self , x : Tensor , min_val : float , max_val : float , gain : float ) -> Tensor :
return torch . clip ( x , min = min_val * gain , max = max_val * gain )要在VST中运行此功能,我们可以写的最简单的包装器是将WoveformTowaveFormbase Baseclass子群亚级。
class ClipperModelWrapper ( WaveformToWaveformBase ):
@ torch . jit . export
def is_input_mono ( self ) -> bool :
return False
@ torch . jit . export
def is_output_mono ( self ) -> bool :
return False
@ torch . jit . export
def get_native_sample_rates ( self ) -> List [ int ]:
return [] # Supports all sample rates
@ torch . jit . export
def get_native_buffer_sizes ( self ) -> List [ int ]:
return [] # Supports all buffer sizes
def do_forward_pass ( self , x : Tensor , params : Dict [ str , Tensor ]) -> Tensor :
# ... Parameter unwrap logic
x = self . model . forward ( x , min_val , max_val , gain )
return x大部分工作的方法是do_forward_pass 。在这种情况下,这只是一个简单的传递,但是我们将在以后使用它来处理参数。
默认情况下,VST以stereo-stereo运行,但是对于模型需要单声道,我们可以使用is_input_mono和is_output_mono通知SDK,并自动将输入和输出自动转换。如果is_input_mono被切换为平均(1, buffer_size)形状张量作为输入而不是(2, buffer_size) 。如果已切换is_output_mono ,则do_forward_pass有望返回单声张量(Shape (1, buffer_size) ),然后在VST输出时在两个通道上重复。这是在SDK中完成的,以避免在每次通过期间不必要的内存分配。
get_native_sample_rates和get_native_buffer_sizes可用于指定任何首选的采样率或缓冲尺寸。在大多数情况下,这些预计仅具有一个元素,但是为更复杂的模型提供了额外的灵活性。如果提供多个选项,SDK将尝试为DAW当前设置找到最佳的选项。每当采样率或缓冲区大小与包装器的DAW不同时,将自动触发包装器转换为正确的采样率或实现所需的缓冲区大小或两者兼而有之的FIFO队列。这将遭受少量的绩效罚款,并增加一些延迟。如果模型与任何样本率和/或缓冲尺寸兼容,则可以将这些列表空白。
这意味着保证do_forward_pass方法中的张量x具有形状(1 if is_input_mono else 2, buffer_size)其中将在运行时从get_native_buffer_sizes Method中提供的buffer_size 。张量x还将以get_native_sample_rates方法中提供的列表中的采样率之一。
我们提供了一个save_neutone_model助手辅助功能,可将模型保存到磁盘。默认情况下,这将将模型转换为Torchscript,并通过一系列检查运行,以确保插件可以加载它们。可以使用load your own按钮将最终的model.nm文件加载到插件中。在下面阅读有关如何使用插件向每个人可见的默认集合的模型。
对于可以使用条件信号的型号,我们当前提供四个可配置的旋钮参数。在上面定义的ClipperModelWrapper中,我们可以包括以下内容:
class ClipperModelWrapper ( WaveformToWaveformBase ):
...
def get_neutone_parameters ( self ) -> List [ NeutoneParameter ]:
return [ NeutoneParameter ( name = "min" , description = "min clip threshold" , default_value = 0.5 ),
NeutoneParameter ( name = "max" , description = "max clip threshold" , default_value = 1.0 ),
NeutoneParameter ( name = "gain" , description = "scale clip threshold" , default_value = 1.0 )]
def do_forward_pass ( self , x : Tensor , params : Dict [ str , Tensor ]) -> Tensor :
min_val , max_val , gain = params [ "min" ], params [ "max" ], params [ "gain" ]
x = self . model . forward ( x , min_val , max_val , gain )
return x在正向通过期间, params变量将是以下字典:
{
"min" : torch . Tensor ([ 0.5 ] * buffer_size ),
"max" : torch . Tensor ([ 1.0 ] * buffer_size ),
"gain" : torch . Tensor ([ 1.0 ] * buffer_size )
}字典的键在get_parameters函数中指定。
参数将始终在0到1之间,并且do_forward_pass函数可用于在运行模型的内部正向方法之前进行任何必要的重新验证。
此外,该插件发送的参数以样本级别的粒度出现。默认情况下,我们采用每个缓冲区的平均值并返回单个浮点(作为张量),但是aggregate_param方法可用于覆盖聚合方法。有关保留此颗粒状的示例,请参见完整的快船导出文件。
一些音频模型会延迟一定量的样本的音频。这取决于每个特定模型的体系结构。为了使通过插件对齐的潮湿和干信号,需要报告其模型诱导的延迟样本。 calc_model_delay_samples可用于指定延迟样本的数量。 Rave模型平均具有一个延迟的缓冲区(2048个样本),该缓冲区在calc_model_delay_samples方法中静态传达,可以在示例中看到。用重叠ADD实现的模型将具有等于用于交叉载体的样品数量的延迟,如Demucs模型包装器或光谱滤波器示例所示。
计算模型添加的延迟可能很困难,尤其是因为可能需要组合多种不同的延迟来源(例如,cossfaded延迟,滤镜延迟,lookahead缓冲液延迟和 /或在未对齐的干和湿音频的培训的神经网络) 。值得花一些额外的时间测试您的DAW模型,以确保正确报告延迟。
在模型中添加外观缓冲区可能是有用的,对于需要一定量的其他上下文来输出有用结果的模型。可以通过指示在get_look_behind_samples方法中可以轻松启用lookbehind缓冲区。当此方法返回大于零的数字时, do_forward_pass方法将始终接收一个形状张量(in_n_ch, look_behind_samples + buffer_size) ,但仍必须返回最新样本的形状(out_n_ch, buffer_size)的张量。
我们建议在可能的情况下避免使用外观缓冲区,因为它会使您的模型效率降低,并且在每次远期传球中可能会导致浪费的计算。如果使用纯粹的卷积模型,请尝试将所有卷积切换到缓存的卷积。
当在训练分布中出现的输入外,AI模型通常以意想不到的方式行动。我们在neutone_sdk/filters.py文件中提供一系列常见的过滤器(低音,高通,频段,频段停止)。这些可以在向前传递期间使用,以限制进入模型的输入的域。其中一些可以诱导少量延迟,查看示例/example_clipper_prefilter.py文件,以获取有关如何设置过滤器的简单示例。
该插件包含针对创建者的默认模型列表,这些模型希望在创作过程中使用它们。我们鼓励用户对获得的结果感到满意,以提交他们的模型,以便社区可以使用它们。为了提交,我们需要一些其他元数据,这些元数据将用于显示有关针对创作者和其他研究人员的模型的信息。这将显示在Neutons网站和插件内部。
跳过了先前的快船模型,这是一个基于由Micro-TCN启发的随机TCN超速模型的更现实的示例。
class OverdriveModelWrapper ( WaveformToWaveformBase ):
def get_model_name ( self ) -> str :
return "conv1d-overdrive.random"
def get_model_authors ( self ) -> List [ str ]:
return [ "Nao Tokui" ]
def get_model_short_description ( self ) -> str :
return "Neural distortion/overdrive effect"
def get_model_long_description ( self ) -> str :
return "Neural distortion/overdrive effect through randomly initialized Convolutional Neural Network"
def get_technical_description ( self ) -> str :
return "Random distortion/overdrive effect through randomly initialized Temporal-1D-convolution layers. You'll get different types of distortion by re-initializing the weight or changing the activation function. Based on the idea proposed by Steinmetz et al."
def get_tags ( self ) -> List [ str ]:
return [ "distortion" , "overdrive" ]
def get_model_version ( self ) -> str :
return "1.0.0"
def is_experimental ( self ) -> bool :
return False
def get_technical_links ( self ) -> Dict [ str , str ]:
return {
"Paper" : "https://arxiv.org/abs/2010.04237" ,
"Code" : "https://github.com/csteinmetz1/ronn"
}
def get_citation ( self ) -> str :
return "Steinmetz, C. J., & Reiss, J. D. (2020). Randomized overdrive neural networks. arXiv preprint arXiv:2010.04237."查看Core.py内部方法的文档,以及网站和插件中的随机超速模型,以了解将显示每个字段的位置。
要提交模型,请在GitHub存储库上打开问题。我们目前需要以下内容:
save_neutone_model helper函数输出的model.nm文件SDK提供了三种CLI工具,可用于调试和测试包装模型。
例子:
$ python -m neutone_sdk.benchmark benchmark-speed --model_file model.nm
INFO:__main__:Running benchmark for buffer sizes (128, 256, 512, 1024, 2048) and sample rates (48000,). Outliers will be removed from the calculation of mean and std and displayed separately if existing.
INFO:__main__:Sample rate: 48000 | Buffer size: 128 | duration: 0.014±0.002 | 1/RTF: 5.520 | Outliers: [0.008]
INFO:__main__:Sample rate: 48000 | Buffer size: 256 | duration: 0.028±0.003 | 1/RTF: 5.817 | Outliers: []
INFO:__main__:Sample rate: 48000 | Buffer size: 512 | duration: 0.053±0.003 | 1/RTF: 6.024 | Outliers: []
INFO:__main__:Sample rate: 48000 | Buffer size: 1024 | duration: 0.106±0.000 | 1/RTF: 6.056 | Outliers: []
INFO:__main__:Sample rate: 48000 | Buffer size: 2048 | duration: 0.212±0.000 | 1/RTF: 6.035 | Outliers: [0.213]
运行速度基准将以48000的样本速率自动运行随机输入,缓冲尺寸为(128、256、512、1024、2048),并报告执行一个缓冲区推断所需的平均时间。从中,计算出1/RTF ,它代表模型的速度快。随着这个数字越高,该模型将在DAW中使用较少的资源。对于该数字,该数字必须大于1,才能在基准测试的计算机上实时执行。
测试的采样率和缓冲尺寸以及内部重复基准的次数以计算平均值和用于计算的线程数量,可作为参数可用。运行python -m neutone_sdk.benchmark benchmark-speed --help以获取更多信息。指定自定义样本率或缓冲大小时,每个人都需要分别传递给CLI。例如: --sample_rate 48000 --sample_rate 44100 --buffer_size 32 --buffer_size 64 。
虽然速度基准应该很快,因为通常要说的是实时的,但如果模型太慢,则可能会卡住。确保选择适当数量的采样率和缓冲尺寸进行测试。
例子:
$ python -m neutone_sdk.benchmark benchmark-latency model.nm
INFO:__main__:Native buffer sizes: [2048], Native sample rates: [48000]
INFO:__main__:Model exports/ravemodel/model.nm has the following delays for each sample rate / buffer size combination (lowest delay first):
INFO:__main__:Sample rate: 48000 | Buffer size: 2048 | Total delay: 0 | (Buffering delay: 0 | Model delay: 0)
INFO:__main__:Sample rate: 48000 | Buffer size: 1024 | Total delay: 1024 | (Buffering delay: 1024 | Model delay: 0)
INFO:__main__:Sample rate: 48000 | Buffer size: 512 | Total delay: 1536 | (Buffering delay: 1536 | Model delay: 0)
INFO:__main__:Sample rate: 48000 | Buffer size: 256 | Total delay: 1792 | (Buffering delay: 1792 | Model delay: 0)
INFO:__main__:Sample rate: 44100 | Buffer size: 128 | Total delay: 1920 | (Buffering delay: 1920 | Model delay: 0)
INFO:__main__:Sample rate: 48000 | Buffer size: 128 | Total delay: 1920 | (Buffering delay: 1920 | Model delay: 0)
INFO:__main__:Sample rate: 44100 | Buffer size: 256 | Total delay: 2048 | (Buffering delay: 2048 | Model delay: 0)
INFO:__main__:Sample rate: 44100 | Buffer size: 512 | Total delay: 2048 | (Buffering delay: 2048 | Model delay: 0)
INFO:__main__:Sample rate: 44100 | Buffer size: 1024 | Total delay: 2048 | (Buffering delay: 2048 | Model delay: 0)
INFO:__main__:Sample rate: 44100 | Buffer size: 2048 | Total delay: 2048 | (Buffering delay: 2048 | Model delay: 0)运行速度基准将自动计算sample_rate=(44100, 48000)和buffer_size=(128, 256, 512, 1024, 2048)的模型的延迟。这概述了通用DAW设置将会发生什么。总延迟分为缓冲延迟和模型延迟。该模型延迟由模型包装器中的模型的创建者报告,如上所述。考虑到包装器指定的(sample_rate, buffer_size)的组合(本机(本机))和运行时DAW指定的(sample_rate,buffer_size)的组合将自动计算缓冲延迟。在其本机(sample_rate, buffer_size)组合中运行该模型将产生最小延迟。
与上面的速度基准类似,可以从CLI指定(sample_rate, buffer_size)的测试组合。运行python -m neutone_sdk.benchmark benchmark-latency --help以获取更多信息。
$ python -m neutone_sdk.benchmark profile --model_file exports/ravemodel/model.nm
INFO:__main__:Profiling model exports/ravemodel/model.nm at sample rate 48000 and buffer size 128
STAGE:2023-09-28 14:34:53 96328:4714960 ActivityProfilerController.cpp:311] Completed Stage: Warm Up
30it [00:00, 37.32it/s]
STAGE:2023-09-28 14:34:54 96328:4714960 ActivityProfilerController.cpp:317] Completed Stage: Collection
STAGE:2023-09-28 14:34:54 96328:4714960 ActivityProfilerController.cpp:321] Completed Stage: Post Processing
INFO:__main__:Displaying Total CPU Time
INFO:__main__:-------------------------------- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------
Name Self CPU % Self CPU CPU total % CPU total CPU time avg CPU Mem Self CPU Mem # of Calls
-------------------------------- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------
forward 98.54% 799.982ms 102.06% 828.603ms 26.729ms 0 b -918.17 Kb 31
aten::convolution 0.12% 963.000us 0.95% 7.739ms 175.886us 530.62 Kb -143.50 Kb 44
...
...
Full output removed from GitHub.
分析工具将以48000的样本速率和Pytorch Profiler下的128个缓冲尺寸运行模型,并输出一系列见解,例如总CPU时间,总CPU存储器使用情况(每个功能)和分组的CPU存储器使用情况(通过一组功能调用)。这可以用于识别模型代码中的瓶颈(即使在do_forward_pass调用中的模型调用中,也可以在模型代码中识别瓶颈。
与基准测试类似,可以以样本速率和缓冲尺寸的不同组合以及不同数量的线程进行运行。运行python -m neutone_sdk.benchmark profile --help以获取更多信息。
我们欢迎对SDK的任何贡献。请尽可能添加类型,并使用black格式化器以备可读性。
当前的路线图是:
Audocitorch项目是SDK开发的主要灵感。在这里查看