API로 Audio Effects 기능 실행하기
지금까지 다룬 샘플 애플리케이션들은 사용이 간편한 Audio Effects SDK API로 해당 효과를 실행합니다. Audio Effects SDK API는 상당한 성능상 이점을 제공하며 저수준 API의 배칭(batching)을 제어합니다. Maxine에서 오디오 효과를 생성, 실행하는 방법은 간단한 3단계 프로세스로 구성됩니다(Figure 1 참조).
효과 생성하기
잡음 제거나 룸 에코 제거 효과를 생성하려면 필수 파라미터를 다루는 NvAFX_CreateEffect 함수를 호출합니다. 이 함수는 원하는 효과를 생성한 뒤 상태 코드를 반환합니다. 계속 진행하기에 앞서 이 상태 코드를 활용해 오류 여부를 확인하세요.
// Create and handle
NvAFX_Handle handle;
// Call CreateEffect function and pass any one of the desired effects:
// NVAFX_EFFECT_DENOISER, NVAFX_EFFECT_DEREVERB,
// NVAFX_EFFECT_DEREVERB_DENOISER
NvAFX_Status err = NvAFX_CreateEffect(NVAFX_EFFECT_DENOISER, &handle);
제공 모델 각각은 NvAFX_SetU32 호출을 통해 구체적으로 지정이 가능한 오디오 샘플률을 지원합니다. 샘플률의 값은 무부호의 32비트 정수값(48000/16000)이어야 합니다. 또한 이때 사용된 GPU 플랫폼의 적절한 모델 경로는 다음과 같이 NvAFX_SetString
API 호출을 써서 전달해야 합니다.
// Pass parameter selector NVAFX_PARAM_SAMPLE_RATE and unsigned int
// Pass parameter selector NVAFX_PARAM_MODEL_PATH and character string
NvAFX_Status err;
err = NvAFX_SetU32(handle, NVAFX_PARAM_SAMPLE_RATE, sample_rate);
err = NvAFX_SetString(handle, NVAFX_PARAM_MODEL_PATH, model_file.c_str());
각 효과별로 인풋/아웃풋 오디오 채널의 수와 프레임당 샘플수가 사전에 설정되므로 이 파라미터들을 효과 함수에 전달해야 합니다. 지원되는 값의 목록을 가져오려면 NvAFX_GetU32 함수를 호출하세요. 사전 설정된 값의 목록이 반환됩니다.
// Pass the selector string to get specific information like:
// NVAFX_PARAM_NUM_SAMPLES_PER_FRAME,
// NVAFX_PARAM_NUM_CHANNELS,
unsigned num_samples_per_frame, num_channels;
NvAFX_Status err;
err = NvAFX_GetU32(handle, NVAFX_PARAM_NUM_SAMPLES_PER_FRAME,
&num_samples_per_frame);
err = NvAFX_GetU32(handle, NVAFX_PARAM_NUM_CHANNELS, &num_channels);
해당 효과를 GPU에서 실행하려면 NvAFX_GetSupportedDevices 함수를 사용해 지원 장치의 목록을 가져와야 합니다. 이 함수는 지원되는 GPU의 수를 불러오기 합니다.
// The function fills the array with the CUDA device indices of devices
// that are supported by the model, in descending order of preference,
// where the first device is the most preferred device.
int numSupportedDevices = 0;
NvAFX_GetSupportedDevices(handle, &numSupportedDevices, nullptr);
std::vector<int> ret(num);
NvAFX_GetSupportedDevices(handle, &numSupportedDevices, ret.data());
이제 정확한 GPU 장치 번호를 다음과 같이 전달하여 GPU 장치가 사용될 수 있게 설정합니다.
NvAFX_SetU32(handle, NVAFX_PARAM_USE_DEFAULT_GPU, use_default_gpu_)
오디오 효과의 로딩
효과가 생성되면 이 모델을 NvAFX_Load 함수로 로드해야 합니다. 효과의 로딩 시에는 모델의 선택과 로딩, 해당 효과를 위해 설정된 파라미터의 검증이 진행됩니다. 이 함수는 모델을 GPU 메모리에 로드하고 추론을 위해 준비시킵니다. 오디오 효과를 로드하려면 NvAFX_Load 함수를 호출하고 생성된 효과 핸들(handle)을 지정하세요.
NvAFX_Status err = NvAFX_Load(handle);
오디오 효과의 실행
로드를 마친 오디오 효과를 실행해 인풋 데이터에 원하는 효과를 적용합니다. 효과를 실행하면 인풋 메모리 버퍼 콘텐츠의 읽기가 진행되면서 해당 오디오 효과가 적용되고, 아웃풋이 아웃풋 메모리 버퍼에 기록됩니다. 로드된 오디오 효과를 인풋 버퍼에서 실행하려면 NvAFX_Run 함수를 호출하세요.
// Pass the effect handle, input, and output memory buffer, and the parameters of the effect
NvAFX_Status err = NvAFX_Run(handle, input, output, num_samples,num_channels);
오디오 효과가 인풋 메모리 버퍼에 적용되었고 이제 더는 필요하지 않다면 NvAFX_DestroyEffect(handle) 함수 호출로 효과 핸들을 전달해 리소스를 정리합니다.
NvAFX_Status err = NvAFX_DestroyEffect(handle);
결론
지금까지 Maxine Audio Effects의 세부 기능과 함께 샘플 애플리케이션을 적절한 파라미터로 실행하는 방법, 사용이 간편한 고성능 API를 살펴보았습니다. 이제 이 놀라운 AI 오디오 기능을 윈도우와 리눅스에서 Maxine 컨테이너 또는 베어메탈 방식을 사용해 여러분의 애플리케이션에 통합할 수 있습니다.
보다 자세한 정보는 Maxine Getting Started 페이지를 참고하세요. 의견이나 질문이 있을 경우 여기를 방문하세요.