음성 데이터2(Mel Spectrogram, MFCCs, Chroma Frequencies)

2021. 4. 3. 01:18음성 인식 프로젝트

Mel Spectrogram

  • 주파수 특성이 시간에 따라 달라지는 오디오를 분석하기 위한 특징 추출 기법
  • Mel-scale(Melody scale)
    • pitch에서 발견한 사람의 음을 인지하는 기준(threshold)을 반영한 scale 변환 함수
    • Pitch = 음의 높낮이(진동수 Hz의 크고 작음과는 다르다.) : Pitch는 보다 추상적인 개념이다. 사람은 소리의 Hz가 저주파일 때 더 민감하게 인지하고, 고주파로 갈수록 둔감해진다는 점에서 출발한 개념이다. 이를 just-noticeable differences(==threshold)라고 한다.

귀의 구조로 인한 차이

출처: https://hyongdoc.tistory.com/402 [Doony Garage]

  • 사람은 200Hz와 1200Hz 소리는 쉽게 구분할 수 있지만, 12000Hz와 13000Hz는 같은 1000Hz 간격임에도 불구하고 구분하기 어렵다.
  • 동일한 세기로 100Hz 소리를 들려줄 때와, 10000Hz 소리를 들려줄 때 사람이 느끼는 세기는 다르다.
  • (인간이 이해하기 힘든) Spectrogram의 y축을 Mel Scale로 변환한 것 (Non-linear transformation)
  • 보통 고주파로 갈 수록 사람이 구분하는 주파수 간격이 넓어지는데 이를 반영해주는 mel scale을 적용

https://youtu.be/xpfHpzjoDEg?t=54

주파수를 들어볼 수 있는 동영상

 

https://www.youtube.com/watch?v=Z_6tAxb89sw&t=337s

  • 프레임의 길이와 슬라이딩 범위를 하이퍼 파라미터로 설정

mel spectrogram 기본값

librosa 공식 홈페이지에 음성 처리의 경우엔 n_fft를 512를 기본값으로 권장한다고 적혀있다.

https://librosa.org/doc/0.8.0/generated/librosa.stft.html

title = ['Mel Spectrogram : F1_high','Mel Spectrogram : F1', 
        'Mel Spectrogram : F2','Mel Spectrogram : F3','Mel Spectrogram : M1',
        'Mel Spectrogram : M2','Mel Spectrogram : M2_low']

for i in range(7):
    S = librosa.feature.melspectrogram(y_list[i], sr=sr_list[i], n_fft=512, hop_length=128)
    S_DB = librosa.amplitude_to_db(S, ref=np.max)

 

 

 


Zero Crossing Rate

  • 음파가 양에서 음으로 또는 음에서 양으로 바뀌는 비율
  • 0(Zero)을 많이 지날수록 노이즈가 많다고 볼 수 있다.
for i in range(7) : 
    zero_crossings = librosa.zero_crossings(y_list[i], pad=False)
    print('name : ', name[i],'\n')
    print('zero_crossings : ', zero_crossings,'\n')
    print('Total zero_crossings in our 1 file : ', sum(zero_crossings),'\n')
    print('-------------------------------------------------------')

name :  F1_high 

zero_crossings :  [False False  True ... False False False] 

Total zero_crossings in our 1 file :  12622 

-------------------------------------------------------
name :  F1 

zero_crossings :  [False False False ... False False False] 

Total zero_crossings in our 1 file :  8582 

-------------------------------------------------------
name :  F2 

zero_crossings :  [False False False ... False  True False] 

Total zero_crossings in our 1 file :  6492 

-------------------------------------------------------
name :  F3 

zero_crossings :  [False False False ...  True False False] 

Total zero_crossings in our 1 file :  8226 

-------------------------------------------------------
name :  M1 

zero_crossings :  [False False False ... False False False] 

Total zero_crossings in our 1 file :  6429 

-------------------------------------------------------
name :  M2 

zero_crossings :  [False False False ... False False False] 

Total zero_crossings in our 1 file :  9286 

-------------------------------------------------------
name :  M2_low 

zero_crossings :  [False False False ... False False False] 

Total zero_crossings in our 1 file :  9671 

-------------------------------------------------------

 


