오답노트

librosa parameter 분석 : inverse.mel_to_audio_1 본문

프로젝트/화자 구분 음성 기록

librosa parameter 분석 : inverse.mel_to_audio_1

장비 정 2021. 4. 3. 01:46
# 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()

기존 audio file 과 mel_to_audio 를 거친 audio file

 

위아래는 각각 기존 오디오 파일과 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 는 돌릴 때마다 랜덤한 값으로 해당 데이터를 처리한다.