공부 정리 블로그
[음성인식2] - 입/출력 end 복잡도 분석 본문
음성 신호 저장 방법 및 시스템 입력
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)
- 기본 가정:
- 모든 주기적인 신호는 정현파 (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차원)
Time과 frequency domain을 각 축으로 표현하고, amplitude를 색으로 표현한 것을 spectrogram이라 함
frequency 별 에너지를 나타냄
하지만 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. 결과적으로 vocabulary에 k개의 새로운 unigram이 추가됨
->frequency를 계속 셈
2. 조합형
언어를 몰라도 corpus만 알면 됨
구글(인식은 잘 되는데 띄어쓰기가 이상한 경우/기계가 분석을 한 거라 token을 개수만 보고 나눠서...)
'대학원 수업 > 음성인식' 카테고리의 다른 글
[Chapter9]언어모델(4)-DNN 기반 언어모델 (0) | 2023.05.31 |
---|---|
[Chapter9]언어모델(2) - back-off, perplexity (0) | 2023.05.24 |
[Chapter9]언어모델(1) - ~smoothing (0) | 2023.05.17 |
중간고사 (0) | 2023.04.19 |
[음성인식1] - 연구 동향 및 문제 정의 (0) | 2023.03.08 |