오디오와 비디오 스트리밍, 화상 회의, 원거리 통신이 증가함에 따라 뛰어난 오디오 품질을 자랑하는 애플리케이션을 구축하고, 사용자 간의 효과적인 소통과 협업을 지원하는 일은 이제 개발자들의 필수 과제가 됐습니다. 차량과 공사장의 소음부터 개 짖는 소리와 아기의 울음소리에 이르기까지, 다양한 배경 잡음은 원활한 소통을 방해합니다. 또한 발화의 장소가 소리의 울림, 즉 에코(echo)가 증폭되는 대형 공간인 경우도 있죠.
NVIDIA Maxine은 사용이 간편한 Audio Effects SDK와 AI 신경망 오디오 품질 향상 알고리즘을 제공해 가상 협업과 콘텐츠 제작 애플리케이션의 열악한 음질 문제를 해결합니다. Audio Effects SDK를 통해 룸 에코(room echo) 등 거의 모든 유형의 잡음을 제거하는 한편, 매끄러운 소통과 생산적인 회의를 지원하는 애플리케이션을 구축할 수 있습니다.
이번 포스팅에서는 리눅스(Linux)의 컨테이너나 윈도우(Windows) 플랫폼의 SDK를 사용해 고음질의 애플리케이션을 구축하는 방법을 소개합니다. 모든 시연은 사전 구축된 샘플 애플리케이션으로 진행됩니다.
배경 잡음이나 룸 에코가 없는 애플리케이션 구축하기
Maxine Audio Effects SDK는 협대역, 광대역, 초광대역 오디오용 잡음 제거와 룸 에코 제거 기능을 사용자의 애플리케이션에 통합하게 해줍니다.
Video 1. Maxine Audio Effects SDK의 노이즈 제거(Noise Removal)와 룸 에코 제거(Room Echo Cancellation) 효과 데모
노이즈 제거 효과
재택 근무가 날로 증가하는 상황에서 사용자의 통화 배경에는 컴퓨터 자판이나 에어컨 압축기 소리 등 잠재적인 소음원이 다수 존재합니다. 주변에서 큰 소리로 문을 닫거나 가구를 옮기거나 진공청소기를 사용해서 집중력을 방해하는 경우도 무시할 수 없죠.
노이즈 제거(Noise Removal) 효과는 오디오 스트림에서 여러 잡음 프로파일(noise profile)을 제거하면서 화자의 목소리에 담긴 정서적 측면은 그대로 보존합니다. 예를 들어 새로운 아이디어에 흥분한 사용자가 격앙된 톤으로 발화하는 동안 배경에서 에어컨이 가동되고 있다면 노이즈 제거 기능은 화자의 목소리만 남겨둡니다.
룸 에코 제거 효과
밀폐된 실내에서 발화 시에는 사방의 모든 표면에서 소리가 반사되는데요. 음성의 흡수나 약화, 반사가 다중 횟수로 반복을 계속하는 정도는 반사면의 크기와 기하학적 구조, 재질에 좌우됩니다. 이처럼 지속적인 음파 반사는 시간의 경과와 함께 축적되어 반향(reverberation)을 야기합니다.
에코는 콘크리트나 돌 소재의 벽 등 반사면이 많은 대규모 실내에서 보다 두드러집니다. 일례로 천장이 높은 성당 내부의 음성 반향을 생각해볼 수 있겠죠. 이렇듯 ‘반향되는’ 음성에는 선형 예측 코딩(linear predictive coding)이나 코드 여기 선형 예측(code-excited linear prediction)처럼 널리 사용되는 음성 인코딩 기법이 적합하지 않습니다. 반향되는 음성의 인코딩은 자칫 심각한 왜곡으로 이어져 극단적인 경우에는 음성을 알아들을 수 없게 되기도 합니다.
따라서 음성 녹음본을 전송하기 전에 반향을 제거하는 작업이 필수적입니다. 인코딩 전에 에코 제거가 불가능한 상황이라면 디코딩된 음성을 스피커로 내보내기에 앞서 에코를 최대한 제거해야 합니다. 룸 에코 제거(Room Echo Cancellation) 효과는 반향이 있는 환경에서 발화되는 음성의 불필요한 에코를 제거합니다. 이 기능은 또한 광대역과 초광대역 신호를 지원합니다.
잡음 제거와 룸 에코 제거 기능을 결합하면 엔드-투-엔드 오디오 품질을 양방향으로 개선할 수 있습니다.
윈도우나 리눅스를 위한 Maxine Audio Effects SDK 확보하기
컨테이너와 쿠버네티스(Kubernetes)의 혼용은 강력하고 확장도 간편한 배포 전략이 되어줍니다. NVIDIA는 윈도우와 리눅스 플랫폼용 Maxine Audio Effects SDK와 함께 사전 패키지형 컨테이너를 지원하는데요. 컨테이너를 사용하면 신속한 배포와 유지관리 시간의 단축을 통해 시간과 비용을 절감하고 높은 확장성을 누릴 수 있습니다. 또한 사전 패키지형 컨테이너의 특성상 컨테이너 내의 구체적 설치 작업에 대해 걱정할 필요가 없습니다.
본 포스팅은 Audio Effects SDK 컨테이너의 사용법을 집중적으로 다룹니다. 설치를 계속하기 전에 여러분의 하드웨어가 요구 사항 일체를 충족하는지 확인하세요.
NVIDIA TensorRT와 cuDNN의 사용 경험이 상당하고 베어메탈(bare-metal) 방식의 리눅스 시스템에 Audio Effects SDK를 배포하기 원한다면, Maxine Getting Started 페이지에서 여러분의 플랫폼에 맞는 SDK를 다운로드하세요.
Audio Effects SDK 도커 컨테이너
고성능 Audio Effects SDK와 컨테이너의 최신 AI 모델을 설치하고 활용하려면 4단계의 작업을 거칩니다.
- NVIDIA Drivers 다운로드
- 도커(Docker)와 nvidia-docker를 다운로드해 GPU를 컨테이너에 노출
- NGC API Key로 NGC Registry에 로그인
- Audio Effects SDK 컨테이너 가져오기
이때 NVIDIA Turing이나 NVIDIA Volta, 또는 NVIDIA Ampere Architecture 세대 데이터센터 GPU(T4, V100, A100, A10, A30)에 액세스가 필요합니다.
윈도우에 Audio Effects SDK 설치하기
윈도우에 Audio Effects SDK를 설치하는 프로세스는 간단합니다:
- 윈도우용 NVIDIA Graphics Driver 다운로드
- 마이크로소프트 비주얼 스튜디오 2017(Microsoft Visual Studio 2017) 이상 버전 다운로드(빌드 툴 설치 확인 필요)
- Maxine Getting Started 페이지에서 최신 Audio Effects SDK 패키지 다운로드
윈도우에 배포한 Audio Effects SDK의 높은 처리량과 짧은 지연시간을 누리려면 NVIDIA RTX 그래픽 카드가 필요합니다. A100 등의 데이터센터 GPU에서 Audio Effects SDK를 실행하려면 리눅스 패키지를 사용하세요.
Audio Effects SDK와 사전 구축된 샘플 애플리케이션 사용하기
Audio Effects SDK에는 사용법의 시연을 위해 사전에 구축된 샘플 애플리케이션인 effects_demo와 effects_delayed_streams_demo가 함께 제공됩니다. 사용자 고유의 샘플 애플리케이션을 구축해 활용하는 것도 가능합니다. 본 포스팅은 effects_demo 샘플 애플리케이션의 실행을 집중적으로 다룹니다.
실시간 Audio Effects 시연
effects_demo 애플리케이션은 Audio Effects SDK를 사용해 각종 효과를 오디오에 적용하는 방법을 보여줍니다. 이 애플리케이션은 또한 소음 제거(Noise Removal)나 룸 에코 제거(Room Echo Cancellation), 또는 둘 모두를 결합한 효과를 인풋 오디오 파일에 적용하고 해당 아웃풋을 파일에 쓰기(write) 하는 경우에도 활용될 수 있습니다.
이 애플리케이션을 실행하려면 samples/effects_demo 디렉터리로 이동한 뒤 다음의 스크립트 중 하나를 사용하세요.
$ ./run_effect.sh -a turing -s 16 -b 1 -e denoiser
$ ./run_effect.sh -a turing -s 48 -b 1 -e dereverb
$ ./run_effect.sh -a turing -s 16 -b 400 -e denoiser
$ ./run_effect.sh -a turing -s 48 -b 400 -e dereverb_denoiser
run_effect.sh 배시(bash) 스크립트는 다음의 인수(argument)를 허용합니다.
- -a: 아키텍처는 사용자의 GPU에 따라 NVIDIA Turing 또는 NVIDIA Volta, A100, A10이 될 수 있습니다.
- -s: 샘플률(sample rate)은 48KHz/16KHz를 사용합니다.
- -b: 배치 사이즈(Batch size)
- -e: 실행할 효과:
- denoiser (잡음 제거)
- dereverb (룸 에코 제거)
- dereverb_denoiser (두 효과 결합)
다음처럼 구성 파일을 전달하여 effects_demo 바이너리를 실행할 수도 있습니다.
# For running denoiser on NVIDIA Turing GPU with 48kHz input and batch size 1
$ ./effects_demo -c turing_denoise48k_1_cfg.txt
이 구성 파일에는 다음의 파라미터가 포함되어야 합니다.
- effect <denoiser/dereverb/dereverb_denoiser>
- sample_rate <48000/16000>
- model <*.trtpkg>: 모델들은 컨테이너 내 /usr/local/AudioFX/models 디렉터리에서 찾을 수 있습니다.
- real_time <0/1>: 물리적 장치나 스트림의 오디오 수신을 시뮬레이션합니다.
- intensity_ratio <0.0-1.0> : 잡음 제거 강도의 비율을 지정합니다.
- input_wav_list
- output_wav_list
effects_demo 샘플 애플리케이션을 실행한 뒤 잡음이 제거된 아웃풋 파일은 실행 파일이 배치된 디렉터리에서 찾을 수 있습니다.
지연이 발생한 스트림의 Audio Effects SDK 시연
effects_delayed_streams_demo 애플리케이션은 지연이 발생한 스트림(stream)의 처리 방법을 보여줍니다. 사용자의 오디오가 서버에 실시간으로 도달하지 않을 가능성이 있는 통신 상황에서는 잡음 제거 효과를 지연해 적용할 것을 권장합니다. 본 샘플 애플리케이션에서 각 인풋 스트림은 다음의 카테고리로 구분됩니다.
- one_step_delay_streams: 이 스트림은 1프레임이 지연됩니다. 가령 프레임 크기가 5ms인 경우 이 스트림의 지연은 5ms입니다.
- two_step_delay_streams: 이 스트림은 2프레임이 지연됩니다. 가령 프레임 크기가 5ms인 경우 이 스트림의 지연은 10ms입니다.
- always_active_streams: 이 스트림은 지연이 없고 늘 활성화됩니다.
이 애플리케이션을 실행하려면 samples/effects_delayed_streams_demo 디렉터리로 이동한 뒤 다음처럼 바이너리를 실행합니다.
$ ./effects_delayed_streams_demo -c config-file
여기서 -c config-file은 turing_denoise48k_10_cfg.txt와 같은 구성 파일의 경로입니다. 구성 파일은 다음의 파라미터를 허용합니다.
- effect <denoiser/dereverb/dereverb_denoiser>
- frame_size: 오디오 효과를 위해 각 프레임의 오디오 스트림 1개당 샘플수를 지정하는 무부호 정수입니다.
- sample_rate <48000/16000>
- model <*.trtpkg>: 모델들은 컨테이너 내 /usr/local/AudioFX/models 디렉터리에서 찾을 수 있습니다.
- one_step_delay_streams: one_step_delay_streams 카테고리에 속하는 스트림 식별자를 지정합니다.
- two_step_delay_streams: two_step_delay_streams 카테고리에 속하는 스트림 식별자를 지정합니다.
- input_wav_list
- output_wav_list
effects_delayed_streams_demo 샘플 애플리케이션을 실행한 뒤 잡음이 제거된 아웃풋 파일은 실행 파일이 배치된 디렉터리에서 찾을 수 있습니다.
다음 블로그에서는 API Audio Effects 기능을 실행하는 방법에 대해 알려드립니다!