음성 인식 - newlife-js/Wiki GitHub Wiki
by 서울대학교 성원용 교수님
음성 인식(Speech Recognition)
Speech recognition vs Text understanding
- 둘 다 sequence recognition의 성격이 강함, RNN/Transformer가 중요한 역할
- analog signal(analog -> digital -> feature) vs word(압축된 형태의 심볼)
- speech가 text에 비해 길이가 매우 긺
신호처리
Digital signal: 원래부터 digital 형태(통계 데이터, 컴퓨터로 생성된 신호) / 아날로그 신호를 sampling하여 digital로 저장한 것(음성, 센서)
Analog to Digital
- Sampling: continuous(analog) time -> discrete time
- Quantization: continuous level -> discrete level
※ 한 sample 동안에 신호의 phase가 π보다 더 많이 바뀌면 샘플링이 잘 안됨(샘플링 주파수가 너무 작으면 안됨)
Nyquist Theorem: f_sampling > 2*f_max(최대주파수)여야 함
Fourier Transform
Fourier Transform: converts a function from time domain to frequency domain
- Discrete FT
Short-Time Fourier Transform(STFT)
연속적으로 들어오는 신호의 FT
한 순간의 주파수를 파악하기 위해서 짧은 구간에 대해 FT를 적용하여 주파수 성분이 각각 얼마나 포함되어 있는지 파악
(일정 간격의 신호를 overlapping되도록 windowing해서 DFT를 적용)
Digital Filter
특정 대역 주파수의 신호만 전달되도록 하는 것(나머지 대역은 차단)
- Band pass filter: 특정 대역 주파수만(noise reduction)
- Low pass filter: 낮은 대역 주파수만(anti-aliasing, smoothing)
- High pass filter: 높은 대역 주파수만(DC removal) FIR(finite impulse reponse)나 IIR(infinite impulse response) filter로 디자인함
음성
주로 200~4000Hz 주파수를 사용(인간의 음성은 보통 8kHz까지로 이루어짐)
- 유성음: pitch가 있으며(규칙적으로 떰) 모든 모음과 일부 자음(d, z, b, g, v)
- 무성음: pitch가 없으며(잡음 같음) 일부 자음(t, s, p, k, h)
음성의 주파수 분석
음성을 frame 단위로 나누어 각 frame에 대해 DFT를 적용
유성음 frame과 무성음 frame의 spectrogram은 매우 다름(유성음은 pitch가 만드는 고조파가 있음)
Audio preprocessing
- Pre-emphasis: 고주파 영역의 에너지를 강조함(보통 저주파에서의 에너지가 고주파보다 더 강함, spectral tilt)
by 연속적인 저주파 성분을 제거
- Silence removal: 중간에 나올 수 있는 묵음을 제거
- Dithering: 16/32-bit sampling 과정에서 생길 수 있는 양자화 노이즈를 보정
Mel-scale
참고
인간의 청력은 모든 주파수에 동등하게 sensitive하지 않음(저주파에 더 민감)
Mel filter bank: 주파수 구간별로 특징을 추출하기 위해 고주파로 갈수록 band를 넓게한 filter들로 정보를 압축
Log-Mel-Spectrogram: Mel-scale filter를 거친 신호를 데시벨 dB단위(10log10A)로 변환하여 사용
※ MFCC(Mel-Frequency Cepstral Coefficient): 음성 신호에서 추출할 수 있는 feature(소리의 고유한 특징), 화자 검증이나 음악 장르 분류 등에 쓰임
참고
Tokenizer
컴퓨터가 이해할 수 있는 형태로 자연어 문장을 변환
최소 단위로 쪼개고, 각 단위에 맞는 숫자(index) vector로 변환
- Word tokenizer: 단어가 최소 단위(단어도 길기 때문에 요즘은 많이 쓰이지 않음)
- Grapheme tokenizer: 글자가 최소 단위(알파벳)
- Sub-word tokenizer: 부분단어가 최소 단위(ish, est 등)
Edit distance(Levenshtein distance)
두 문자열 A, B가 있을 때, A에 최소 몇 번의 연산을 거쳐야 B와 동일하게 만들 수 있는지
Statistical Speech Recognition
Acoustic Model(AM), Lexicon(용어 사전), Language Model(LM)의 확률 곱(knowledge integration)으로 계산
X: acoustic feature vector, W: word sequence
Acoustic Model
Phoneme: 언어학자가 정의한 기본 발음단위(옆의 발음에 따라 변함)
하나의 phoneme도 그 음을 처음 발음하는 처음 / 중간 / 끝날 때 frame에서의 발음이 다름
- mono-phone: 통째로 모델링
- tri-phone: 3 state로 나누어서 모델링
각 부분은 비교적 일정한 주파수 특성을 보임
앞부분과 뒷부분은 이어지는 발음에 따라 달라짐(context dependent)
수많은 triphone을 줄여서 수천 개로 만듦(CD-triphone states)
Gaussian Mixture Model(GMM)
특정 phoneme에서 특정 feature가 나올 확률 모델링하는 방법
Hidden Markov Model(HMM)
참고
현재 어떤 state인지 불확실한 상태에서 소리의 확률분포(GMM)을 이용하여 triphone state를 추정
triphone의 종류별로 HMM을 학습(phoneme이 40가지라고 했을 때, 40x40x40개의 HMM)
feature vector를 모든 HMM에 넣어보고 확률이 높은 phone 쪽으로 pruning 해가면서 phone의 배열을 완성해나가는 방법
Language Model(LM)
Text 또는 말에서 다음 나올 단어(or 글자)의 확률을 예측
엉터리 발음도 LM을 이용해 오류를 수정
- Word-level / Character-level / Word-piece(단어를 구성하는 1000~10000개의 word-piece)
LM의 훈련은 text corpus(텍스트 집합)을 입력과 출력에 넣어 훈련(self-supervised) - N-gram LM / Neural-network NN
End-to-End(E2E) Speech Recognition
AM, LM, Lexicon 모듈구조의 조합이 아닌, audio -> text로 바로 연결되는 음성인식 방법
Connectionist Temporal Classification(CTC)
음성 데이터를 인코더로 처리해 softmax를 취하여, CTC 손실함수를 줄이도록 인코더를 학습해나가는 방식
input(audio: frame sequence)과 output(text: label sequence)의 길이가 다른 문제점을 blank label을 넣어서 해결
label(blank label 포함)들이 중복되어 나타날 수 있는 모든 path(π)를 고려해야 함
label간 dependency 없이 음성만 보고 label을 내놓음, 하지만 실제로는 label간 dependency가 존재함
※ DeepSpeech
- Batch Processing: 음성의 길이가 전부 다르기 때문에 뒤를 0으로 채움
- Convolution Subsampling: spectrogram을 이미지로 생각하고 convolution 적용
- CTC Head: 1-layer로 FC 구현하여 vocabulary size로 변환
- CTC loss: 가능한 모든 경로의 합을 구함
Neural Transducers(RNN-T)
Transcription network(acoustic modeling, encoder) + Prediction network(LM) with Joint network
conditional independency를 가정하지 않아 CTC와는 최적 경로 계산이 다름
Listen Attend & Spell(LAS)
참고
Listener: bidirectional LSTM encoder
Speller: attention을 사용해 출력하는 decoder
decoding 방법
- Greedy decoding: 해당 프레임에 가장 확률이 높은 label을 선택
성능이 안 좋음.. - Beam search: 가장 확률이 높은 k(beam width)개로 시작해서 다음 프레임은 k개로부터 뻗쳐 나온 k^2개 중 누적 확률이 높은 k개를 선택하는 방식으로 sequence를 선택
On-device Speech Recognition
서버가 아닌 단말기에서 음성 인식 수행
server-based는 응답 지연, privacy, server 비용 등의 문제가 있음
GPU를 쓰지 못하므로 memory bottleneck이 생김
-> model compression(fixed-point optimization, pruning, SVD transformation) / parallelization
LSTM이나 GRU같은 일반적인 RNN은 multi time-step processing이 불가능(계산이 순차적으로 이루어져야 함)
QRNN, SRU와 같은 Linear RNN으로 multi time-step processing이 가능해짐
하지만 QRNN은 long-term feedback만 존재하기 때문에 LSTM에 비해 성능이 떨어짐
-> 1D convolution으로 해결
실습
SpecAugment: spectrogram + augment
모델의 generalization, robustness를 위해 약간의 왜곡을 가해 input의 양을 불려주는 방법
- Frequency masking / Time masking