POST

ASR의 근간 (1): 샘플링부터 멜 스펙트로그램, MFCC까지

파형에서 특징까지 — 인식 모델이 먹는 것

음성 인식 시스템의 성능 절반은 모델이 아니라 입력 표현에서 결정된다. 마이크가 받은 공기 압력의 시계열을 어떻게 신경망이 소화할 수 있는 형태로 바꾸는가 — 이 파이프라인(샘플링 → STFT → 멜 필터뱅크 → 로그 → (DCT))은 40년 넘게 다듬어진 결과물이고, 각 단계에 “왜”가 있다. 이 글은 그 왜들을 순서대로 짚는다.

1. 샘플링 — 연속을 이산으로

아날로그 신호 x(t)x(t)를 주기 T=1/fsT = 1/f_s로 찍으면 이산 신호 x[n]=x(nT)x[n] = x(nT)가 된다. 나이퀴스트-섀넌 표본화 정리가 이 과정의 안전 조건이다: 신호의 최고 주파수가 fmaxf_{max}일 때

fs>2fmaxf_s > 2 f_{max}

이면 원신호를 완전히 복원할 수 있고, 어기면 fs/2f_s/2 이상의 성분이 낮은 주파수로 접혀 들어오는 앨리어싱이 생긴다(그래서 샘플링 전에 anti-aliasing 저역 필터를 먼저 건다). 실무 수치의 근거가 여기서 나온다 — 전화 음성 8kHz(~3.4kHz 대역), 음성 인식 표준 16kHz(음소 구분에 필요한 대역 ~8kHz), 음악 44.1kHz(가청 한계 20kHz + 여유). 진폭 축의 이산화가 양자화(16-bit PCM이면 96dB 동적 범위)다.

2. DFT와 FFT — 주파수의 좌표계

길이 NN의 이산 신호를 주파수 성분으로 분해하는 것이 이산 푸리에 변환이다.

X[k]=∑n=0N−1x[n] e−j2πkn/N,k=0,…,N−1X[k] = \sum_{n=0}^{N-1} x[n]\, e^{-j 2\pi k n / N}, \quad k = 0, \dots, N-1

∣X[k]∣|X[k]|가 크기(스펙트럼), ∠X[k]\angle X[k]가 위상이다. 정직하게 계산하면 O(N2)O(N^2)인데, Cooley-Tukey의 FFT가 분할정복으로 O(Nlog⁡N)O(N \log N)으로 줄였다 — STFT를 실시간으로 돌릴 수 있는 것, 즉 아래의 모든 것이 실용이 되는 이유가 이 알고리즘 하나다. 관례상 NN을 2의 거듭제곱(512, 1024)으로 잡는 것도 FFT 효율 때문이다.

3. STFT — 비정상 신호를 창으로 썰기

음성은 비정상(non-stationary) 신호다 — 스펙트럼이 시간에 따라 변하는 것이 곧 내용이다. 전체 신호에 FFT를 한 번 걸면 “언제”가 사라진다. STFT는 신호를 짧은 프레임으로 썰고 각 프레임에 FFT를 건다:

X[m,k]=∑nx[n] w[n−mH] e−j2πkn/NX[m, k] = \sum_{n} x[n]\, w[n - mH]\, e^{-j 2\pi k n / N}

ww는 창 함수, HH는 hop(프레임 간격). ∣X[m,k]∣2|X[m,k]|^2를 시간-주파수 평면에 깔면 스펙트로그램이다. 설계 선택들의 이유:

  • 왜 25ms 프레임, 10ms hop인가: 음성은 20~30ms 안에서는 대략 정상이라고 볼 수 있고(성도 모양이 그보다 느리게 변한다), 그보다 길면 음소 경계가 뭉개지고 짧으면 주파수 해상도가 부족하다. hop 10ms(프레임 60% 중첩)가 초당 100프레임이라는 ASR의 표준 시간축을 만든다.
  • 왜 창 함수인가: 프레임을 그냥 자르면(직사각 창) 경계 불연속이 스펙트럼 누설(leakage)을 만든다. Hamming/Hann 창은 경계를 부드럽게 눌러 누설을 줄인다.
  • 시간-주파수 트레이드오프: 창 길이 NN이 길수록 주파수 해상도(fs/Nf_s/N)는 좋아지고 시간 해상도는 나빠진다 — 불확정성 원리의 신호처리 버전이며, 어떤 창을 골라도 피할 수 없다. 이 고정 해상도의 한계를 옥타브별로 다르게 가져가는 것이 wavelet/CQT(음악 쪽에서 중요 — MIR 글에서 다시)다.

