장난감 연구소
음 높이(Pitch) 예측 모델 정리 본문
음악 오디오 파일에서 가수의 노래 목소리의 음 높이를 추출하는 작업을 하면서, 사용해 본 음 높이 예측(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에서 로드할 수 있다.
리샘플링
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 |
제시된 성능 비교
'토이프로젝트' 카테고리의 다른 글
졸업 작품 돌아보기, 하모나이즈 (1/2) (0) | 2024.11.27 |
---|---|
재생 중인 동영상과 음악 컨트롤하기 [실패] (0) | 2021.06.02 |
#2 라즈베리파이 웹 서버 운영하기 - 고정 IP 설정, 포트포워딩 (3) | 2020.02.04 |
#1 라즈베리파이 웹 서버 운영하기 - 우분투 설치, SSH 설정 (0) | 2020.01.21 |
프로그래밍으로 새해 인사말 보내기 (0) | 2020.01.05 |