오답노트
librosa parameter 분석 : inverse.mel_to_audio_1 본문
# import libraries
import numpy as np
import matplotlib.pyplot as plt
import librosa
import librosa.display
import IPython
import IPython.display as ipd
# load data
y_m, sr_m = librosa.load(
'c:/nmb/nmb_data/주형.wav'
)
y_f, sr_f = librosa.load(
'c:/nmb/nmb_data/영리.wav'
)
# audio -> melspectrogram
# mel_to_audio 하기 전에 melspectrogram 를 해줘야한다
S_m = librosa.feature.melspectrogram(
y_m, sr = sr_m
)
S_f = librosa.feature.melspectrogram(
y_f, sr = sr_f
)
mel_to_stft 와 마찬가지로 mel_to_audio 도 처리하기 전에 melspectrogram 화를 시켜줘야한다.
# mel_to_audio
mta_m = librosa.feature.inverse.mel_to_audio(
S_m,
sr = sr_m,
n_fft = 512,
hop_length = 128, # n_fft // 4
win_length = 512,
window = 'hann',
center = True,
pad_mode = 'reflect',
power = 2.0,
n_iter = 32,
length = None
)
mta_f = librosa.feature.inverse.mel_to_audio(
S_f,
sr = sr_f,
n_fft = 512,
hop_length = 128,
win_length = 512,
window = 'hann',
center = True,
pad_mode = 'reflect',
power = 2.0,
n_iter = 32,
length = None
)
mta_m :
[-0.00397709 -0.00297456 -0.00222611 ... -0.04705044 -0.05009013 -0.05402468]
mta_f :
[ 2.3277047e-05 -1.4036617e-04 -3.2638659e-04 ... -1.1093903e-02 -1.0982094e-02 -6.6679977e-03]
mta_m.shape = (27520,)
mta_f.shape = (27520,)
위 데이터를 시각화를 하면 아래와 같다.
# visualization
fig = plt.figure(figsize = (32, 12))
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
ax4 = fig.add_subplot(2, 2, 4)
librosa.display.waveplot(
y_m, sr = sr_m, ax = ax1
)
ax1.set(title = 'S_m')
librosa.display.waveplot(
y_f, sr = sr_f, ax = ax2
)
ax2.set(title = 'S_f')
librosa.display.waveplot(
mta_m, sr = sr_m, ax = ax3
)
ax3.set(title = 'mta_m')
librosa.display.waveplot(
mta_f, sr = sr_f, ax = ax4
)
ax4.set(title = 'mta_f')
fig.tight_layout()
plt.show()
위아래는 각각 기존 오디오 파일과 mel_to_audio 를 거친 오디오 파일이며,
좌우는 남성 화자, 여성 화자를 구분한 도표이다.
그래프를 보게 되면 촘촘했던 주파수들이 살짝 이가 빠진 것처럼 보이는데
이는 zero_crossingrate 를 통해 한 번 확인해보면
# zero_crossingrate
list = [y_m, mta_m, y_f, mta_f]
for i in list:
zerocrossing_rate = librosa.zero_crossings(i, pad = False)
print(sum(zerocrossing_rate))
y_m : 9286
mta_m : 2368
y_f : 6492
mta_f : 1583
실제로 zero_crossingrate 가 훨씬 떨어진 것을 확인할 수 있다.
또한 x 축을 보게 되면 시간도 훨씬 줄어든 것을 볼 수 있다. (5초에서 1.2초)
실제로 해당 데이터를 들어보게 되면 데이터 자체가 잘린 게 아닌 '압축'이 되어있다는 것을 확인할 수 있는데, 이를 통해 mel_to_audio 를 거치게 되면 해당 파일의 정보를 최대한 살리는채로 압축을 시킨다는 것을 알 수 있다.
(실제로 데이터의 용량도 줄어들었다.)
또한 mel_to_audio 는 돌릴 때마다 랜덤한 값으로 해당 데이터를 처리한다.
'프로젝트 > 화자 구분 음성 기록' 카테고리의 다른 글
librosa parameter 분석 : mfcc_to_mel_1 (0) | 2021.04.03 |
---|---|
librosa parameter 분석 : inverse.mel_to_audio_2 (0) | 2021.04.03 |
librosa parameter 분석 : inverse.mel_to_stft_2 (0) | 2021.04.03 |
librosa parameter 분석 : inverse.mel_to_stft_1 (0) | 2021.04.03 |
librosa parameter 분석 : stack_memory (0) | 2021.04.02 |