이때까지 오디오 파일 전체를 로드하고 거기서 mel spectrogram을 다 만들어놓은 뒤, 만들어 놓은 mel spectrogram 에서 필요한 부분들을 뽑아서 사용했었는데, 이제 오디오로부터 mel spectrogram을 실시간으로 생성해야하는 상황(런타임)이 생겨버렸다.
dataset을 생성할 때 오디오 파일 전체를 로드한 뒤 mel sepctrogram을 생성했기 때문에, 실시간으로 mel spectrogram을 생성할 때에도, 오디오 파일 전체를 로드했을 때와 최대한 비슷한 mel spectrogram feature를 매 순간순간마다 만들어야한다.
mel spectrogram 자체가 Window를 가지고 미래 시점까지의 데이터까지 반영해서 만드는 것이다 보니 조금 딜레이는 생길 수 밖에 없지만 그래도 다음과 같은 코드로 mel spectrogram을 그때 그때 생성할 수 있다.
import librosa
sr = 15000
n_fft = 1024
frame_time = 0.033333
hop_length = 500
current_frame_index = 30
librosa 라이브러리를 Import 해주고 sample_rate, n_fft, frame_time, hop_length와 같은 parameter 값들을 세팅해준다. 나는 dataset을 만들때와 같은 값으로 세팅해주었다.
그리고 오디오 파일을 로드하여 오디오 데이터를 아래와 같이 만들어주었다.
audio_data, = librosa.load(audio_file_path, sr = sr)
그리고 매 frame마다 호출하게 되는 call back 함수에는 다음과 같은 코드를 작성하였다. 참고로 내가 필요한 data는 [과거 30 frame 동안의 mel spectrogram + 현재 frame에 해당하는 mel spectrogram + 미래 30 frame 동안의 mel spectrogram] 이다.
# frame index update
current_frame_index += 1
current_time = frame_time * dataset_idx
# 해당되는 audio 부분을 자르기
# 현재 frame에 해당하는 시점, 전 1초, 후 1초의 오디오 부분을 잘라야한다.
audio_data_start_index = int(current_time * sr-frame_time * 30 * sr)
audio_data_end_index = int(current_time * sr + frame_time * 30 * sr)
audio_chunk = audio_data[audio_data_start_index: audio_data_end_index]
# mel spectrogram 추출
mel_spectrogram = librosa.feature.melspectrogram(y = audio_chunk, sr = sr, n_fft = n_fft, hop_length = hop_length)
추출한 mel spectrogram의 shape를 출력해보면 (128, 61)로 내가 의도한 shape를 가지는 data가 잘 만들어진다.
'연구 > 오디오' 카테고리의 다른 글
Learning Music Reprsentation with WAV2VEC 2.0 논문리뷰 (2) | 2023.12.05 |
---|---|
wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations (1) | 2023.11.29 |
mel spectrogram 관련 조사 + 어떻게 뽑아내는지 (0) | 2023.07.05 |