Super Kawaii Cute Cat Kaoani 실시간으로 mel spectrogram 생성하기

연구/오디오

실시간으로 mel spectrogram 생성하기

치킨고양이짱아 2023. 10. 10. 21:50
728x90
728x90

이때까지 오디오 파일 전체를 로드하고 거기서 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가 잘 만들어진다.

728x90
728x90