Musical Mel Transform: Musical AI를 위한 PyTorch 기반의 새로운 멜 스케일 변환기(mel-frequency transform)

Musical Mel Transform 소개

최근 오디오 AI 분야에서는 기존의 FFT(Fast-Fourier Transform)나 멜 스케일 변환만으로는 음악적 의미를 충분히 반영하기 어렵다는 한계가 꾸준히 제기되고 있습니다. 일반적인 멜 변환은 사람의 청각적 지각에 맞춘 로그 스케일을 제공하지만, 실제 음악의 음계와는 정밀하게 일치하지 않아 음높이 중심의 태스크에는 부족한 경우가 많습니다.

Musical Mel Transform은 PyTorch 기반으로 작성된 오디오 신호 처리용 변환기로, 기존의 멜 스펙트럼 변환과 달리 음악적인 음계를 직접 반영할 수 있도록 설계되었습니다. 이 프로젝트는 ONNX 호환성을 고려하여 만들어졌으며, 특히 오디오 AI 모델에서 음정 단위(반음, 4분음 등)를 정확하게 구분할 수 있도록 해줍니다. 일반적인 torchaudio나 librosa에서 제공하는 멜 스케일은 주파수 대역을 로그 간격으로 나누지만, 실제 서양 음악 스케일과는 일치하지 않기 때문에 음악 분석에는 한계가 있었습니다. 이러한 점을 보완하기 위해 Musical Mel Transform은 FFT 결과를 기반으로 음악적으로 의미 있는 필터뱅크를 구성하여 음높이를 더 정교하게 표현할 수 있습니다.

Musical Mel Transform 소개 라이브러리는 특히 저역대에서의 해상도를 강화하는 데 초점을 맞추고 있습니다. 일반적인 멜 변환에서는 FFT 크기가 2048보다 작은 경우 저주파 영역에서 분해능이 크게 떨어지는 문제가 있는데, Musical Mel Transform은 FFT 빈(bin)을 적절히 보간(interpolation)하여 저역대의 음을 더 명확히 구분할 수 있도록 합니다. 이는 베이스, 킥 드럼, 루트 노트 등 음악에서 중요한 저주파 요소를 AI 모델이 잘 학습하도록 돕는 데 큰 장점이 됩니다.

또한 이 변환기는 실시간 응용 환경에서도 활용 가능하도록 최적화되어 있습니다. CQT(Constant-Q Transform) 같은 기법이 저주파 분석에서는 강점을 보이지만 속도가 느린 반면, Musical Mel Transform은 FFT 기반으로 빠른 연산을 제공하면서도 저주파 분해능을 개선하여 실시간 음악 분석이나 생성 모델에 적합합니다. 더 나아가 ONNX 변환 기능을 지원해 PyTorch 모델을 손쉽게 C++ 환경에서 실행할 수 있도록 배려한 점도 돋보입니다.

Musical Mel Transform의 가장 큰 차별점은 ‘음계 친화적(musical scale-aware)’이라는 점입니다. torchaudio의 멜 변환과 비교했을 때, 동일한 차원 수로 맞추어도 저주파 대역에서 훨씬 선명한 해상도를 보여줍니다. 예를 들어, 150Hz 이하 구간에서 일반 멜 변환은 매우 거친 해상도를 제공하는 반면, Musical Mel Transform은 더 자연스럽게 보간된 스펙트럼을 제공합니다. 반면 torchaudio의 멜 변환은 1kHz 이상 고역대에서 특징량이 집중되는 경향이 있어 저역대 분석에는 불리합니다. Musical Mel Transform은 필요에 따라 5kHz 이상의 영역을 FFT 그대로 통과시키는 옵션을 제공하여 전체 주파수 대역을 균형 있게 다룰 수 있습니다.

즉, FFT와 전통적 멜 변환 사이에서 각각의 장단점을 적절히 흡수한 형태라고 볼 수 있으며, 특히 음악 기반의 신호 처리, 자동 악보 생성, 음높이 기반 분류 문제 등에 적합한 설계를 갖추고 있습니다.

Musical Mel Transform의 동작 방식

