중성상 SDK는 연구원들이 자신의 오디오 모델을 감싸서 중립형 플러그인을 사용하여 DAW에서 실행할 수있는 도구입니다. 플러그인에 로컬로 모델을로드하고 플러그인을 실행하는 사람이 사용할 수있는 기본 모델 목록에 기여하는 기능을 제공합니다. 우리는 이것이 연구원들이 DAW에서 자신의 모델을 쉽게 시도 할 수있게 해주길 바랍니다. 또한 제작자에게 흥미로운 모델 모음을 제공 할 수 있기를 바랍니다.
Juce는 오디오 플러그인을 구축하기위한 업계 표준입니다. 이 때문에 C ++에 대한 지식은 매우 간단한 오디오 플러그인조차 구축 할 수 있어야합니다. 그러나 AI 오디오 연구원들이 C ++에 대한 광범위한 경험을 가지고 그러한 플러그인을 구축 할 수있는 경우는 드 rare니다. 또한 더 나은 알고리즘을 개발하는 데 소비 할 수있는 것은 심각한 시간입니다. Neutone은 Pytorch와 같은 친숙한 도구를 사용하여 모델을 구축 할 수 있으며 최소한 양의 Python 코드를 사용 하여이 모델을 랩핑하여 중독자 플러그인으로 실행할 수 있습니다. C ++ 코드 나 지식없이 하루도 채되지 않아도 DAW 내에서 모델을 올리거나 실행할 수 있습니다.
SDK는 모델에 대한 입력 및 출력의 자동 버퍼링을 지원하고 비행 금속 샘플 속도 및 스테레오 모노 변환을 제공합니다. 이를 통해 샘플링 속도 및 버퍼 크기로 DAW에서 사용될 미리 정의 된 수의 샘플로만 실행할 수있는 모델이 가능합니다. 또한 벤치마킹 및 프로파일 링을위한 SDK 도구 내에서 쉽게 사용할 수 있으므로 모델의 성능을 쉽게 디버깅하고 테스트 할 수 있습니다.
PIP를 사용하여 neutone_sdk 설치할 수 있습니다.
pip install neutone_sdk
중성자 플러그인은 https://neutone.space에서 제공됩니다. 현재이 SDK로 생성 된 모델을로드하는 데 사용할 수있는 VST3 및 AU 플러그인을 제공합니다. 자세한 내용은 웹 사이트를 방문하십시오.
모든 것이 무엇인지에 대한 자세한 설명을 거치지 않고 모델을 마무리하고 싶다면이 예제를 준비했습니다.
SDK는 기존 Pytorch 모델을 VST 플러그인 내에서 실행 가능하게 할 수있는 방식으로 기능을 제공합니다. 핵심으로 플러그인은 특정 샘플 속도로 오디오 샘플 청크를 입력으로 보내고 출력에서 동일한 양의 샘플을 기대합니다. SDK 사용자는 모델이 최적으로 수행하는 샘플 속도와 버퍼 크기를 지정할 수 있습니다. 그런 다음 SDK는 모델의 순방향 통과가 이러한 (Sample_Rate, Buffer_Size) 조합 중 하나에서 오디오를 수신 할 것을 보장합니다. 플러그인 사용자가 런타임에 모델에 추가 매개 변수를 공급할 수있는 4 개의 손잡이를 사용할 수 있습니다. SDK를 통해 필요에 따라 활성화되거나 비활성화 될 수 있습니다.
포함 된 내보내기 기능을 사용하여 모델이 예상대로 작동하고 플러그인에 의해로드 될 준비가되도록 일련의 테스트가 자동으로 진행됩니다.
CLI 도구 벤치마킹 및 프로파일 링은 래핑 된 모델의 추가 디버깅 및 테스트를 위해 사용할 수 있습니다. 시뮬레이션 된 Common DAW (Sample_Rate, Buffere_Size) 조합 범위에서 모델의 속도와 대기 시간을 벤치마킹하고 메모리 및 CPU 사용을 프로파일 링 할 수 있습니다.
예제 디렉토리에 여러 모델을 제공합니다. 우리는 가장 간단한 모델 중 하나 인 왜곡 모델을 살펴볼 것입니다.
다음과 같은 Pytorch 모델이 있다고 가정하십시오. 매개 변수는 나중에 다루어지며 현재 입력 및 출력에 중점을 둘 것입니다. 이 모델은 buffer_size 지정할 수있는 매개 변수 인 입력으로 모양 (2, 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 내부에서 이것을 실행하려면 우리가 쓸 수있는 가장 간단한 래퍼는 WaveFormTowaveFormbase 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 로 실행되지만 모델에 Mono가 원하는 경우 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 중 하나와 다를 때마다 래퍼 A 래퍼가 자동으로 트리거되거나 요청 된 버퍼 크기 또는 둘 다에 대한 FIFO 대기열을 구현하는 래퍼가 트리거됩니다. 이것은 작은 성과 페널티가 발생하고 약간의 지연이 추가됩니다. 모델이 샘플 속도 및/또는 버퍼 크기와 호환되는 경우이 목록은 비어있을 수 있습니다.
이것은 do_forward_pass 메소드의 텐서 x 모양을 보장한다는 것을 의미합니다 (1 if is_input_mono else 2, buffer_size) 여기서 buffer_size get_native_buffer_sizes 방법에 제공된 목록에서 런타임에서 선택됩니다. 텐서 x 또한 get_native_sample_rates 메소드에 제공된 목록에서 샘플링 속도 중 하나입니다.
모델을 디스크에 저장하는 save_neutone_model 도우미 기능을 제공합니다. 기본적으로 이것은 모델을 TorchScript로 변환하여 일련의 검사를 통해 실행하여 플러그인으로로드 할 수 있습니다. 결과 model.nm 파일은 load your own 사용하여 플러그인 내에로드 할 수 있습니다. 플러그인을 사용하는 모든 사람이 볼 수있는 기본 컬렉션에 모델을 제출하는 방법은 아래를 읽으십시오.
컨디셔닝 신호를 사용할 수있는 모델의 경우 현재 4 개의 구성 가능한 노브 매개 변수를 제공합니다. 위에서 정의 된 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 방법을 사용하여 집계 방법을 무시할 수 있습니다. 이 세분성을 보존하는 예는 전체 Clipper Export 파일을 참조하십시오.
일부 오디오 모델은 일정량의 샘플에 대한 오디오를 지연시킵니다. 이것은 각 특정 모델의 아키텍처에 따라 다릅니다. 플러그인을 통과하는 습식 및 건식 신호가 정렬되기 위해서는 사용자가 모델이 유도하는 지연 샘플 수를보고해야합니다. calc_model_delay_samples 사용하여 지연 샘플의 수를 지정할 수 있습니다. Rave 모델에는 평균적으로 Rave 모델에는 calc_model_delay_samples 메소드에서 정적으로 통신하고 예제에서 볼 수있는 지연 (2048 샘플)의 하나의 버퍼가 있습니다. 오버랩 add와 함께 구현 된 모델은 DEMUCS 모델 래퍼 또는 스펙트럼 필터 예제에서 볼 수 있듯이 크로스 페이딩에 사용되는 샘플 수와 동일한 지연을 갖습니다.
지연 지연 계산 모델 추가는 어려울 수 있습니다. 특히 여러 다른 지연 소스가 결합되어야하는 여러 가지 지연 소스가있을 수 있기 때문에 (예 : Cossfading 지연, 필터 지연, 룩킹 버퍼 지연 및 / 또는 정렬되지 않은 건식 및 습식 오디오로 훈련 된 신경망). . 지연이 올바르게보고되도록 DAW의 모델을 테스트하는 데 약간의 시간을 보내는 것이 좋습니다.
모델에 LookBehind 버퍼를 추가하면 유용한 결과를 출력하기 위해 일정량의 추가 컨텍스트가 필요한 모델에 유용 할 수 있습니다. get_look_behind_samples 메소드에 필요한 룩 앤드 샘플 수를 표시하여 LookBehind 버퍼를 쉽게 활성화 할 수 있습니다. 이 메소드가 0보다 큰 숫자를 반환하면 do_forward_pass 메소드는 항상 모양의 텐서 (in_n_ch, look_behind_samples + buffer_size) 를받지 만 최신 샘플의 텐서 (out_n_ch, buffer_size) 를 반환해야합니다.
모델이 모델이 덜 효율적으로 만들고 각 순방향 패스 중에 계산을 낭비 할 수 있으므로 가능한 경우 룩 하인드 버퍼 사용을 피하는 것이 좋습니다. 순전히 컨볼 루션 모델을 사용하는 경우 대신 모든 컨볼 루션을 캐시 된 컨볼 루션으로 전환하십시오.
AI 모델이 훈련 분포에 존재하는 입력 외부에 입력 할 때 예기치 않은 방식으로 작용하는 것이 일반적입니다. 우리는 letomone_sdk/filters.py 파일에 일련의 공통 필터 (낮은베이스, 하이 패스, 밴드 패스, 밴드 스톱)를 제공합니다. 이들은 전방 패스 중에 모델로 들어가는 입력의 도메인을 제한하기 위해 사용될 수 있습니다. 그들 중 일부는 소량의 지연을 유도 할 수 있습니다. 필터를 설정하는 방법에 대한 간단한 예제는 예제/examples/examples/examples/examples/examples _clipper_prefilter.py 파일을 확인할 수 있습니다.
플러그인에는 창의적인 프로세스 중에 사용하려는 제작자를 대상으로 한 기본 모델 목록이 포함되어 있습니다. 우리는 사용자가 얻은 결과에 만족하면 커뮤니티가 많이 사용할 수 있도록 모델을 제출하도록 권장합니다. 제출을 위해서는 제작자와 다른 연구원 모두를 대상으로 한 모델에 대한 정보를 표시하는 데 사용될 추가 메타 데이터가 필요합니다. 이것은 중립 웹 사이트와 플러그인 내부에 표시됩니다.
이전 Clipper 모델을 건너 뛰면 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 저장소에서 문제를여십시오. 현재 다음이 필요합니다.
model.nm 파일에 대한 링크 save_neutone_model helper function 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 실행하십시오. 자세한 내용은 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 설정에서 일어날 일에 대한 일반적인 개요를 제공합니다. 총 지연은 버퍼링 지연 및 모델 지연으로 분할됩니다. 모델 지연은 위에서 설명한대로 모델 래퍼의 모델 제작자에 의해보고됩니다. 버퍼링 지연은 SDK에 의해 자동으로 계산됩니다. 래퍼 (기본 제품)와 런타임에 DAW에 의해 지정된 래퍼 (Native Ones)가 지정한 (sample_rate, buffer_size) 의 조합을 고려합니다. 모델을 네이티브 (sample_rate, buffer_size) 조합에서 실행하면 최소 지연이 발생합니다.
위의 속도 벤치 마크와 유사하게 (sample_rate, buffer_size) 의 테스트 된 조합을 CLI에서 지정할 수 있습니다. python -m neutone_sdk.benchmark benchmark-latency --help 실행하십시오. 자세한 내용은 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.
프로파일 링 도구는 Pytorch 프로파일러에서 48000의 샘플 속도와 버퍼 크기 128로 모델을 실행하고 총 CPU 시간, 총 CPU 메모리 사용 (기능 당) 및 그룹화 된 CPU 메모리 사용과 같은 일련의 통찰력을 출력합니다. (기능 호출 그룹 별). 이것은 모델 코드에서 병목 현상을 식별하는 데 사용될 수 있습니다 ( do_forward_pass 통화 내 모델 호출 내에서도).
벤치마킹과 마찬가지로, 샘플 속도와 버퍼 크기의 다른 조합뿐만 아니라 다른 수의 스레드로도 실행될 수 있습니다. python -m neutone_sdk.benchmark profile --help 실행하십시오. 자세한 내용은 help.
우리는 SDK에 대한 기여를 환영합니다. 가능한 한 유형을 추가하고 가독성을 위해 black 형성체를 사용하십시오.
현재 로드맵은 다음과 같습니다.
Audacitorch 프로젝트는 SDK 개발에 큰 영감을주었습니다. 여기에서 확인하십시오