파이썬 음성 인식 딥러닝 - paisseon eumseong insig dibleoning

이 음성 파일을 시각화하여 살펴보자. 음성은 시간, 주파수, 진폭(amplitude)으로 이루어져 있다. 하지만 단순하게 spectrum 그래프를 그리면 이 세 가지 요소를 동시에 살펴볼 수 없다. 그래서 신호의 spectral content의 시간 변위를 표시하는 시간, 주파수에 대한 2차 함수인 Spectrogram을 계산해야 한다.

 

Spectrogram 함수 정의

xxxxxxxxxx

from scipy import signal

import numpy as np

from scipy.io import wavfile
1

from scipy.io import wavfile
2

from scipy.io import wavfile
3

from scipy.io import wavfile
4

from scipy.io import wavfile
5

from scipy.io import wavfile
6
from scipy.io import wavfile
7
from scipy.io import wavfile
8

from scipy.io import wavfile
9

 

Amplitude, Spectrogram plot 그리기

0

1

3

5

6

7
8
9

train_audio_path = 'data/train/audio/'
1

train_audio_path = 'data/train/audio/'
2

train_audio_path = 'data/train/audio/'
3
train_audio_path = 'data/train/audio/'
4
train_audio_path = 'data/train/audio/'
5

train_audio_path = 'data/train/audio/'
6

train_audio_path = 'data/train/audio/'
7

train_audio_path = 'data/train/audio/'
8

파이썬 음성 인식 딥러닝 - paisseon eumseong insig dibleoning

 

하지만 많은 좋은 tool이 나와서 다음과 같이 3D 그래프로도 그릴 수 있게 되었다.

xxxxxxxxxx

filename = 'yes/0a7c2a8d_nohash_0.wav'
0

filename = 'yes/0a7c2a8d_nohash_0.wav'
1

filename = 'yes/0a7c2a8d_nohash_0.wav'
3

filename = 'yes/0a7c2a8d_nohash_0.wav'
4

filename = 'yes/0a7c2a8d_nohash_0.wav'
5

filename = 'yes/0a7c2a8d_nohash_0.wav'
6

filename = 'yes/0a7c2a8d_nohash_0.wav'
7

filename = 'yes/0a7c2a8d_nohash_0.wav'
8

filename = 'yes/0a7c2a8d_nohash_0.wav'
9

sample_rate, samples = wavfile.read(train_audio_path + filename)
0

sample_rate, samples = wavfile.read(train_audio_path + filename)
1

sample_rate, samples = wavfile.read(train_audio_path + filename)
2

sample_rate, samples = wavfile.read(train_audio_path + filename)
3

sample_rate, samples = wavfile.read(train_audio_path + filename)
4

sample_rate, samples = wavfile.read(train_audio_path + filename)
5

파이썬 음성 인식 딥러닝 - paisseon eumseong insig dibleoning

 

Normalization

이제 spectrogram 값의 범위를 살펴보자.

xxxxxxxxxx

sample_rate, samples = wavfile.read(train_audio_path + filename)
7

Result > -19.381107330322266 ~ 11.731490135192871

값의 분포가 넓기 때문에 훈련 데이터로 사용하기에 적합하지 않다. 따라서 정규분포로 Normalize를 해야 한다.

sample_rate, samples = wavfile.read(train_audio_path + filename)
8
sample_rate, samples = wavfile.read(train_audio_path + filename)
9
print('sample rate : {}, samples.shape : {}'.format(sample_rate, samples.shape))
0

print('sample rate : {}, samples.shape : {}'.format(sample_rate, samples.shape))
1

 

Dimensionality Reduction

음성 데이터는 이미지만큼이나 크기가 크다. 그렇기 때문에 훈련 속도를 위해서는 크기를 줄여줄 필요가 있다. 첫 번째로 VAD (Voice Activity Detection)을 시도해보자.

Jupyter 환경에서 다음 코드로 음성을 들을 수 있다.

xxxxxxxxxx

filename = 'yes/0a7c2a8d_nohash_0.wav'
0

print('sample rate : {}, samples.shape : {}'.format(sample_rate, samples.shape))
4

Your browser does not support the audio element.

음성을 들어보면 "yes" 가 명확히 들린다. 하지만 위 그래프에서 amplitude 값들을 보면 중앙에 몰려있고 앞뒤로는 silence가 있다는 것을 알 수 있다. 그래서 silence를 삭제해서 데이터 크기를 줄일 수 있다.