매거진 AI NOTE

목소리로 감정을 읽는 AI 개발기 #1

음성에서 감정을 찾을 수 있을까? (feat. wav2vec)

by dean
image.png


최근 AI 기술이 엄청난 속도로 발전하고 있다는 건 누구나 알고 있는 사실이다.

ChatGPT부터 이미지 생성 AI까지, 이제는 사람과 대화하고 그림을 그리는 AI도 낯설지 않다. 이런 상황에서 문득 "목소리에서도 사람의 감정을 정확히 읽어낼 수 있을까?" 하는 생각이 머릿속을 떠나지 않았다.

일상에서 우리는 상대방의 말투와 목소리 톤만으로도 기분을 쉽게 눈치챈다. 친구가 전화로 "괜찮아"라고 말하지만 사실 괜찮지 않은 걸 느끼는 것처럼 말이다. 하지만 AI가 사람의 음성만 듣고 정확히 감정을 구분할 수 있을까?

이 질문은 단순한 호기심을 넘어, 내가 직접 실험하고 싶었다.

이렇게 해서 "wav2vec"라는 음성 기반 딥러닝 모델을 활용하여 목소리 감정을 판단하는 모델을 테스트 하기로 마음먹었다. wec2vec은 음성 데이터를 인코딩하여 다양한 음성 기반 AI 태스크에 활용할 수 있게 해주는 강력한 딥러닝 모델이다.

이번 시리즈에서는 wav2vec을 활용하여 음성 데이터에서 감정을 읽어내는 AI를 어떻게 만들었는지, 그 과정과 결과를 세 편에 걸쳐 공유하고자 한다.

이번 첫 번째 포스팅에서는 개발 초기 단계에서 설정한 주요 가설들과, 이를 바탕으로 구성한 개발 및 테스트 환경, 그리고 다양한 사전 세팅 과정을 중심으로 소개하고자 한다.


개발 환경 및 데이터셋 구성

이번 포스팅에서는 프로젝트 진행을 위한 VM 환경 설정 및 사용한 데이터셋 정보를 정리하였다.


VM 환경 설정

CPU: 4 CPUs (2 cores)

메모리: 32 GB RAM

GPU: NVIDIA RTX 4090 (24GB)

GPU 드라이버 및 CUDA 환경: NVIDIA 드라이버 버전: 570.124.06 CUDA 버전: 12.8

Python 버전: 3.11

Frontend: Next.js 15


Dataset


AIHub 한국어 감정 표현 음성 데이터셋

오디오(WAV) 데이터 크기: 24 GB

메타데이터(CSV) 크기: 10 MB

대략 40,000여개


이 데이터셋은 음성 감정 인식 모델 학습 및 테스트를 위해 선정하였다



TensorBoard

image.png

TensorBoard는 딥러닝 모델의 학습 과정과 결과를 직관적으로 시각화하고 분석하기 위해 설치 및 활용하였다.



데이터셋 구조


image.png


감정 종류


sadness, angry, disgust, happiness, fear, neutral, surprise


감정 데이터 분포 및 가중치 설정


image.png 데이터셋의 감정 분포가 불균형하여 위와 같은 가중치를 적용하여 학습 성능을 높였다.



학습 방법에 대한 고민

AI를 학습할 때 두 가지 방법을 고민했다.


하나는 단일 감정 분류(singletask)이고, 다른 하나는 다중 감정 분류(multitask)이다.


단일 감정 분류 (Singletask)


단일 감정 분류 모델은 학습이 명확하고 결과 해석이 쉽다는 장점이 있다.

나는 우선 wav2vec 모델의 한글 해석 능력을 확인하고 빠르게 테스트하기 위해 라벨링된 데이터를 약 5,000개만 사용하여 학습했다. 이 방법을 선택한 이유는 간단히 감정 판단만 필요했고, 긴 학습 시간을 피하고 싶었기 때문이다.


하나의 대표 감정(emotion_1)만 예측

목적이 명확한 경우 (예: 고객 감정 판단)에 적합

결과 해석이 명확 (예: “이 음성은 Angry다”)



다중 감정 분류 (Multitask)

다중 감정 분류 모델은 다양한 감정과 감정의 강도(intensity)까지 함께 예측할 수 있어 더욱 현실적인 감정 표현이 가능하다. 감정은 종종 하나가 아닌 여러 개가 혼합되어 나타나기 때문에 이 방법을 통해 실제와 유사한 복합적 감정 표현을 다룰 수 있다.


emotion_1 ~ emotion_5와 각각의 intensity(강도)를 예측

감정의 혼합과 복합적 표현 가능 (예: “Angry 1, Neutral 0.5”)

실제 사람의 감정을 현실적으로 반영

부가 정보(situation, age, gender 등) 활용 가능


이 두 가지 형태의 학습 방법을 병행하면 더 정확하고 포괄적인 테스트 환경을 구축할 수 있다고 판단했다.



음성(STT)을 이용한 텍스트 기반 감정 분석


음성 데이터만으로는 감정의 의도까지 완벽하게 이해하기 어렵다는 한계가 있다.

wav2vec과 같은 음성 기반 모델은 톤과 속도, 억양 등 '표현' 요소만을 분석하기 때문이다. 하지만 실제 대화에서는 표현뿐만 아니라 말의 내용(텍스트)이 감정 분석에 중요한 역할을 한다.

텍스트를 활용하면 대화의 의미를 기반으로 더 정교한 감정 분석이 가능하다. 예를 들어 같은 어조라도 "정말 고마워"와 "정말 고마워?"는 텍스트가 주는 의미적 차이가 크다.

특히 질문과 답변 형태의 대화 구조에서 텍스트 기반 분석은 상황에 대한 반응을 보다 자연스럽게 분석할 수 있다. 질문자의 감정과 응답자의 말투를 결합해 분석하면 단순 음성 분석보다 더 깊은 맥락 이해가 가능하다.

결국, 음성 기반과 텍스트 기반의 분석을 함께 적용해야 최적의 감정 인식 성능을 얻을 수 있다. 두 가지 방법을 조합함으로써 정확도를 높이고, 사용자의 실제 반응과 감정을 더 잘 이해할 수 있을 것이다.


wav2vec 모델 선택


superb/wav2vec2-base-superb-er

https://huggingface.co/superb/wav2vec2-base-superb-er

외국어 음성 데이터 중심으로 학습된 모델

한국어의 미묘한 억양과 뉘앙스를 충분히 포착할까??

한국어 데이터로 파인튜닝하더라도 성능 향상에 한계가 있을것 같아서 바로 패스


wav2vec2-large-xlsr-korean

https://huggingface.co/kresnik/wav2vec2-large-xlsr-korean

한국어 음성 데이터를 기반으로 미리 학습된 모델

한국어의 특유한 억양과 톤을 효과적으로 반영 가능하다고함.

추가 파인튜닝 시 성능이 좋을것 같았음


FastAPI 모듈화 구조

api/
├── wav2emotion/
│ ├── singletask/
│ └── multitask/
└── stt2emotion/


이렇게 구조를 나눈 이유는

singletask,multitask 두 가지 모드를 동시에 테스트하면서 wav2vec 기반 감정 평가와 stt2emotion기반 결과값을 비교하고 분석해보고 싶었기 때문이다.


각기 다른 방식의 감정 인식 결과를 동일한 입력에 대해 비교함으로써, 어떤 접근 방식이 상황에 더 적합한지 판단할 수 있는 실험 환경을 만들고자 했다.

keyword