공부 정리 블로그

[음성인식2] - 입/출력 end 복잡도 분석 본문

대학원 수업/음성인식

[음성인식2] - 입/출력 end 복잡도 분석

따옹 2023. 3. 15. 20:11

음성 신호 저장 방법 및 시스템 입력

 

file로 저장하는 이유?

녹음한 소리를 다시 들으려고

1. sampling rate
- 1초 당 sampling 몇 번 하는가? 현재 음성 인식에 많이 사용되는 sampling rate는 초당 16k

- 유선전화 1초 8천(저장한 다음 play했을 때 복원되는 frequency rate)

- 음성인식 시스템 개발시 16000 (8천까지 복원 가능)

- 4000 Hz까지는 충분

- 음악 저장에는 초당 44.1K(CD)

 

2. sampling byte
- 진폭 값을 어떻게 저장해야함?

-Sample 2byte 사용(2^16=65,536)

 

ex) 양자화? 정수번째 n번째 계단에 현재 내 위치임

진폭을 기록할때, 1~256개의 계단으로 나눠서 진폭이 어느 계단이 존재하는지 정수로 표현 (디지털값)

 

Hz - frequency

초당 횟수 - sampling

 

 

음성신호의저장방법(예제)

ex)1초 녹음해서 file을 열어보면 16,000x2 = 320,000byte

가청주파수 대역을 커버하기 위해 초당 44.1k를 사용면 1초에 녹음한 음성은? 44.1k x 2 = 88.2kbyte

ex)1곡당 4분 10곡을 들어있을 때 얼마만큼의 데이터가 들어있을까? 60%정도 구워져 있음

CD 가청 주파수 대역 44.1k

stereo : 왼/오 스피커 첫번째(2byte)-왼쪽 / 두번째-오른쪽/세번째 -왼쪽 (channel 2개)

 

따라서, 44,100(samples/sec) * 2(bytes) * 240(secs) * 10() * 2(channels) = 423,360,000

: 423.36/700 MB, 60.48%

 

input의 개수가 몇 개인가?

 

전체음성을 1/50초 단위로 나누고 각 윈도우 별로 13차 MFCC feature를 추출하여 사용

(진폭이 클 수록 에너지가 크다)

window별로feature를추출하는가?

stationary : 과거 음성을 듣고 미래를 예측할 수 있음(sin파)

- stationary -> 차 엔진 잡음

 non-stationary : (기본적으로) 음성

- 미래 예측이 어려워서 모델링 잘 안됨

 

*우리의 분석 대상*(non-stationary)

음성 : 사람의 발성 기관을 통해 나오는 소리

 

(소리의 속도는 340m/s )

사람의 음성은 non-stationary이지만 짧은 구간에 대해서는 분석/모델링/예측 가능

그렇기 때문에 음성을 짧은 단위로 쪼개면 quasi-stationary로 되어 예측할 수 있음

20m sec 구간은 가능(stationary하므로 feature parameter를 뽑을 수 있다)

 

초당 160,000번

무거운 소리 - 저주파

매 시간마다 histogram으로 나타냄

나오고 있는 소리의 frequency를 계산?

특정 window에 대해서 spectrum을 구하면

각각의 frequecy(f1, f2, f3,...)에 대해 에너지가 어느정도인지를 표현

 

Fast Fourier Transform(FFT)

각각의 frequency로 나옴

  • 기본 가정:

- 모든 주기적인 신호는 정현파 (ex> sin, cos)의 합으로 나타낼 수 있다

- 모든 신호를 𝛼∗sin𝛽∗𝜋 의 합의 형태로 표현 가능

  • Time domain의 data를 frequency domain의 data로 변형

- Frequencydomain으로 나타내어진 결과를 spectrum이라고 함

 

fft 결과로 원음 복원 x -> 정보가 손실

fft point 1024면 기본 주파수를 16000을 512로 나눈 frequency

512개의 sin파의 합에 가장 가까운 amplitude를 계산

-> 에너지를 각각 구해서 쭉 연결하면 spectrum구할 수 있음

 

spectrogram(3차원)

Timefrequency domain을 각 축으로 표현하고, amplitude를 색으로 표현한 것을 spectrogram이라 함

frequency 별 에너지를 나타냄

x- t축 / y-frequency / z- 에너지

하지만 z축을 없애고 등고선 형식으로 표현(색깔을 달리함)

노란색- 에너지가 높은 유성음(뚜렷f1, f2, f3 유성음 3개로 구성되어 있는 무언가)

 

Mel-filterbank& Log

입모양 filter

- x(n) = v(n)*e(n) 을 음성이라고 가정

- v(n) = 구강구조

- e(n) = 성대에서울리는소리

입모양을 보고 무엇을 발음했는지 파악 가능하므로 v(n)을 알고싶지만 x(n)만 가지고 있음

 

Discrete Cosine Transform(DCT) 

 

