15장. 듣는다는 것 — 오디오
이 장의 질문: 공기의 떨림이 어떻게 신경망의 입력이 되는가? 파형에서 스펙트로그램으로 가는 변환을 이해하면, 오디오가 "이미지"가 되어 앞 장들의 도구가 그대로 통한다 — 표현을 바꾸면 도구가 이식된다는 이 책의 주제를 가장 선명하게 보여주는 장이다.
전제: 13장(CNN). 짧은 장이다 — 4부의 숨 고르기로 읽어라.
소리의 정체
마이크가 기록하는 것은 공기 압력의 시간에 따른 변화 — 초당 수만 번(음성은 보통 16,000번) 측정한 숫자의 나열이다. 3초짜리 음성이면 48,000개의 숫자로 이루어진 1차원 벡터(파형) 다.
이걸 그대로 신경망에 넣으면 왜 곤란한가. 첫째, 너무 길다 — 몇 초에 수만~수십만 차원. 둘째, 더 본질적으로, 파형의 개별 숫자에는 의미가 거의 없다. 같은 "아" 소리도 시작 시점이 1000분의 1초만 밀리면 파형 숫자들이 완전히 달라진다. 우리가 소리에서 듣는 것은 개별 압력값이 아니라 어떤 높낮이(주파수)의 성분이 얼마나 들어 있는가다. 도와 솔을 구분하는 것은 파형 모양 암기가 아니라 진동수의 인식이다.
그렇다면 표현을 바꾸자 — 시간축의 압력 기록을, 주파수축의 성분 분석으로.
스펙트로그램: 소리의 악보
도구는 푸리에 변환이다. 깊은 수학은 필요 없고 역할만 정확히 알면 된다 — 어떤 신호든 여러 순수 진동(사인파)의 합으로 분해해, 각 주파수 성분의 세기를 알려주는 변환이다. 백색광을 프리즘에 통과시켜 무지개 성분으로 나누는 것의 소리 버전이라 생각하라.
다만 소리 전체를 한 번에 변환하면 "이 노래에 어떤 음이 나왔나"만 남고 언제 나왔는지가 사라진다. 그래서 잘게 나눈다 — 소리를 25밀리초짜리 짧은 창으로 잘라(그 정도면 소리가 거의 일정하다고 볼 수 있다) 창마다 푸리에 변환을 하고, 창을 10밀리초씩 밀며 반복한다. 결과를 쌓으면 가로축 = 시간, 세로축 = 주파수, 밝기 = 세기인 2차원 그림 — 스펙트로그램이 된다. 소리의 악보다. 실제로 사람의 발음, 새소리, 기계 이상음은 스펙트로그램에서 눈으로도 구별되는 무늬를 만든다.
관례상 두 가지 보정을 더한다. 주파수축을 사람 귀의 감도에 맞게 휘고(저음역을 세밀하게 — 멜 스케일), 세기에 로그를 씌운다(사람의 소리 크기 지각이 로그라서). 그렇게 만든 로그-멜 스펙트로그램이 음성 인식·오디오 분류의 표준 입력이며, 코드로는 몇 줄이다:
import torchaudio
wav, sr = torchaudio.load("speech.wav") # 파형: (1, 48000)
mel = torchaudio.transforms.MelSpectrogram(
sample_rate=16000, n_fft=400, # 25ms 창
hop_length=160, n_mels=80)(wav) # 10ms 보폭, 주파수 80구간
log_mel = (mel + 1e-9).log() # (1, 80, 시간프레임) — 2차원 '이미지'!표현이 바뀌면 도구가 이식된다
마지막 줄의 주석이 이 장의 전부다. 로그-멜 스펙트로그램은 80×T짜리 단채널 이미지다. 그리고 이미지가 된 순간, 4부 전반부의 무기고가 통째로 이식된다.
- 분류 — "이 소리가 유리 깨지는 소리인가?" → 스펙트로그램에 13장의 CNN을 그대로. 지역성 가정도 유효하다(음소는 시간-주파수 평면의 국소 무늬다).
- 증강 — 이미지의 자르기/가리기에 대응하는, 시간 구간·주파수 대역을 무작위로 가리는 기법(SpecAugment)이 표준.
- 전이학습 — 대규모 오디오로 사전학습된 몸통을 빌려 내 과제에 미세조정. 문법 그대로다.
새로운 이론이 거의 필요 없었다는 점을 음미하라. 어려운 일은 "소리를 어떻게 배울까"가 아니라 "소리를 어떻게 표현할까" 였고, 표현이 풀리자 학습은 기존 도구로 풀렸다. 이 패턴 — 좋은 표현으로 바꾸면 범용 도구가 통한다 — 은 9장의 XOR에서 시작해 다음 장의 언어(단어를 벡터로!)로 곧장 이어지는, 이 책의 등뼈다.
음성 인식: 정렬이라는 마지막 관문
말을 글로 바꾸는 음성 인식(STT)에는 고유의 난제가 하나 남는다 — 길이가 다르다. 3초 음성은 스펙트로그램 프레임 300개인데 출력은 글자 스무 자다. 어느 프레임이 어느 글자인지의 정렬 정보도 없다(레이블은 그냥 문장뿐이다). 고전적 해법(CTC — 프레임마다 글자 또는 '공백'을 출력하게 하고 가능한 모든 정렬을 한꺼번에 학습)이 있고, 현대적 해법은 5부에서 배울 "시퀀스를 통째로 읽고 시퀀스를 통째로 쓰는" 구조(인코더-디코더, 18장)다 — 오디오 인코더가 스펙트로그램을 읽고, 텍스트 디코더가 글자를 한 자씩 생성한다.
실무에서는 이 문제를 직접 풀 일이 드물다. 방대한 다국어 음성으로 사전학습된 공개 모델 Whisper가 사실상의 범용 해법이어서, 몇 줄로 실용 수준의 받아쓰기가 된다 — 코드랩 19에서 스펙트로그램 생성부터 Whisper 파이프라인, 오디오 분류기 직접 학습까지 한 번에 실습한다. 반대 방향(텍스트→음성, TTS)은 생성 모델의 영역이라 6부의 사상들이 쓰인다는 것만 알아 두자.
핵심 요약
- 소리는 1차원 파형이지만, 의미는 개별 압력값이 아니라 주파수 성분에 있다. 짧은 창으로 잘라 성분 분석을 쌓으면 시간×주파수의 2차원 그림 — 스펙트로그램(관례상 로그-멜)이 된다.
- 스펙트로그램은 이미지다 — CNN, 증강, 전이학습 등 4부의 도구가 그대로 이식된다. 어려운 것은 학습이 아니라 표현이었다.
- 음성 인식의 추가 난제는 입력·출력 길이가 다르고 정렬이 없다는 것 — 인코더-디코더(5부)로 풀리며, 실무는 사전학습 모델(Whisper)이 기본기.
스스로 점검
- 파형을 그대로 분류기에 넣기 어려운 이유를 "같은 소리, 미세하게 밀린 시작 시점" 사고실험으로 설명해 보라.
- 스펙트로그램의 창 길이를 25ms에서 250ms로 늘리면 시간 해상도와 주파수 해상도는 각각 어떻게 되는가? (직관으로 답해 보라 — 길게 들을수록 음높이는 정확해지고, 언제인지는 흐려진다.)
- "표현이 바뀌면 도구가 이식된다"의 사례를 이 책에서 두 개 이상 찾아 연결해 보라.
- 공장 설비의 이상음 감지 시스템을 설계한다면 — 입력 표현, 모델, 학습 데이터 확보 방안을 3문장으로 스케치해 보라.
다음 장에서
4부가 끝났다 — 4부 복습 퀴즈로 점검하라. 이제 이 책의 클라이맥스로 향하는 5부, 언어다. 이미지의 픽셀과 소리의 파형에는 그래도 숫자가 있었다. 그런데 "사랑"이라는 단어에는 숫자가 없다. 말을 숫자로 바꾸는 문제 — 그 해답인 임베딩은 아마 이 책에서 가장 아름다운 아이디어일 것이다.