소리는 공기의 떨림이다. 이 떨림을 일정한 간격으로 재고(표본화), 정해진 칸에 맞춰 적고(양자화), 짧게 잘라(창) 어떤 높이의 떨림이 섞였는지 나눈 뒤(푸리에 변환), 사람 귀처럼 낮은 소리를 더 촘촘히 보는 눈금으로 다시 묶으면(멜) 신경망이 읽는 숫자 행렬이 된다. 모든 소리는 이 페이지에서 직접 합성한다.
스피커 판이 앞뒤로 떨면 공기가 빽빽해졌다 성겨졌다를 되풀이하며 퍼져 나간다. 1초에 몇 번 떠는지가 음의 높이(주파수), 얼마나 크게 떠는지가 소리의 크기(진폭)다.
재는 횟수 ≥ 2 × 가장 높은 주파수Shannon, 1949
떨림을 제대로 담으려면 한 번 떠는 동안 적어도 두 번은 재야 한다. 1초에 fs번 재면 fs/2 Hz까지만 담을 수 있고(나이퀴스트 한계), 그보다 빠른 떨림은 엉뚱하게 느린 떨림으로 보인다(에일리어싱) [R1]. 사람 귀는 대략 2만 Hz까지 들어서 음악 CD는 1초에 44,100번 잰다. 전화는 말소리만 담으면 되어 8,000번을 쓴다. 이 페이지의 멜 스펙트로그램도 8,000번(8 kHz)을 쓴다. 그래서 4,000 Hz보다 높은 소리는 담지 못한다. 실제 녹음 장비는 표본화 전에 한계보다 높은 소리를 걸러 낸다.
잰 값은 소수점이 끝없이 이어지는 실수다. 저장하려면 정해진 칸 가운데 가장 가까운 칸으로 반올림해야 한다. b비트면 칸이 2b개다. 반올림하며 생긴 차이가 양자화 잡음이다.
말소리는 순간마다 바뀐다. 그래서 25 ms씩 잘라 조각마다 따로 분석하고, 10 ms씩 옮기며 반복한다. 자른 조각의 양 끝을 부드럽게 줄이는 곱셈이 "창"이다.
그냥 자르면 조각의 양 끝에서 값이 뚝 끊긴다. 푸리에 변환은 그 조각이 끝없이 되풀이된다고 보고 계산한다. 그래서 끊긴 자리의 급격한 변화가 원래 없던 주파수로 새어 나간다(누출). Hann 창은 0에서 1로 부드럽게 올라갔다 내려오는 곡선(0.5 − 0.5·cos)을 곱해 양 끝을 0으로 만든다. 그 대가로 봉우리가 조금 넓어진다. 25 ms·10 ms는 말소리 분석에서 흔히 쓰는 값이고, 과제에 따라 바꿔 쓴다.
어떤 소리든 높이가 다른 사인파들의 합으로 나타낼 수 있다. 푸리에 변환은 파형을 받아 "몇 Hz 성분이 얼마나 들어 있나"를 돌려준다. 프리즘이 흰 빛을 무지개로 나누는 것과 닮았다.
멜 = 2595 · log10(1 + Hz / 700)"도레미파" 1초 → 98 프레임 × 20칸
사람 귀는 낮은 소리의 작은 차이(100 Hz와 200 Hz)는 잘 구별하지만, 높은 소리의 같은 차이(3,000 Hz와 3,100 Hz)는 잘 구별하지 못한다. 멜 눈금은 낮은 주파수를 촘촘히, 높은 주파수를 성기게 나눈다. 푸리에 변환 결과(129칸)를 이 눈금의 삼각형 필터 20개로 묶고 로그(데시벨)를 취하면 멜 스펙트로그램이 된다. 위 식은 널리 쓰는 한 가지 정의다. 멜 눈금에 바탕을 둔 특징(MFCC)은 음성 인식에서 다른 특징보다 좋은 성능을 보여 오래 표준처럼 쓰였다 [R2].
멜 스펙트로그램은 "주파수 × 시간" 숫자 행렬이다. 신경망은 이것을 두 가지 방식으로 읽는다. 자세한 구조는 앞 편들에서 다뤘다.
두 코드 모두 Colab에 기본으로 설치된 라이브러리만 쓴다. "노트북(.ipynb) 내려받기" 후 Colab에서 파일 → 노트북 업로드로 열거나, 복사해서 새 노트북 칸에 붙여 넣는다.
표본화·양자화·창·푸리에 변환·멜 스펙트로그램을 라이브러리 없이 계산한다. 페이지의 숫자(에일리어싱 3 Hz, 누출 7.95% → 0.05%, 멜 칸 값)가 그대로 나온다. 내 데이터로 바꾸려면 SIGNAL과 FS를 바꾼다.
실무에서 쓰는 librosa로 같은 소리를 멜 스펙트로그램으로 바꾸고, 직접 만든 결과와 비교한다. 녹음 파일을 쓰려면 코드 안의 [내 데이터로 바꾸려면] 줄을 따른다(파일은 각자 준비).
ChatGPT, Qwen, Claude 같은 AI 도우미에 붙여 넣는 프롬프트다. "복사"를 누르면 프롬프트 뒤에 고른 코드가 함께 붙는다. 〔 〕 안을 내 상황으로 바꿔 쓰면 된다.
AI의 답은 출발점일 뿐이다. 제안된 논문·수치·라이브러리 함수는 반드시 원문과 공식 문서로 확인한다. 공모전·논문에 AI 도움을 받았다면 주최 측과 학술지의 규정에 따라 사용 사실과 범위를 밝힌다.
본문의 노란 점선 밑줄과 같은 사전이다. 시리즈 전체에서 같은 표기를 쓴다. 섹션 이름을 누르면 처음 나온 곳으로 간다.
비유는 이해의 첫걸음이지만 오해의 씨앗도 된다. 초파리·뇌 비유에는 강도를 표시했다. 직접 실제로 같은 일을 한다는 근거가 있음 · 부분 일부 성질만 닮음 · 없음 대응하는 것이 알려지지 않음
| 개념 | 일상 비유 | 초파리·뇌 비유 | 비유가 틀리는 지점 |
|---|---|---|---|
| 표본화 | 달리는 사람을 1초마다 사진 찍기 | 부분 초파리 겹눈도 정해진 속도로만 밝기 변화를 따라간다 | 사진은 순간을 찍지만, 표본은 정해진 간격의 값일 뿐이다. 간격보다 빠른 움직임은 엉뚱하게 보인다(에일리어싱) |
| 양자화 | 키를 1 cm 눈금 자로 재기 | 없음 | 자의 눈금은 고르지만, 실제 오디오는 비트 수에 따라 눈금이 정해진다 |
| 창 | 사진 가장자리를 흐리게 처리하기(비네팅) | 없음 | 창은 보기 좋으라고가 아니라, 잘린 끝이 만드는 가짜 주파수를 줄이려고 곱한다 |
| 푸리에 변환 | 프리즘이 빛을 무지개로 나누기 | 직접 사람 달팽이관은 위치마다 다른 높이의 소리에 반응해 소리를 높이별로 나눈다 | 달팽이관은 시간에 따라 계속 나누고 크기 변화에 비선형으로 반응한다. 푸리에 변환은 잘라 낸 조각 하나를 한 번에 계산한다 |
| 멜 눈금 | 피아노 건반: 높이가 두 배가 될 때마다 같은 간격 | 부분 사람이 느끼는 음 높이 간격 | 멜 식은 여러 가지가 있고, 사람마다 듣는 방식도 다르다. 이 페이지의 식은 널리 쓰는 한 가지일 뿐이다 |
| 멜 스펙트로그램 | 악보: 시간(가로) × 음높이(세로) | 없음 | 악보는 음표 하나하나를 적지만, 스펙트로그램은 배음과 잡음까지 모든 에너지를 칸마다 적는다 |
E-1 저자 소개 · E-2 학술 레퍼런스 · E-3 그림 참고 자료
모든 소리는 페이지에서 합성했다(녹음 없음).
강사, 실무 OJT 담당자, 튜터를 위한 운영 안내다. 시간은 예상치이므로 실제 수업에 맞춰 조정한다.
| 대상 | 음성·소리 데이터(콜센터 녹음, 설비 소음, 음성 명령)를 다루려는 대학생·실무자 |
|---|---|
| 선수 지식 | 사인 곡선과 로그. 3-3의 "사진은 숫자 격자"를 알면 섹션 6·7이 쉽다 |
| 학습 목표 | ① 표본화·양자화가 무엇을 잃는지 숫자로 설명한다 ② 창·푸리에 변환·멜 필터를 거쳐 소리가 행렬이 되는 과정을 순서대로 설명한다 ③ 멜 행렬을 CNN·순서 모델이 읽는 두 방식을 구별한다 |
| 예상 시간 | 읽기 35~45분 · 애니메이션·소리 시연 20분 · Colab 실습 25분 (코드 1 15분, 코드 2 10분) |
도입 5분(섹션 1 소리 듣기) → 섹션 2 에일리어싱 10분 → 섹션 3 비트별 소리 비교 10분 → 섹션 4·5 15분 → 섹션 6 숫자 행렬 5분 → 확인 문제 5분.
섹션 2·3을 우리 장비의 녹음 사양(표본화 주파수·비트)과 대조 15분 → 섹션 4~6 25분 → 코드 2에 자기 녹음 파일 넣기 30분 → "우리 데이터는 CNN형일까 순서형일까" 토론 20분.
입문자는 섹션 1·2·5·6만. 중급자는 코드 1의 mel_filterbank를 손으로 한 칸 계산하게 하고, 페이지의 필터 삼각형 그림과 대조한다.
| 섹션 | 멈춰서 물어볼 질문 | 조작 팁 |
|---|---|---|
| 1 떨림 | "440 Hz는 220 Hz보다 몇 배 빨리 떨까? 어떻게 들릴까?" | 두 음을 차례로 들려준다(소리가 나지 않으면 기기 음량 확인) |
| 2 표본화 | "1초에 8번 재면 왜 3 Hz로 보일까?" | 50 → 12 → 8번 순서로 누른다 |
| 3 양자화 | "3비트 소리와 16비트 소리는 무엇이 다르게 들릴까?" | 3비트와 16비트로 각각 들려준다 |
| 4 자르기·창 | "그냥 자르면 왜 없던 주파수가 생길까?" | 직사각형 ↔ Hann을 번갈아 누르며 아래 그래프의 치맛자락을 본다 |
| 5 푸리에 변환 | "같은 '도'인데 피아노와 바이올린은 왜 다르게 들릴까?" | 순음 → 악기음 순서로 들려주고 봉우리 수를 비교한다 |
| 6 멜 스펙트로그램 | "1초 소리가 몇 개의 숫자가 되었나?" | 도 → 파 프레임을 눌러 가장 밝은 칸이 위로 옮겨 가는 것을 본다 |
| 7 모델이 읽는 법 | "초인종 소리 분류와 받아쓰기는 어떤 방식이 어울릴까?" | 두 방식을 번갈아 누른다 |
| 오해 | 바른 설명 | 보여 줄 장면 |
|---|---|---|
| 많이 잴수록 언제나 좋다 | 담고 싶은 가장 높은 주파수의 2배면 충분하다. 그 이상은 저장 공간만 늘린다 | 섹션 2의 12번(5 Hz는 담김) |
| 비트가 적으면 소리가 작아진다 | 크기가 아니라 잡음이 커진다. 비트 하나에 약 6 dB씩 깨끗해진다 | 섹션 3 |
| 푸리에 변환은 소리 전체를 한 번에 분석한다 | 짧은 조각(프레임)마다 따로 한다. 그래서 시간에 따른 변화를 볼 수 있다 | 섹션 4·6 |
| 스펙트로그램은 그림이니 사진처럼 다뤄도 된다 | 가로(시간)와 세로(주파수)의 뜻이 다르다. 세로로 옮기면 다른 소리가 된다 | 섹션 7 |
| 멜 스펙트로그램은 소리를 그대로 담는다 | 위상과 섬세한 주파수 정보를 버리고 줄인 요약이다(8,000 → 1,960) | 섹션 6 숫자 요약 |
8,000 ÷ 2 = 4,000 Hz(나이퀴스트 한계).
|5 − 8| = 3 Hz. 한계(4 Hz)를 넘어 에일리어싱이 생긴다.
6.02 × (16 − 8) ≈ 48 dB. 이론값은 49.92 dB와 98.08 dB다.
(8,000 − 200) ÷ 80 + 1 = 98개(소수점 버림 후 1을 더함).
1,960개. 8,000 ÷ 1,960 ≈ 4.1, 약 4분의 1이다.
코드 1의 NMEL을 20에서 40으로, FRAME을 200에서 400으로 바꾼다. 멜 행렬의 크기와 그림이 어떻게 달라지는지, 시간 해상도와 주파수 해상도의 맞바꿈과 연결해 세 문장으로 쓴다.
자기 목소리나 설비 소리를 직접 녹음한 파일로 코드 2를 실행한다(파일은 각자 준비, 개인정보 주의). 같은 소리를 두 번 녹음해 멜 행렬이 얼마나 비슷한지 상관계수로 비교하고, 무엇이 차이를 만드는지 쓴다.
| 입문자 | 섹션 3·4는 건너뛰어도 흐름이 끊기지 않는다. 섹션 1·5의 소리 듣기를 꼭 해 본다 |
|---|---|
| 심화 | 창 길이·간격·멜 칸 수가 인식 성능에 미치는 영향을 조사하게 한다. 조사한 논문은 원문으로 확인한다 |
| 더 배우기 | 안상선, 「비즈니스를 위한 데이터 과학」 강의안 (데이터 과학 전반) · STEP [K-디지털] 인공지능 자연어 처리 (3-5·3-8과 연결) · STEP [K-디지털] 핀테크 데이터 분석 기초 (3-6과 연결) |
| 강사용 자료 | 확인 문제의 채점 기준과 과제 예시 답안은 교육자용 정답 페이지 (3-4)에서 볼 수 있다 |
「3-4 음성」 편을 끝까지 읽었어요. 연구실 식구들이 한마디씩 정리해 드립니다.