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

librosa parameter 분석 : mfcc_to_mel_1

장비 정 2021. 4. 3. 11:39

mfcc 를 melspectrogram 화 시키는 처리이다.

 

# import libraries

import numpy as np
import matplotlib.pyplot as plt
import IPython.display as ipd
import librosa
import librosa.display
import soundfile as sf
import sklearn


# load data

y_m, sr_m = librosa.load(
    'c:/nmb/nmb_data/주형.wav'
) # 남성 음성

y_f, sr_f = librosa.load(
    'c:/nmb/nmb_data/영리.wav'
) # 여성 음성


# mfcc

# 정규화를 위해 함수 생성
def normalize(x, axis = 0):
    return sklearn.preprocessing.minmax_scale(x, axis = axis)

mfcc_m = librosa.feature.mfcc(
    y_m, sr = sr_m
) # mfcc 변환
mfcc_m_norm = normalize(mfcc_m, axis = 1) # MinMaxScale 을 거쳐 정규화

mfcc_f = librosa.feature.mfcc(
    y_f, sr = sr_f
)
mfcc_f_norm = normalize(mfcc_f, axis = 1)

 

필요한 라이브러리를 임포트하고 각 남성 화자, 여성 화자의 발성 데이터를 로드한다.

그 후 mfcc 로 만들기 전 정규화를 위해 MinMaxScale 을 사용한 함수 하나를 만든다.

그 뒤 각 데이터를 mfcc 로 만들었다.

 

시각화를 하자면 다음과 같다.

 

# 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.specshow(
    mfcc_m, sr = sr_m, x_axis = 'time', ax = ax1
)
ax1.set(title = 'mfcc_m_no_norm')

librosa.display.specshow(
    mfcc_f, sr = sr_f, x_axis = 'time', ax = ax2
)
ax2.set(title = 'mfcc_f_no_norm')

librosa.display.specshow(
    mfcc_m_norm, sr = sr_m, x_axis = 'time', ax = ax3
)
ax3.set(title = 'mfcc_m_norm')

librosa.display.specshow(
    mfcc_f_norm, sr = sr_f, x_axis = 'time', ax = ax4
)
ax4.set(title = 'mfcc_f_norm')

fig.tight_layout()
plt.show()

 

정규화를 거치지 않은 mfcc 와 정규화를 거친 mfcc 파일을 비교했다

 

그래프의 윗부분은 정규화를 거치지 않은 mfcc 이며, 아래는 정규화를 거친 mfcc 이다.

왼쪽은 남성 화자의 발성, 오른쪽은 여성 화자의 발성이다.


각 파일이 mfcc 화 된 것을 확인했으면 이제 다시 mel_to_mfcc 화를 시킨다.

 

# mfcc_to_mel

mtm_m = librosa.feature.inverse.mfcc_to_mel(
    mfcc_m_norm,
    n_mels = 128, 
    dct_type = 2, 
    norm = 'ortho', # 'backward', 'ortho', 'forward' 존재
    ref = 1.0, 
    lifter = 0
)

mtm_f = librosa.feature.inverse.mfcc_to_mel(
    mfcc_f_norm,
    n_mels = 128,
    dct_type = 2,
    norm = 'ortho',
    ref = 1.0,
    lifter = 0
)

mfcc_to_mel 한 모습

 

mfcc_to_mel 이 된 것을 확인했으면 기존 파일을 melspectrogram 한 것과 비교해본다.

 

melspectrogram 과 mfcc_to_mel 을 비교한 모습