Chapter 1. 음성 인식을 위한 특징 추출 과정
현대 음성 인식 시스템은 사람의 말을 단순히 녹음된 파형으로 처리하지 않습니다.
기계가 이해할 수 있는 정보로 바꾸기 위해, 음성 파형은 여러 단계를 거쳐 고차원적인 특성(feature)으로 변환됩니다.
이 절에서는 그 대표적인 절차인 Log-Mel Spectrogram 추출 과정을 순서대로 설명합니다.
1. Pre-emphasis: 고주파 강조를 통한 자음 명료화
사람의 목소리는 일반적으로 저주파(낮은 소리)가 강하게 포함되어 있으며, 고주파(높은 소리)는 상대적으로 약한 편입니다.
그러나 자음이나 미세한 발음 구분은 주로 고주파 대역에 위치하므로, 이를 살려주는 것이 인식 성능에 도움이 됩니다.
Pre-emphasis는 바로 이러한 고주파를 강조하는 기법입니다. 이 기법은 각 시점의 파형 값에서 그 직전 값을 일정 비율로 줄여 뺌으로써, 변화가 큰 부분을 더 두드러지게 만듭니다. 구체적으로는 다음과 같은 연산을 수행합니다.
여기서 α는 일반적으로 0.97 정도로 설정되며, x[n]은 현재 샘플, x[n−1]은 이전 샘플을 의미합니다.
이 연산은 파형의 변화량을 계산해주는 효과가 있으며, 변화가 크다는 것은 진동이 빠르다는 뜻, 즉 고주파 성분이라는 의미입니다.
이렇게 전처리된 파형은 이후 단계에서 고주파의 특성이 잘 살아 있도록 돕습니다.
2. Mel-Spectrogram: 시간과 주파수로의 변환
Pre-emphasis가 끝난 파형은 여전히 시간에 따라 진동하는 1차원 데이터입니다.
이를 기계가 더 잘 처리할 수 있도록 주파수 영역으로 변환합니다. 이때 사용되는 것이 바로 Mel-Spectrogram입니다.
변환 과정은 다음과 같은 순서로 진행됩니다:
- 먼저 음성 데이터를 약 25ms 길이의 짧은 구간으로 나누고, 각 구간마다 FFT(Fast Fourier Transform)를 적용하여 주파수
성분을 추출합니다. - 추출된 주파수 정보를 인간의 청각 구조에 맞게 다시 배치하기 위해, Mel Filter Bank를 사용해 주파수 축을 압축합니다.
- 이렇게 생성된 각 구간의 Mel 주파수 벡터들을 시간 순서대로 나열하면, 2차원 형태의 시간-주파수 데이터,
즉 Mel-Spectrogram이 됩니다.
Mel-Spectrogram은 세로축에 주파수(대개 80개 Mel Band), 가로축에 시간 프레임이 위치하는 그림처럼 표현됩니다.
이것은 기계에게 "이 시간에 어떤 주파수가 얼마나 포함되어 있었는지"를 시각적으로 알려주는 역할을 합니다.
3. Log-Scaling: 음량 차이의 균형 조정
사람의 음성은 구간에 따라 크기가 다릅니다.
예를 들어, 어떤 단어는 크게, 어떤 단어는 작게 말할 수 있고, 자음은 보통 음량이 작습니다.
이러한 차이가 크면 기계가 작은 소리를 무시할 수 있기 때문에, 소리의 크기 차이를 줄여주는 과정이 필요합니다.
이를 위해 각 Mel-Spectrogram 값에 로그 함수를 적용합니다.
일반적으로 다음과 같은 수식이 사용됩니다:
여기서 ε는 0에 가까운 값으로, x가 0이 되는 것을 방지합니다.
로그 함수를 적용하면, 큰 값은 상대적으로 줄어들고 작은 값은 비교적 유지되어, 전체적으로 값의 범위가 압축됩니다.
이러한 값은 모델이 학습할 때 더욱 안정적인 입력으로 작용하게 됩니다.
4. CMN (Cepstral Mean Normalization): 평균 중심화로 환경 차이 보정
음성 데이터는 녹음 환경이나 마이크 위치 등에 따라 전체적인 음량이 다를 수 있습니다.
이로 인해 같은 사람이 같은 말을 해도, 파형의 크기가 다르게 기록될 수 있습니다.
이를 보정하기 위해, Mel-Spectrogram의 각 주파수 차원에 대해 시간 축 평균을 빼는 정규화(CMN)를 수행합니다.
구체적으로는, 각 주파수 줄에 대해 다음과 같은 연산이 이루어집니다:
이 과정은 전체적인 음량의 차이를 없애주며, 모델이 "말한 내용"이나 "화자의 특성"에 집중할 수 있도록 도와줍니다.
최종 결과: 입력 데이터는 ‘음성 이미지’가 된다
이러한 일련의 전처리 과정을 거치면, 원래는 1차원 오디오 신호였던 음성 데이터가
[80(주파수) × 약 300(시간)] 정도의 2차원 벡터로 변환됩니다.
이 데이터는 구조상 이미지와 유사하며,
기계는 이 이미지처럼 생긴 음성 특징 맵을 기반으로 화자가 누구인지, 혹은 무엇을 말했는지를 판단하게 됩니다
Chapter 2. 사람 귀를 닮은 음성 인식: Mel Scale과 Mel Filter Bank
기계가 인간의 음성을 이해하려면, 음성 파형을 기계가 처리 가능한 수치적 특징(feature)으로 바꾸어야 합니다.
이때 가장 널리 사용되는 방식 중 하나는 사람의 청각 구조를 모방한 Mel Scale과,
이를 기반으로 주파수를 나누는 Mel Filter Bank입니다.
이 장에서는 Mel Scale의 정의부터 Mel Filter Bank의 구조까지, 그 작동 원리와 의미를 설명합니다.
1. 사람 귀는 ‘주파수’를 어떻게 듣는가?
실제 vs 인지
사람은 일정한 간격으로 증가하는 주파수를 등간격으로 듣지 않습니다.
- 예를 들어, 200Hz와 300Hz는 매우 다른 소리로 들리지만
- 7000Hz와 7100Hz는 거의 차이를 느끼지 못합니다.
즉, 사람은 저주파에는 민감하고, 고주파에는 둔감합니다.
이러한 감각적 특성을 수학적으로 모델링한 척도가 바로 Mel Scale입니다.
2. Mel이란?
“사람이 실제로 소리를 어떻게 지각(인지) 하는지를 수치화한 심리음향적 주파수 척도”
구분 | 내용 |
단위 | Mel (멜) |
변환 | 주파수(Hz) → Mel로 바꾸는 수식 |
mel(f)=2595×log10(1+f/700)
목적| 사람의 청각 감각(저주파에 민감, 고주파에 둔감)을 수학적으로 반영
특징| - 100Hz ~ 1000Hz: 거의 선형
- 1000Hz 이상: 점점 압축되어 변화량이 줄어듦
사용처| Mel Filter Bank, Mel-Spectrogram 등에서 주파수 분할 기준으로 사용
즉, Mel은 그냥 변형된 단위가 아니라,
"사람이 어떻게 소리를 듣는가"를 기계가 흉내 내기 위한 척도이다
3. Mel Scale: 심리음향적 주파수 척도
정의와 수식
Mel Scale은 주파수(Hz)를 사람이 느끼는 방식대로 재매핑한 척도입니다.
변환 수식은 다음과 같습니다:
mel(f)=2595×log10(1+f700)\text{mel}(f) = 2595 \times \log_{10}\left(1 + \frac{f}{700}\right)
이를 통해, 고주파로 갈수록 점점 압축된 단위로 인식하게 됩니다.
Hz (물리적 주파수) | Mel (지각적 척도) |
100 Hz | ≈ 150 Mel (≈ 98 Hz) |
500 Hz | ≈ 607 Mel (≈ 398 Hz) |
1000 Hz | ≈ 1000 Mel (≈ 678 Hz) |
2000 Hz | ≈ 1500 Mel (≈ 1074 Hz) |
4000 Hz | ≈ 2146 Mel (≈ 1602 Hz) |
8000 Hz | ≈ 2840 Mel (≈ 2347 Hz) |
4. Mel Filter Bank: Mel Scale을 나누는 방법
정의
Mel Filter Bank는 Mel Scale 기준으로 주파수 영역을 나눈 여러 개의 삼각형 필터 집합입니다.
주로 80개(n_mels=80)의 필터를 사용하며, 각 필터는 특정 Mel 주파수 대역의 에너지를 강조합니다.
필터의 구조
- 각 필터는 삼각형 모양입니다.
- 중심 주파수에서는 값이 1
- 양 옆으로 멀어질수록 선형적으로 0으로 감소
- 필터들은 서로 겹칩니다
- 하나의 주파수는 여러 필터에 동시에 영향을 줍니다.
이 구조는 특정 주파수만 단독으로 강조하는 것이 아니라, 부드럽게 스펙트럼을 나누는 역할을 합니다.
5. 왜 이렇게 나누는가?
사람 중심의 설계
사람은 낮은 주파수에서는 아주 세밀하게 구분하지만,
높은 주파수는 대략적으로만 인식합니다.
Mel Filter Bank는 이 특성을 반영해 다음과 같이 나뉩니다:
Band Index → [0]---[10]----[20]----[40]----[60]----[70]----[79]
- 저주파 구간: 좁고 많음 → 고분해능
- 고주파 구간: 넓고 적음 → 저분해능
이는 사람의 귀와 동일한 방식으로 정보를 요약하고 강조해 줍니다.
6. 시각적 정리
항목 | 설명 |
Mel scale | 사람의 주파수 인식 감각을 모방한 비선형 척도 |
변환 공식 | mel(f)=2595⋅log10(1+f700)\text{mel}(f) = 2595 \cdot \log_{10}(1 + \frac{f}{700}) |
Mel filter bank | Mel 단위로 나눈 주파수 영역 필터 (삼각형 구조) |
필터 개수 | 보통 80개 (n_mels=80) |
저주파 영역 | 사람 귀가 민감 → 촘촘하고 정밀하게 나눔 |
고주파 영역 | 사람 귀가 둔감 → 대략적으로 넓게 나눔 |
Overlap 구조 | 하나의 주파수는 여러 필터에 걸쳐 있음 |
사용 목적 | 기계가 사람처럼 들을 수 있도록 설계된 음성 특징 추출 방법 |
7. 실제 활용: Mel-Spectrogram 생성
Mel Filter Bank는 단독으로 쓰이지 않고, 다음과 같은 흐름으로 음성 전처리에 사용됩니다:
- Pre-emphasis: 고주파 강조 (y[n] = x[n] - α·x[n-1])
- STFT: 음성을 시간-주파수 영역으로 변환
- Mel Filter Bank 적용: 주파수 → Mel scale로 압축
- Log scaling: 소리 크기 차이 보정
- Mean normalization: 환경 간 음량 차이 제거
결과적으로 [80 × N] 크기의 Mel-Spectrogram이 생성되어, 음성의 시간/주파수 구조를 이미지처럼 표현할 수 있게 됩니다.
전처리 흐름에서의 데이터 표현 변화
1. 디지털 음성 (Raw waveform)
- 형태: Tensor shape: [T] (예: [16000] → 1초, 16kHz 샘플링)
- 내용: 마이크로부터 받은 소리의 진폭(진동 강도)을 시간 순서대로 나열한 1차원 실수 벡터
- 예시:
- [0.03, 0.06, -0.02, -0.05, 0.00, ...]
- 이 시점에서는 시간축만 존재합니다.
2. Pre-emphasis 적용
- 목적: 고주파 성분을 강조하여, 말소리의 특징을 더 잘 드러내기 위한 사전 필터링
- 수식:y[n]=x[n]−α⋅x[n−1](α≈0.97)y[n] = x[n] - \alpha \cdot x[n-1] \quad (\alpha \approx 0.97)
- 형태: 여전히 Tensor shape: [T] (1D)이지만, 고주파가 강조된 waveform
- 변화 예시:
-
원래: [0.03, 0.06, -0.02, -0.05, 0.00]
차분 후: [0.03, 0.03, -0.08, -0.03, 0.05]
- 결과적으로 파형의 변화가 두드러진 부분이 강조됩니다.
3. STFT 적용 (Short-Time Fourier Transform)
- 목적: 긴 waveform을 짧은 구간(window) 단위로 잘라서, 각 구간마다 FFT를 수행
→ 시간에 따라 주파수가 어떻게 변하는지 추적할 수 있음 - 윈도잉:
- win_length: 한 번에 자를 길이 (예: 400 → 25ms)
- hop_length: 다음 구간으로 얼마나 이동할지 (예: 160 → 10ms 겹치며 진행)
- 결과:
- 시간 프레임 수: T' ≈ (T - win_length) // hop_length
- 주파수 bin 수: n_fft // 2 + 1
→ 2차원 주파수 스펙트럼: [T', F]
STFT는 단일 FFT가 아니라, 슬라이딩하면서 FFT를 반복 적용하는 구조입니다
샘플링 레이트는 1초에 몇 개의 값을 뽑는지를 나타냅니다.
예를 들어:
- sample_rate = 16000 이면
→ 1초(1000ms) 동안 16000개의 진폭을 뽑습니다.
1ms 동안의 샘플 수:
16000 samples / 1000ms = 16 samples*ms
그럼 400개의 샘플은 몇 ms?
400 samples / 16samples*ms = 25ms
[ 98, 257 ] 형식의 행렬 취함
4. Mel-Spectrogram 추출
내부 과정
(1) 슬라이딩 윈도우로 waveform을 자른 후, 각 구간에 FFT(Fast Fourier Transform) 적용
→ 결과: [시간 프레임 수, 주파수 bin 수]
(2) FFT로 얻은 주파수 스펙트럼을 Mel Filter Bank에 통과시킴
→ 결과: [시간 프레임 수, Mel band 수]
(3) log 스케일 적용 + 평균 정규화
→ 훈련에 안정적인 형태로 변환
FFT를 하면 몇 개의 주파수 bin이 나올까?
- n_fft = 512면, 결과는 복소수 512개가 나와.
- 근데 실제로 유효한 주파수는 **0Hz ~ Nyquist 주파수(절반)**까지만 의미 있음.
그래서 결과의 절반까지만 사용
nfft2+1=5122+1=257\frac{n_{\text{fft}}}{2} + 1 = \frac{512}{2} + 1 = \boxed{257}
즉, FFT 결과에서 사용 가능한 bin 개수는 257개야.
이 257개 bin은 어떤 주파수를 나타내나?
- 우리가 다루는 전체 주파수 범위는:0 Hz ∼Nyquist=sample rate2=8000 Hz0 \text{ Hz } \sim \text{Nyquist} = \frac{\text{sample rate}}{2} = 8000 \text{ Hz}
- 그런데 이걸 257개 bin으로 나눈 것.
즉, bin 하나는:
Bin 해상도=8000 Hz257≈31.25 Hz/bin\text{Bin 해상도} = \frac{8000\ \text{Hz}}{257} \approx \boxed{31.25\ \text{Hz/bin}}
그래서 50Hz는 몇 번째 bin에 속하는가?
bin_index=5031.25=1.6\text{bin\_index} = \frac{50}{31.25} = \boxed{1.6}
그러면 이제:
필터 0을 만든다 = bin 1 ~ bin 13 사이에 삼각형 만들기
경계 | 역할 |
bin 1 | 좌측 점 (가중치 0부터 시작) |
bin 6 | 중앙점 (가중치 최대 1) |
bin 13 | 우측 점 (다시 0으로 감소) |
본격적으로: 이 구간에서 가중치(weight)는 어떻게 계산되나?
이건 그냥 삼각형 공식.
왼쪽부터 올라가고, 가운데에서 1이 되고, 오른쪽으로 내려오는 구조.
왼쪽 → 가운데 (bin 1 ~ 6)
여기선 가중치가 선형으로 증가:
weight=current_bin−leftcenter−left\text{weight} = \frac{\text{current\_bin} - \text{left}}{\text{center} - \text{left}}
예: bin 1, 2, 3, 4, 5, 6
bin | weight |
1 | 0 |
2 | (2-1)/(6-1) = 0.2 |
3 | (3-1)/(6-1) = 0.4 |
4 | 0.6 |
5 | 0.8 |
6 | 1.0 ← peak |
가운데 → 오른쪽 (bin 6 ~ 13)
이제는 선형으로 감소:
weight=right−current_binright−center\text{weight} = \frac{\text{right} - \text{current\_bin}}{\text{right} - \text{center}}
예: bin 6, 7, 8, ..., 13
bin | weight |
6 | 1.0 |
7 | (13 - 7) / (13 - 6) = 6/7 ≈ 0.857 |
8 | 5/7 ≈ 0.714 |
9 | 0.571 |
10 | 0.429 |
11 | 0.286 |
12 | 0.143 |
13 | 0.0 ← |
이 시점에서의 데이터 표현:
- 형태:
- T′T': 시간 프레임 수 (예: 25ms 창, 10ms hop → 약 100프레임/초)
- MM: Mel 주파수 개수 (예: 80 band)
-
Tensor shape: [T', M] # 예: [100, 80]
STFT 로 16kHz 기준 512 길이의 fft 적용시 [ 98, 257 ] 형태의 행렬 생성,
생성된 행렬을 mel scale 기준으로 mel filter bank 를 통해 mel band 를 추출
이 때, mel band 의 주파수 설정이 80 이라면 [98, 80] 의 형태로 축소된다.
- 내용:
- 각 시간 구간에서, 80개의 Mel 주파수 대역에 해당하는 에너지(강도) 값
- 이 값은 **사람의 청각 감각(Mel scale)**을 반영한 주파수 분해
- 예시 (부분):
-
lua[[2.3, 3.1, 4.5, ..., 1.2], ← 시간 프레임 0
[1.8, 2.9, 4.2, ..., 0.9], ← 시간 프레임 1
...
[0.5, 0.8, 1.1, ..., 0.4]] ← 시간 프레임 99
요약 정리표
단계 | 텐서 | 의미 | 변하는 점 |
Raw waveform | [T] (1D) | 시간에 따른 진폭 | 마이크 입력값 |
Pre-emphasis | [T] (1D) | 고주파 강조 | 급격한 변화가 더 강조됨 |
Mel-Spectrogram | [T', M] (2D) | 시간별 Mel 주파수 에너지 분포 | 2차원으로, 청각 기반 스펙트럼 |
결론 요약
- 전처리는 소리의 표현을 점점 더 풍부하게 바꾸는 과정입니다.
- 시간축만 있던 데이터가, 시간 + 주파수라는 2차원 정보로 확장됩니다.
- 여기서 FFT는 각 구간의 주파수를 추출하는 핵심 연산이며,
Mel Filter Bank는 사람의 청각 특성에 맞게 그 주파수 정보를 요약해줍니다
reference ChatGPT
'AI > NeXt-TDNN' 카테고리의 다른 글
ANN, DNN, RNN, TDNN (2) | 2025.07.21 |
---|---|
NeXt_TDNN (0) | 2025.06.25 |
화자 인식 모델 (1) | 2025.06.20 |