Musical Mel Transform은 기본적으로 FFT 결과를 새로운 멜 빈(mel bin)에 가중합하여 매핑하는 구조를 따릅니다. 이때 단순히 매핑하지 않고 adaptive=True 옵션을 통해 FFT 빈(bin)들을 적절히 보간하여 음정 중심의 특징을 생성합니다. 즉, 음계 단위에 맞춰 필터를 보간하고, 빈의 폭을 적응적으로 조절하여 특정 음을 더 쉽게 구분할 수 있도록 합니다. 반음 단위뿐 아니라 4분음 단위로도 설정할 수 있어 아랍 음악이나 현대 전자음악 같은 비서양 음악 스케일에도 대응할 수 있습니다.

  • interval 값을 1.0으로 설정하면 반음 단위, 0.5로 설정하면 4분음 단위로 세분화할 수 있습니다.

  • learnable_weights="fft" 옵션을 사용하면 FFT 크기별로 학습 가능한 가중치를 적용하여 음량 보정과 같은 작업을 자동화할 수 있습니다.

  • norm=True로 설정하면 각 멜 필터가 동일한 가중합을 갖도록 정규화되어 안정적인 스케일링이 가능합니다.

Musical Mel Transform의 주요 특징

  • 저주파 처리 특성: 저주파는 FFT 해상도가 매우 제한적인 영역입니다. FFT 크기가 2048일 때 20Hz 간격으로 샘플링되므로, 100Hz 이하에서는 서로 다른 음정이 거의 구분되지 않을 수 있습니다. Musical Mel Transform은 이 영역에서 보간을 통해 음정 중심의 필터를 형성함으로써 제한적인 FFT 해상도를 최대한 활용할 수 있도록 합니다. 그러나 저자는 FFT 크기가 512 이하일 경우에는 큰 효과를 기대하기 어렵다고 경고하며, 최소 1024 이상의 FFT 크기를 권장하고 있습니다.

  • 고주파 처리 특성: 고주파 영역에서는 멜 필터 간격이 넓어지면서 일부 FFT 빈이 무시될 수 있습니다. 이 경우 passthrough_cutoff_hz=5000 같은 설정을 통해 특정 구간부터 FFT 빈을 직접 통과시켜 더 많은 정보를 유지할 수 있습니다. 또한 passthrough_grouping_size=3 같은 옵션을 주면 FFT 빈을 묶어서 효율적으로 처리할 수 있어 차원 수를 줄이는 데 도움이 됩니다.

  • ONNX 호환성: 기본적으로 PyTorch의 FFT를 사용하지만, 필요하다면 ConvFFT 모듈을 활용하여 ONNX 호환 FFT 연산을 수행할 수 있습니다. ConvFFT는 속도는 다소 느리지만, ONNX 환경에서 일관된 동작을 보장하며 CPU 기반 C++ 추론에서 최적화된 성능을 발휘할 수 있습니다. 따라서 연구 단계에서는 PyTorch FFT를, 배포 단계에서는 ConvFFT 기반으로 변환하는 전략이 유용할 수 있습니다.

Musical Mel Transform의 사용 예시

Musical Mel Transform 라이브러리는 PyTorch 모듈로 쉽게 불러올 수 있으며, 단 몇 줄의 코드로 음향 특징량을 추출할 수 있습니다:

from musical_mel_transform import MusicalMelTransform

mel_transform = MusicalMelTransform(
    sample_rate=44100,
    frame_size=2048,
    interval=1.0,  # 반음 단위
    f_max=10000,
    use_conv_fft=True,
    learnable_weights="fft"
)

audio_frames = torch.randn(4, 2048)  # 배치 4개
mel_feats, fft_feats = mel_transform(audio_frames)

또한 간단한 오디오 분류 모델에 적용할 수 있도록 예제 코드도 제공되며, ONNX로 내보내기(export)까지 지원합니다.

라이선스

Musical Mel Transform 프로젝트는 MIT 라이선스로 공개되어 있으며, 상업적 사용을 포함한 자유로운 활용이 가능합니다. 다만, 원저작자 표시는 필요합니다.

:github: Musical Mel Transform GitHub 저장소




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요