음성 인식(ASR): CTC · 인코더-디코더 · WER
CTC 빈칸 · 접기 규칙 · 전방 알고리즘과 Whisper 구조, WER 계산을 손으로 익히는 ASR 수업
먼저 알아야 할 것
다루는 내용
프레임과 글자의 정렬 문제를 CTC(빈칸 · 접기 규칙 · 모든 경로 확률의 합)와 인코더-디코더(Whisper) 두 방식으로 풉니다. 프레임 3개 예로 CTC 확률을 경로 나열과 전방 알고리즘으로 각각 구해 0.414로 같음을 확인하고, 탐욕 · 빔 디코딩을 비교합니다. Whisper의 입력 · 구조 · 680,000시간 데이터와 wav2vec 2.0 사전학습을 정리하고, 편집 거리로 WER · CER을 계산하며 정규화의 중요성을 다룹니다.
해설
음성 인식(ASR): CTC · 인코더-디코더 · WER
음성 인식(ASR, automatic speech recognition)은 로그 멜 스펙트로그램 같은 소리 표를 글자 줄로 바꾸는 일입니다. 어려운 점은 "몇 번째 프레임이 어느 글자인지" 정답이 없다는 것입니다. 이 수업은 그 문제를 푸는 두 방식 — 빈칸 기호로 모든 정렬을 더하는 CTC 와, 번역처럼 글자를 하나씩 생성하는 인코더-디코더(Whisper) — 를 손계산으로 익히고, 성능을 재는 WER 을 직접 구합니다.
| 항목 | 내용 |
|---|---|
| 참고 출처 | Hannun, 「Sequence Modeling with CTC」(Distill, 2017), Graves 외 CTC 원 논문(ICML 2006), Whisper 논문(arXiv 2212.04356), wav2vec 2.0 논문(arXiv 2006.11477), Hugging Face Audio Course 5단원(평가) |
| 트랙 · 수준 | 음성 · 중급 |
| 이 수업이 다루는 범위 | 정렬 문제, CTC의 빈칸과 접기 규칙, CTC 확률과 전방 알고리즘, 탐욕 · 빔 디코딩, 인코더-디코더 ASR(Whisper), 자기 지도 사전학습(wav2vec 2.0), WER · CER 계산과 정규화 |
들어가기 전에
- 소리를 숫자로: 샘플링 · 푸리에 변환 · 멜 스케일 — 입력인 로그 멜 스펙트로그램이 어떻게 만들어지는지
- 순환 신경망(RNN)과 LSTM 직관 — 프레임마다 출력을 내는 시퀀스 모델
- 언어 모델의 기본: 다음 토큰 예측 · 퍼플렉서티 · 샘플링 — 디코더가 글자를 하나씩 고르는 방식
- 어텐션만 있으면 된다 (트랜스포머) — Whisper의 몸체(선택)
한눈에 보기
- 프레임 수와 글자 수가 다를 때 생기는 '정렬 문제'를 설명할 수 있습니다.
- CTC의 접기 규칙(반복 합치기 → 빈칸 지우기)으로 경로를 글자로 바꿉니다.
- 프레임 3개짜리 예로 CTC 확률을 '모든 경로의 합'과 '전방 알고리즘' 두 방법으로 구해 같음을 확인합니다.
- Whisper가 무엇을 입력받아 무엇을 출력하는지, 어떤 규모로 학습했는지 압니다.
- 편집 거리로 WER을 계산하고, 정규화가 왜 필요한지 압니다.
1. 정렬 문제: 프레임은 많고 글자는 적다
직관(해설용 비유). 자막 담당자가 영상의 1초마다 "지금 무슨 글자가 들리는지" 적는다고 합시다. "안녕"을 1초 동안 말하면, 10 ms 프레임 기준 약 100칸에 글자 두 개를 나눠 적어야 합니다. 어느 칸부터 '안'이고 어디서 '녕'으로 바뀌는지는 아무도 알려 주지 않습니다. 학습 데이터에는 보통 "음성 파일 + 문장" 쌍만 있기 때문입니다.
두 가지 해법.
- CTC: 프레임마다 글자(또는 빈칸)를 하나씩 내게 하고, 정답 문장이 되는 모든 정렬의 확률을 더해 최대화합니다. 정렬을 몰라도 됩니다.
- 인코더-디코더: 소리 전체를 인코더로 읽은 뒤, 디코더가 어텐션으로 필요한 곳을 보며 글자를 하나씩 생성합니다. 정렬을 어텐션이 알아서 배웁니다.
CTC 원 논문(Graves 외, 2006)은 이전 방식(HMM과 신경망을 섞은 하이브리드)이 미리 잘라 둔 학습 데이터와 후처리를 필요로 했다는 점을 문제로 들고, RNN이 잘리지 않은 시퀀스에 바로 라벨을 붙이게 하는 방법으로 CTC를 제안했습니다.
2. CTC: 빈칸과 접기 규칙
단계.
- 글자 집합에 빈칸(blank) 기호 하나를 더합니다. 여기서는
-로 씁니다. - 모델은 프레임 마다 모든 기호의 확률 를 소프트맥스로 냅니다.
- 프레임마다 기호 하나씩 고른 줄을 경로(path) 라 합니다.
- 경로를 글자로 바꾸는 접기 규칙 : 연속된 같은 기호를 하나로 합치고, 그다음 빈칸을 모두 지웁니다.
숫자로 해 보기(해설용, 코드로 확인).
| 경로 | 반복 합치기 | 빈칸 지우기 | 결과 |
|---|---|---|---|
aa-b | a-b | ab | ab |
-ab- | -ab- | ab | ab |
abb- | ab- | ab | ab |
a-ab | a-ab | aab | aab |
마지막 줄이 빈칸의 진짜 역할입니다. 같은 글자가 두 번 나오는 단어(예: "hello"의 ll)는 사이에 빈칸이 있어야만 두 글자로 남습니다. 빈칸이 없으면 aa 가 a 로 합쳐져 버립니다. 원 논문 예로는 입니다.
확률 식. 원 논문 식 (2) · (3)은 다음과 같습니다.
| 기호 | 뜻 |
|---|---|
| 입력(프레임 개의 특징) | |
| 길이 인 경로(프레임마다 기호 하나) | |
| 프레임 에서 기호 의 확률 | |
정답 글자 줄(예: ab) | |
| 접으면 이 되는 모든 경로의 집합 |
학습 손실은 입니다. 프레임마다 출력이 서로 독립이라고 가정하기 때문에 경로 확률이 단순한 곱이 됩니다.
숫자로 해 보기 ① 모든 경로 더하기(해설용). 프레임 3개, 기호 {a, b, -}, 정답 ab. 모델 출력이 다음과 같다고 합시다.
| 프레임 | a | b | - |
|---|---|---|---|
| 1 | 0.5 | 0.2 | 0.3 |
| 2 | 0.3 | 0.4 | 0.3 |
| 3 | 0.1 | 0.6 | 0.3 |
길이 3인 경로 27개 중 ab 로 접히는 것은 다섯 개입니다.
| 경로 | 확률 |
|---|---|
aab | |
abb | |
ab- | |
a-b | |
-ab | |
| 합 |
3. 전방 알고리즘: 경로를 하나씩 세지 않기
문제. 프레임이 100개, 글자가 50개면 정렬 수가 대략 개라고 Distill 글은 예를 듭니다. 다 세는 것은 불가능합니다.
아이디어. 두 경로가 같은 시각에 같은 지점(정답의 같은 위치)에 와 있으면, 그 뒤의 계산은 똑같습니다. 그러니 지점별로 확률을 합쳐 두고 다음 프레임으로 넘깁니다(동적 계획법).
단계(원 논문 4.1절).
- 정답 사이사이와 양 끝에 빈칸을 넣은 줄 을 만듭니다.
ab→- a - b -(길이 ). - = "프레임 까지 보고 의 번째 위치에 와 있을 확률".
- 시작: 첫 프레임은 맨 앞 빈칸이나 첫 글자에서만 시작할 수 있습니다.
- 갱신: 같은 자리에 머물거나 한 칸 전진합니다. 빈칸을 건너뛰어 두 칸 전진하는 것은 지금 위치가 글자이고 두 칸 앞 글자와 다를 때만 허용합니다(같은 글자 사이 빈칸은 건너뛸 수 없음).
- 끝: .
숫자로 해 보기 ②(해설용, 코드로 확인). 위와 같은 출력으로 계산합니다. 열은 - a - b -.
- | a | - | b | - | |
|---|---|---|---|---|---|
| 1 | 0.300 | 0.500 | 0 | 0 | 0 |
| 2 | 0.090 | 0.240 | 0.150 | 0.200 | 0 |
| 3 | 0.027 | 0.033 | 0.117 | 0.354 | 0.060 |
예를 들어 의 b 칸은 "a 에서 빈칸을 건너뛰어 옴(0.5)"에 를 곱한 0.2입니다. 의 b 칸은 입니다. 끝: — ①과 정확히 같습니다. 계산량은 칸만큼이라 문장이 길어도 감당할 수 있습니다.
디코딩. 추론 때는 확률이 가장 큰 글자 줄을 찾아야 합니다.
- 탐욕(best path): 프레임마다 가장 큰 기호를 골라 접습니다. 위 예는
a(0.5) ·b(0.4) ·b(0.6) →abb→ab. 빠르지만, 여러 경로 확률이 합쳐 더 큰 다른 답을 놓칠 수 있습니다. - 빔 탐색(beam search): 접힌 결과(접두어) 몇 개를 후보로 유지하며 넓혀 갑니다. 외부 언어 모델 점수를 더해 "말이 되는 문장"을 고르게 할 수도 있습니다.
왜 CTC인가 · 한계. 프레임 단위 정답 없이 학습되고, 출력이 프레임과 함께 나와 실시간(스트리밍) 인식에 잘 맞습니다. 대신 프레임 출력이 서로 독립이라는 가정 때문에 앞뒤 글자 사이의 관계(맞춤법 · 문맥)를 스스로 잘 배우지 못해, 언어 모델과 함께 쓰는 경우가 많습니다.
4. 인코더-디코더 ASR: Whisper
직관. 번역 모델이 영어 문장을 읽고 한국어를 한 단어씩 쓰듯, 소리 표를 읽고 글자(토큰)를 하나씩 씁니다. 디코더는 앞서 쓴 토큰을 보고 다음 토큰을 예측하므로, CTC와 달리 언어 모델 능력이 모델 안에 들어 있습니다.
Whisper의 설정(원 논문 확인).
- 입력: 16 kHz로 다시 샘플링한 오디오를 25 ms 창 · 10 ms 홉의 80채널 로그 멜 스펙트로그램 으로 바꾸고, 30초 조각 으로 나눕니다.
- 구조: 인코더-디코더 트랜스포머. 인코더 앞에 필터 폭 3인 합성곱 층 두 개(GELU, 두 번째는 보폭 2)를 두고 사인파 위치 임베딩을 더합니다.
- 데이터: 인터넷에서 모은 680,000시간 의 '오디오 + 전사' 쌍(약한 지도, weak supervision). 그중 영어 외 96개 언어 음성이 117,000시간, 다른 언어 → 영어 번역이 125,000시간입니다.
- 멀티태스크: 특수 토큰으로 "언어 · 전사인지 번역인지 · 타임스탬프 여부"를 지정해, 한 모델이 여러 일을 합니다.
- 크기: Tiny(39M)부터 Large(1,550M)까지 다섯 크기(논문 표 1).
숫자로 해 보기(해설용). 30초 조각은 10 ms 홉으로 약 3,000프레임이고, 보폭 2인 합성곱을 지나면 인코더가 보는 길이는 약 1,500입니다. 어텐션 비용이 길이의 제곱에 비례하므로, 합성곱으로 길이를 절반으로 줄이면 점수 행렬 원소 수는 약 1/4이 됩니다.
왜 이렇게 했나. 사람이 꼼꼼히 다듬은 데이터는 수천 시간 규모가 한계였습니다. Whisper는 품질이 조금 떨어져도 양이 훨씬 많은 웹 데이터를 써서, 별도 미세조정 없이도(제로샷) 여러 데이터셋에서 잘 버티는 견고함을 노렸습니다.
5. 자기 지도 사전학습: wav2vec 2.0
전사가 없는 음성은 훨씬 구하기 쉽습니다. wav2vec 2.0(Baevski 외, 2020)은 음성 표현 일부를 가리고, 가린 자리의 '정답 조각'(양자화된 표현)을 가짜 후보들 사이에서 맞히는 대조 학습으로 먼저 사전학습한 뒤, 적은 전사 데이터로 CTC 미세조정을 합니다. 논문 초록은 전사 데이터 10분만으로(전사 없는 53k시간으로 사전학습) LibriSpeech에서 WER 4.8% / 8.2%(clean / other)를 보고했습니다. BERT의 '가리고 맞히기'를 소리에 옮긴 셈입니다.
flowchart LR
A[오디오 16 kHz] --> B[로그 멜 스펙트로그램]
B --> C[음향 인코더<br/>RNN · 트랜스포머 · 합성곱]
C --> D1[CTC 헤드<br/>프레임마다 글자 · 빈칸 확률]
D1 --> E1[탐욕 · 빔 디코딩<br/>접기 규칙]
C --> D2[디코더<br/>어텐션으로 토큰 하나씩 생성]
D2 --> E2[빔 탐색 · 특수 토큰<br/>언어 · 작업 지정]
E1 --> F[글자 줄]
E2 --> F
F --> G[정규화 후 WER 계산]6. 평가: WER과 CER
정의. 단어 오류율(WER)은 모델 출력을 정답으로 바꾸는 데 필요한 최소 편집 횟수를 정답 단어 수로 나눈 값입니다(편집 거리 = 레벤슈타인 거리).
| 기호 | 뜻 |
|---|---|
| 바꿔치기(substitution) 수 | |
| 빠뜨림(deletion) 수 | |
| 끼워 넣음(insertion) 수 | |
| 정답 문장의 단어 수 |
숫자로 해 보기(해설용, 코드로 확인).
- 정답: "내일 오전 열 시 회의"()
- 출력: "내일 오후 열 시 회의 있음"
- 오전 → 오후(S=1), '있음' 추가(I=1) →
Hugging Face Audio Course의 예("the cat sat on the mat" → "the cat sit on the")는 S=1, D=1로 입니다. 끼워 넣음이 많으면 WER은 100%를 넘을 수도 있습니다.
CER(문자 오류율). 같은 계산을 글자 단위로 합니다. 띄어쓰기가 없는 언어(중국어 · 일본어)나, 띄어쓰기가 흔들리는 한국어에서는 CER을 함께 보는 것이 공정합니다.
정규화가 왜 중요한가. "3시"와 "세 시", 대소문자, 문장 부호 차이까지 오류로 세면 모델의 실제 실력보다 WER이 크게 나옵니다. Whisper 논문은 이런 무해한 차이를 걸러 내는 텍스트 정규화기를 만들어 공개했고, Audio Course는 "표기 그대로 학습하고, 평가할 때만 정규화"를 권합니다. 서로 다른 논문의 WER을 비교할 때는 정규화 방식이 같은지 먼저 확인해야 합니다.
연습 문제
- 경로
-aa--b-b를 접으면?- 풀이: 반복 합치기 →
-a-b-b, 빈칸 지우기 →abb입니다.
- 풀이: 반복 합치기 →
- 프레임 2개, 기호 {a, -}, 출력 , 일 때 는?
- 풀이:
aa0.18 +a-0.42 +-a0.12 = 0.72 입니다.
- 풀이:
- 정답
aa를 프레임 2개로 낼 수 있나요?- 풀이: 없습니다. 두
a사이에 빈칸이 꼭 있어야 하므로 최소 3프레임(a-a)이 필요합니다.
- 풀이: 없습니다. 두
- 정답 "오늘 비가 온다"(3단어), 출력 "오늘 비 온다"일 때 WER은?
- 풀이: '비가' → '비' 바꿔치기 1개, 입니다.
- Whisper 학습 데이터 680,000시간 중 영어 외 음성 전사와 영어 번역을 뺀 나머지는 몇 시간인가요?
- 풀이: 시간(영어 전사에 해당)입니다(해설용 뺄셈).
스스로 점검
- CTC에 빈칸 기호가 없으면 어떤 문제가 생기나요?
- 답: 반복 합치기 때문에 같은 글자가 연달아 나오는 단어를 표현할 수 없고, 글자가 아닌 구간(쉼 · 전환)을 나타낼 방법도 없어집니다.
- 전방 알고리즘이 경로를 다 세지 않아도 되는 이유는?
- 답: 같은 시각에 정답의 같은 위치에 도달한 경로들은 이후 계산이 같으므로, 그 확률을 미리 합쳐 한 칸에 저장해도 결과가 같기 때문입니다.
- 같은 모델의 WER이 논문마다 다르게 보고될 수 있는 이유는?
- 답: 평가 데이터, 그리고 숫자 · 대소문자 · 문장 부호를 맞추는 정규화 방식이 다르면 같은 출력도 오류 수가 달라지기 때문입니다.
용어 정리
| 용어 | 쉬운 뜻 |
|---|---|
| 음성 인식(ASR) | 소리를 글자로 바꾸는 일 |
| 정렬(alignment) | 각 프레임이 어떤 글자에 해당하는지의 대응 |
| CTC | 빈칸 기호를 두고 모든 정렬의 확률을 더해 학습하는 방법 |
| 빈칸(blank) | '글자 없음'을 뜻하는 CTC의 특별 기호 |
| 접기 규칙 | 반복을 합치고 빈칸을 지워 경로를 글자 줄로 바꾸는 규칙 |
| 전방 알고리즘 | 위치별 확률을 합쳐 가며 전체 확률을 구하는 동적 계획법 |
| 탐욕 · 빔 디코딩 | 매번 최선만 고르기 · 후보 여럿을 유지하며 찾기 |
| 인코더-디코더 | 입력 전체를 읽고(인코더) 출력을 하나씩 생성(디코더)하는 구조 |
| 약한 지도 | 품질은 덜 다듬었지만 양이 많은 정답으로 학습하는 것 |
| 자기 지도 사전학습 | 정답 없이 데이터 자체로 만든 문제(가리고 맞히기)로 먼저 학습하는 것 |
| WER · CER | 단어 · 글자 단위 오류율(편집 횟수 ÷ 정답 길이) |
| 텍스트 정규화 | 평가 전에 표기 차이(숫자 · 대소문자 · 부호)를 맞추는 처리 |
더 깊이 보려면
- Distill 「Sequence Modeling with CTC」 — 정렬 그림과 빔 탐색을 시각적으로 설명합니다.
- Graves 외, 「Connectionist Temporal Classification」(ICML 2006) — 식 (2)~(7)과 전방 · 후방 알고리즘의 원형.
- Whisper 논문 2장(데이터 · 모델) · 3장(제로샷 평가) — 대규모 약한 지도의 효과.
- Hugging Face Audio Course 5단원 — 사전학습 모델로 전사하고 WER을 재는 실습.
다음에 볼 것
- 음성 합성(TTS)과 목소리 복제 — 같은 멜 스펙트로그램을 반대 방향으로: 글자에서 소리 만들기
- 어텐션만 있으면 된다 (트랜스포머) — Whisper 인코더 · 디코더의 몸체
라이선스
본문은 KAITABASE 자체 해설입니다. 참고 자료 Distill 글은 CC BY 4.0, Hugging Face Audio Course 저장소는 Apache 2.0입니다. CTC 출력표 · WER 예문은 이 수업을 위해 만든 해설용 예이며 코드로 계산을 확인했습니다.
출처
- Awni Hannun, Sequence Modeling with CTC, Distill, 2017: distill.pub/2017/ctc
- Alex Graves 외, Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks, ICML 2006: cs.toronto.edu/~graves/icml_2006.pdf
- Alec Radford 외, Robust Speech Recognition via Large-Scale Weak Supervision, 2022: arxiv.org/abs/2212.04356
- Alexei Baevski 외, wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations, 2020: arxiv.org/abs/2006.11477
- Hugging Face Audio Course, Evaluation metrics for ASR: huggingface.co/learn/audio-course/chapter…
AI 원리부터 이해하기 · 음성 모듈
음성 모듈 학습
이 글은 음성 모듈의 학습 자료입니다. 전체 3개 자료 중 2번째입니다.
출처·원문
원문 보기요약만