장난감 연구소

음 높이(Pitch) 예측 모델 정리 본문

토이프로젝트

음 높이(Pitch) 예측 모델 정리

changi1122 2024. 7. 24. 13:40

음악 오디오 파일에서 가수의 노래 목소리의 음 높이를 추출하는 작업을 하면서, 사용해 본 음 높이 예측(Pitch Estimation) 모델을 정리하였습니다. 기계학습과 관련해서 잘 알고 있지는 않지만, 관련된 글이 없어 개인적으로 사용할 때 참고용으로 적어 보았습니다.

 

CREPE

CREPE는 New York University의 연구자들이 2018년 발표한 모델로, CNN을 기반으로 한 Pitch 예측 모델이다. 발표한 논문은 [1802.06182] CREPE: A Convolutional Representation for Pitch Estimation (arxiv.org)에서 확인할 수 있다.

코드와 파이썬 패키지를 제공하는데 깃허브 저장소는 GitHub - marl/crepe: CREPE: A Convolutional REpresentation for Pitch Estimation -- pre-trained model (ICASSP 2018)에서 확인할 수 있다.

설치

$ pip install --upgrade tensorflow  # if you don't already have tensorflow >= 2.0.0
$ pip install crepe

오디오 파일 로드 및 예측

import crepe
from scipy.io import wavfile

sr, audio = wavfile.read('/path/to/audiofile.wav')
time, frequency, confidence, activation = crepe.predict(audio, sr, model_capacity='large', step_size=32, viterbi=False)

주요 파라미터

audio 오디오 샘플 np.ndarray [shape=(N,) or (N, C)]
sr sample rate 정수
model_capacity 모델 크기 'tiny', 'small', 'medium', 'large', 'full’
step_size 한 개의 음높이를 예측할 길이 (ms) 기본값 : 10ms
viterbi 예측 결과를 부드럽게 만들지 여부  

예측 결과

time 시간
frequency 예측한 Pitch 값 (Hz)
confidence voice activity의 신뢰도 (0~1)
activation The raw activation matrix [shape=(T, 360)]

 

SPICE

SPICE 모델은 2019년 구글의 연구자들이 발표한 Pitch 예측 모델이다. 발표한 논문은 [1910.11664] SPICE: Self-supervised Pitch Estimation (arxiv.org)에서 확인할 수 있다. 모델에 대한 설명이 담긴 구글의 블로그 글도 있다.

아키텍처를 보면 Convolutional encoder로 이뤄져 있다고 하고, Convolutional encoder는 Pitch로 맵핑되는 single scalar embedding을 만들어 낸다고 한다. (아마 transformer 모델의 encoder와 비슷할 것 같다.)

모델은 Tensorflow를 필요로 하고, Tensorflow Hub에서 로드할 수 있다.

Google | spice | Kaggle

리샘플링

SPICE 모델은 입력으로 넣을 오디오 파일의 sampling rate가 16000hz이어야 한다. 아니라면 아래 코드와 같이 리샘플링을 직접 해줘야 한다.

EXPECTED_SAMPLE_RATE = 16000

def convert_audio_for_model(file_path, output_file='converted_audio_file.wav'):
    audio = AudioSegment.from_file(file_path)
    audio = audio.set_frame_rate(EXPECTED_SAMPLE_RATE).set_channels(1)
    audio.export(output_file, format="wav")
    return output_file

오디오 파일 로드 및 예측

import tensorflow as tf
import tensorflow_hub as hub
from scipy.io import wavfile

sample_rate, audio_samples = wavfile.read(converted_audio_file, 'rb')

model = hub.load("https://tfhub.dev/google/spice/2")

# We now feed the audio to the SPICE tf.hub model to obtain pitch and uncertainty outputs as tensors.
model_output = model.signatures["serving_default"](tf.constant(audio_samples, tf.float32))

pitch_outputs = model_output["pitch"]
uncertainty_outputs = model_output["uncertainty"]

파라미터

SPICE는 파라미터를 설정할 수 없고, sample rate는 16000hz, step_size는 32ms로 고정되어 있다.

예측 결과

dict 자료형

pitch 예측된 값 (hz로 추가 변환 필요함)
uncertainty 불확실성 (0~1)

예측 결과 값을 Hz 단위로 변환

def output2hz(pitch_output):
  # Calibration constants
  PT_OFFSET = 25.58
  PT_SLOPE = 63.07
  FMIN = 10.0;
  BINS_PER_OCTAVE = 12.0;
  cqt_bin = pitch_output * PT_SLOPE + PT_OFFSET;
  return FMIN * 2.0 ** (1.0 * cqt_bin / BINS_PER_OCTAVE)

제시된 성능 비교

 

PESTO

PESTO는 프랑스의 학교인 Télécom Paris와 Sony의 연구자가 2023년 발표한 Pitch 예측 모델이다. 논문은 [2309.02265] PESTO: Pitch Estimation with Self-supervised Transposition-equivariant Objective (arxiv.org)에서 확인할 수 있다.

구조는 아래 사진과 같다.

 

CREPE와 유사하게 코드와 파이썬 패키지를 제공하는데 깃허브 저장소는 GitHub - SonyCSLParis/pesto: Self-supervised learning for fast pitch estimation에서 확인할 수 있다. 입력과 예측 결과도 CREPE와 유사하다.

설치

pip install pesto-pitch
pip install soundfile

오디오 로드 및 예측

import torchaudio
import pesto

# predict the pitch of your audio tensors directly within your own Python code
x, sr = torchaudio.load("my_file.wav")
x = x.mean(dim=0)  # PESTO takes mono audio as input
timesteps, pitch, confidence, activations = pesto.predict(x, sr)

주요 파라미터

x 입력 오디오 샘플 np.ndarray [shape=(N,) or (N, C)]
sr sample rate 정수
model_name 모델 이름 standard 모델이나 custom PESTO 모델 (기본값 : "mir-1k”)
model_capacity 모델 크기 'tiny', 'small', 'medium', 'large', 'full’
step_size 한 개의 음높이를 예측할 길이 (ms) 기본값 : 10ms

예측 결과

timesteps 시간
preds 예측한 Pitch 값 (Hz)
confidence Frame에 voice가 존재하는지 신뢰도 (0~1)
activations activations of the model

제시된 성능 비교