4. 멜 필터뱅크 — 인간의 귀는 로그로 듣는다

STFT의 주파수 축은 선형이지만 인간의 피치 지각은 대략 로그다 — 100Hz와 200Hz의 차이는 크게 들리지만 7100Hz와 7200Hz는 거의 구분 못 한다. 이 지각 스케일을 근사한 것이 멜 스케일:

m=2595log⁡10 ⁣(1+f700)m = 2595 \log_{10}\!\left(1 + \frac{f}{700}\right)

멜 축에서 등간격인 삼각 필터 MM개(보통 40~80개)를 선형 주파수 축에 얹으면 — 저주파는 촘촘, 고주파는 성기게 — 멜 필터뱅크다. 파워 스펙트럼에 이 필터들을 내적하고 로그를 취하면 로그 멜 스펙트로그램이 된다. 로그를 취하는 이유도 지각이다: 소리 크기 감각은 로그(dB)이고, 로그는 곱셈성 채널 왜곡을 덧셈으로 바꿔 정규화(CMN)를 쉽게 만든다.

정리하면 멜 스펙트로그램을 쓰는 이유는 세 겹이다: (1) 지각 정렬 — 인간이 구분하는 만큼만 해상도를 배분해 513차 스펙트럼을 40~80차로 압축, (2) 통계적 안정 — 로그로 동적 범위 압축, (3) 태스크 적합 — 음소·화자 정보는 스펙트럼 포락선(envelope)에 있고 멜 필터뱅크가 그 포락선을 잘 요약한다.

5. MFCC — GMM 시대의 마지막 한 수

멜 로그 에너지 MM개는 이웃 필터끼리 강하게 상관되어 있다. GMM-HMM 시대에는 공분산을 대각으로 두는 것이 계산상 필수였고, 그래서 DCT(이산 코사인 변환)로 역상관시킨 것이 MFCC다:

cn=∑m=1Mlog⁡Emcos⁡ ⁣[πnM(m−12)]c_n = \sum_{m=1}^{M} \log E_m \cos\!\left[ \frac{\pi n}{M} \left( m - \tfrac{1}{2} \right) \right]

보통 하위 12~13개 계수만 남긴다(상위 계수는 포락선의 미세 요동 = 피치 성분이라 음소 인식엔 노이즈). 신호처리 관점으로는 “스펙트럼의 스펙트럼”, 즉 켑스트럼(cepstrum)의 멜 버전이고, 성도 필터(포락선)와 성문 여기(피치)를 분리하는 소스-필터 분해다. 여기에 시간 미분인 Δ, ΔΔ를 붙인 39차 벡터가 20년간 ASR의 표준 입력이었다.

그런데 딥러닝이 판을 바꿨다. DCT는 선형 변환이라 정보를 더하지 않고, 오히려 공간 구조(이웃 필터의 국소 상관)를 흩뜨린다 — CNN이 제일 잘 쓰는 바로 그 구조를. 신경망은 상관된 입력을 얼마든지 다루므로 역상관이 불필요해졌고, 그래서 현대 ASR(Conformer, wav2vec 이전의 지도학습 계열 포함)의 표준 입력은 MFCC가 아니라 80차 로그 멜 필터뱅크다. 요컨대 MFCC의 마지막 단계(DCT)는 모델(GMM)의 제약이 만든 산물이었고, 모델이 바뀌자 떨어져 나갔다.

6. 다음 단계 — 필터뱅크마저 배울 수 있는가

같은 논리를 한 칸 더 밀면: 멜 필터뱅크도 사람이 설계한 고정 변환인데, 이것도 데이터로 배우면 안 되나? 이 질문이 raw waveform 입력 계보다 — 첫 conv층을 학습 가능한 대역통과 필터(sinc 함수의 차)로 매개화한 SincNet, 그 위에서 화자 임베딩까지 end-to-end로 가는 RawNet. 흥미로운 것은 결과다: 배워보면 필터들이 멜과 비슷한 저주파 편중으로 수렴하되, 태스크에 따라 다른 곳(화자 인식이면 피치 대역)에 해상도를 더 배분한다 — 멜 스케일이 좋은 prior였다는 사후 증명과, prior보다 데이터가 낫다는 증명이 동시에 나온 셈이다. 이 긴장은 비전에서 ViT가 CNN의 inductive bias에 던진 질문과 정확히 같은 구조다.