잔차는 화자정보

spectrum parameter 줄이고 싶음

byte는 줄이면서 음성인식에 필요한 정보는 최대한 유지

=> 복잡하게 모델링할 수록 좋지만 byte가 늘어나니 최적점을 잡는 게 좋음 -> 13개 vector parameter가 가장 적절

 

MFCC

13개의 vector를 뽑으면서 '아','이','유','여','우' 이러한 sequence가 나오는지를 보고 맞추려고 하는 것

13개의 계수를 이용해서 미리 학습자료로 만들고 '아','이' 의 군집화 분포를 미리 뽑아놓고

마이크로 받은 음성을 매 20ms마다 vector 구간마다 보내서 우리가 알고있는 분포와의 거리를 구하려고 하는 중

서로의 위치를 (x,y,z)로 나타내어 서로간의 위치를 유클리디언 거리로 계산

x,y,z에 해당하는 아이겐백터가 서로 직교하고 있다?

x축, y축, z축이 직교하기때문에 corelation이 있어서 직교 좌표계가 아니다

아 발성 vector들의 평균 거리를 구하려고 함. 이걸 직교 좌표계로 보낸 것이 MFCC

 

이 window에서 만들어진 spectrum의 모양을 가지고 있고

이 모양이 어떤 음소를 구분하는데 사용된다고 볼 수 있음

제일 근사화된 것을 뽑앗을때 13개의 축에 해당하는 아이겐 벨류가 직교해야하는데 dependency => MFCC

 

320개의 sample로 FFT로 분리하면 spectrum 이 나오면

어떤 발성인지에 대한 13개의 계수로 표현하고

13개의 파라미터를 직교좌표계로 보는게 MFCC

 

음성인식 유용한 정보는 최대한 살리면서 byte수는 줄임

 

32KB -> (50개x13차의 vectorx4byte(float))2.6KB(MFCC)로 줄인 값 

-> window size 내에서 음성을 구분하기 위한 최대한의 정보(13차 vector)만을 뽑아냄

 

(예시)

음성

seq->seq

continous 한 13차의 vector를 어떻게 뽑느냐

sample들의 연속으로 되어 있는 것을 vector의 seq로 바꿨다

 

매 window(20ms)마다 spectrum을 만들어서 모양의 전반적인 모양을 보고 구분하려고 하는데 13차 계수로 하려고 함

MFCC-> spectrum의 모양

 

출력 sequence

 

최대확률을 가진 문장을 찾는 과정

1. 음성구간이 어디까지인지 모름

2. 몇 단으로 구성되어 있는지 모름(음성/출력/단위/결정)

 

음성 출력 단위결정

단어의 개수를 유한하게 만들어야 함

인식 가능한 단어를 모음 => 어휘

vocabrary index열로 표현

 

비교대상의 문장의 개수가 탐색해야하는 탐색 공간

사실은 유한단어 음성인식기이지만

사용자에겐 무한단어 음성인식기로 쓸 수 있도록 해야함

 

- 한국어(형태소 단위로 sequence 구성)

형태소-소가 붙으면 최소 단위

- 영어(단어 단위로 sequence 구성)

 

Tokenization

token은 기계가 text corpus로 

 

한국어 

1. 완성형 1byte ASCII

2200개로 구성된 어휘를 만들면 내부적으로는 음절(음절의 sequence)로 보고

유한음성인식기를 만들고 사용자는 무한으로 경험을 줄 수 있는데?

음절의 열로 구성 (단/위/로/나/누/눈-초중성으로 구성된 발성)

= > 음성 인식률이 좋지 않음

연음들을 모델링 시켜줘야하는데

2개의 음절로 구성된

2200첫번째 단어를 하나 더 넣으세요(??)

2음절 짜리를 넣으면 가능 2200^2에 해당하는 2음절짜리 단어가 있는데

어떤 녀석이 제일 좋으냐? 하면서 컴터가 한단어씩 넣어주면2200번째 단어 다음 그 다음당음 을 내가 정해놓은 어휘의 크기가 될 때까지 한 단어씩 넣음

어휘의 크기를 제한하는 이유는?

argamx_wP(W|O), computation power

 

BPE(byte-pair encoding)

기계가 자동으로 만들어주면 좋겠음

 

1. 모든 단어들을 글자(character) 단위로 분리

2. 가장 빈도수가 높은 unigram의 쌍을 하나의 unigram으로 통합

) 가장 빈도수가 높은 unigram‘A’, ‘B’ 일 경우, ‘AB’vocabulary에 추가

3. k번 동안 2를 반복함

4. 결과적으로 vocabularyk개의 새로운 unigram이 추가됨

->frequency를 계속 셈

 

2. 조합형

언어를 몰라도 corpus만 알면 됨 

구글(인식은 잘 되는데 띄어쓰기가 이상한 경우/기계가 분석을 한 거라 token을 개수만 보고 나눠서...)