다중 트랙 오디오 노이즈 제거의 과제와 FRCRN
원격으로 녹음된 팟캐스트의 경우, 각 화자의 녹음 환경이 상이하여 배경 소음의 편차가 심하게 발생합니다. 특정 트랙에는 에어컨 소음이, 다른 트랙에는 키보드 타이핑 소리가 섞여 있는 식입니다. 기존의 수동 노이즈 제거 방식은 트랙별로 개별 작업이 필요해 시간이 오래 걸릴 뿐만 아니라, 결과물의 음질 일관성을 보장하기 어렵습니다.
알리바바 다모아카데미에서 오픈소스로 공개한 FRCRN(Frequency-Recurrent Convolutional Recurrent Network) 모델은 단일 채널 오디오의 복잡한 배경 소음을 효과적으로 제거하면서도 음성의 자연스러움을 유지하는 딥러닝 기반 솔루션을 제공합니다.
주요 기술적 이점
- 다양한 소음 타겟팅: 공조기 소음, 타이핑 소리, 환경 백색소음 등 복잡한 노이즈 패턴 처리
- 음성 아티팩트 최소화: 과도한 노이즈 제거로 인한 로봇 음성(Robot voice) 현상 방지
- 파이프라인 자동화: 다중 트랙 일괄 처리를 통한 작업 효율성 및 음질 균일성 확보
시스템 요구사항 및 의존성 설치
본 파이프라인은 ModelScope 생태계를 기반으로 구축됩니다. 다음 구성 요소가 사전에 설치되어 있어야 합니다.
# 핵심 라이브러리
Python 3.8 이상
PyTorch 1.10 이상
ModelScope (최신 버전)
FFmpeg (오디오 포맷 변환용)
# 신호 처리 및 I/O 라이브러리
librosa
soundfile
numpy
모델 가중치는 스크립트 최초 실행 시 자동으로 다운로드되며, 이후에는 로컬 캐시를 활용하므로 오프라인 환경에서도 추론이 가능합니다.
오디오 전처리 및 표준화 파이프라인
서로 다른 포맷과 샘플링 레이트를 가진 원본 오디오를 FRCRN 모델의 입력 사양(16kHz, 모노, PCM)에 맞게 정규화하는 과정이 선행되어야 합니다.
import soundfile as sf
import librosa
from pathlib import Path
def standardize_audio_format(src_path: str, dest_path: str, target_sr: int = 16000):
"""
오디오 파일을 16kHz 모노 WAV 포맷으로 표준화합니다.
"""
# 오디오 로드 및 리샘플링
audio_data, _ = librosa.load(src_path, sr=target_sr, mono=True)
# 16-bit PCM으로 저장
sf.write(dest_path, audio_data, target_sr, subtype='PCM_16')
input_dir = Path("raw_podcast_tracks")
output_dir = Path("standardized_tracks")
output_dir.mkdir(parents=True, exist_ok=True)
# 디렉토리 내 모든 오디오 파일 일괄 변환
for audio_file in input_dir.glob("*.*"):
if audio_file.suffix.lower() in {".mp3", ".m4a", ".wav"}:
target_file = output_dir / f"{audio_file.stem}_std.wav"
standardize_audio_format(str(audio_file), str(target_file))
print(f"표준화 완료: {audio_file.name}")
FRCRN 기반 일괄 노이즈 제거 프로세스
표준화된 오디오 파일을 대상으로 ModelScope의 파이프라인을 호출하여 노이즈를 제거합니다.
from pathlib import Path
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
def apply_frcrn_denoising(source_dir: str, target_dir: str):
"""
지정된 디렉토리의 모든 WAV 파일에 FRCRN 노이즈 제거를 적용합니다.
"""
src_path = Path(source_dir)
tgt_path = Path(target_dir)
tgt_path.mkdir(parents=True, exist_ok=True)
# FRCRN 추론 파이프라인 초기화
denoiser = pipeline(
task=Tasks.acoustic_noise_suppression,
model='damo/speech_frcrn_ans_cirm_16k'
)
for track in src_path.glob("*.wav"):
print(f"노이즈 제거 중: {track.name}...")
# 모델 추론 실행
cleaned_audio = denoiser(str(track))
# 결과물 저장
output_file = tgt_path / f"denoised_{track.name}"
with open(output_file, 'wb') as f_out:
f_out.write(cleaned_audio['output_pcm'])
apply_frcrn_denoising("standardized_tracks", "final_clean_tracks")
실전 시나리오별 노이즈 제거 특성
FRCRN 모델은 주파수 영역에서의 순환 신경망 구조를 통해 다양한 유형의 노이즈에 대해 강건한 성능을 보입니다.
- 정상 상태 소음 (Steady-state Noise): 에어컨이나 공기청정기에서 발생하는 지속적인 저주파 험(Hum) 노이즈를 효과적으로 억제하여 음성의 명료도를 회복시킵니다.
- 과도 상태 소음 (Transient Noise): 키보드 타이핑이나 마우스 클릭 소리와 같이 불규칙하게 발생하는 고주파 충격음을 음성 성분과 분리하여 자연스럽게 제거합니다.
- 실내 반향 (Room Reverberation): 작은 방에서 녹음 시 발생하는 초기 반사음을 감소시켜, 드라이(Dry)한 스튜디오 음질에 가깝게 보정합니다.
고급 설정 및 품질 검증 자동화
GPU 자원을 활용하여 추론 속도를 높이고, 처리된 오디오의 품질을 자동으로 검증하는 로직을 추가할 수 있습니다.
import torch
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
def initialize_advanced_pipeline():
"""GPU 가속 및 특정 모델 버전을 지정하여 파이프라인을 초기화합니다."""
device_id = 'cuda:0' if torch.cuda.is_available() else 'cpu'
return pipeline(
task=Tasks.acoustic_noise_suppression,
model='damo/speech_frcrn_ans_cirm_16k',
model_revision='v1.0.1',
device=device_id
)
def evaluate_audio_quality(file_path: str) -> dict:
"""
노이즈 제거 후 오디오의 SNR(신호대잡음비)을 계산하여 품질을 검증합니다.
(실제 환경에서는 pesq나 pystoi 같은 라이브러리를 활용하여 객관적 지표를 계산합니다.)
"""
snr_value = compute_snr(file_path)
metadata = extract_audio_metadata(file_path)
return {
"file": file_path,
"snr_db": snr_value,
"sample_rate": metadata["sr"],
"is_approved": snr_value >= 20.0
}
트러블슈팅 가이드
1. 음성 왜곡 및 아티팩트 발생
증상: 노이즈 제거 후 음성이 뭉개지거나 금속성 소리가 섞임.
해결책: 입력 오디오의 샘플링 레이트가 정확히 16kHz인지 확인하십시오. 또한, 원본 오디오의 게인(Gain)이 과도하게 높아 클리핑(Clipping)이 발생하지 않았는지 점검하고, 필요시 -3dB 정도 헤드룸을 확보한 뒤 재처리합니다.
2. 대규모 파일 처리 시 메모리 부족 (OOM)
증상: 1시간 이상의 긴 팟캐스트 원본 처리 시 CUDA Out of Memory 오류 발생.
해결책: 긴 오디오를 30초~1분 단위의 청크(Chunk)로 분할하여 추론한 후, 크로스페이드(Crossfade)를 적용하여 다시 결합하는 스트리밍 방식의 전처리를 구현해야 합니다.
3. 지원되지 않는 오디오 코덱 오류
증상: 특정 M4A 또는 MP3 파일 읽기 실패.
해결책: FFmpeg 백엔드가 시스템 환경 변수에 올바르게 등록되어 있는지 확인하고, 손상된 파일 헤더를 가진 오디오는 사전에 FFmpeg CLI를 통해 재인코딩하는 방어 코드를 추가합니다.