Mel-Frequency Cepstral Coefficients (MFCCs)

  • MFCCs는 특징들의 작은 집합(약 10-20)으로 스펙트럴 포곡선의 전체적인 모양을 축약하여 보여준다
  • 사람의 청각 구조를 반영하여 음성 정보 추출
  • mel spectrum에서 Cepstral분석을 통해 추출된 값
  • 출처 : https://tech.kakaoenterprise.com/66

Cepstral?

Cepstrum(캡스트럼) = 스펙트럼 신호의 로그값에 역푸리에 변환을 한 것

(spectrum - cepstrum 단어를 거꾸로 하면 똑같은 단어가 된다!)

 

소리들은 기음(기본 주파수)와 배음으로 구성되어 있는데,

cepstral 분석을 하면 배음의 구조를 알 수 있어 기음을 찾을 수 있다.

https://ratsgo.github.io/speechbook/docs/phonetics/acoustic

예를 들어 피아노에서 F0이 '라' 라고 한다면 '라'를 연주했을때 기본 주파수인 440hz뿐만 아니라

그 정수배인 880hz, 그리고 그 다음 배음들까지 포함하고 있다.

배음 구조는 악기나 성대의 구조에 따라 달라지며 배음 구조의 차이가 음색의 차이를 만든다.

librosa.feature.mfcc(y=None, sr=22050, S=None, n_mfcc=20,
		     dct_type=2, norm='ortho', lifter=0, **kwargs)
import sklearn

title = ['MFCCs : F1_high','MFCCs : F1', 
        'MFCCs : F2','MFCCs : F3','MFCCs : M1',
        'MFCCs : M2','MFCCs : M2_low']

for i in range(7):
    mfccs = librosa.feature.mfcc(y_list[i], sr=sr_list[i])
    print('mfccs shape:', mfccs.shape)

    mfccs = sklearn.preprocessing.minmax_scale(mfccs, axis=1) 
    print('mean: %.2f' % mfccs.mean())
    print('var: %.2f' % mfccs.var())

    plt.figure(figsize=(16, 6))
    librosa.display.specshow(mfccs, sr=sr_list[i], x_axis='time')
    plt.title(title[i], fontsize=20)
    plt.colorbar()
    plt.show()
   

MFCC를 정규화 하지 않으면 상단의 그래프처럼 보인다. 너무 낮은 값이 있어서 제대로 특징을 볼 수 없다.

출처 : 팀원들
mfccs shape: (20, 216) mean: 0.49 , var: 0.05

 

mfccs shape: (20, 216) mean: 0.51 , var: 0.04

 

mfccs shape: (20, 216) mean: 0.54 , var: 0.04

 

 

mfccs shape: (20, 216) mean: 0.52 , var: 0.05

 

mfccs shape: (20, 216) mean: 0.51 , var: 0.05

 

 

mfccs shape: (20, 216) mean: 0.51 , var: 0.05

 

 

mfccs shape: (20, 216) mean: 0.52 , var: 0.04

 

 


Chroma Frequencies

  • 크로마 특징은 음악의 흥미롭고 강렬한 표현이다
  • 크로마는 인간 청각이 옥타브 차이가 나는 주파수를 가진 두 음을 유사음으로 인지한다는 음악이론에 기반한다
  • 모든 스펙트럼을 12개의 Bin으로 표현한다
  • 12개의 Bin은 옥타브에서 12개의 각기 다른 반음(Semitones=Chroma)을 의미한다
title = ['Chroma Frequencies : F1_high','Chroma Frequencies : F1', 
        'Chroma Frequencies : F2','Chroma Frequencies : F3','Chroma Frequencies : M1',
        'Chroma Frequencies : M2','Chroma Frequencies : M2_low']

for i in range(7):
    chromagram = librosa.feature.chroma_stft(y_list[i], sr=sr_list[i], hop_length=512)

    plt.figure(figsize=(16, 6))
    librosa.display.specshow(chromagram, x_axis='time', y_axis='chroma', hop_length=512)
    plt.title(title[i], fontsize=20)
    plt.show()
    print('Chromogram shape:', chromagram.shape)

모든 Chromogram shape: (12, 216)으로 동일하다.

 

 

 

 

'음성 인식 프로젝트' 카테고리의 다른 글

STT  (0) 2021.04.26
Speech VGG  (0) 2021.04.25
librosa.feature  (0) 2021.04.03
음성 데이터 (오디오 파일 이해, 2D Sound Waves, Fourier Transform, Spectrogram)  (0) 2021.04.03