LLM에게 숫자 읽기를 맡기지 마라: Voice Pipeline에서 Rule이 모델을 이기는 곳

이 글은 한국어 전화 Voice Agent 현장 노트 7부작 중 2부다. 내가 리드했던 프로젝트 — 공공 서비스 전화 상담용 실시간 한국어 voice agent(STT → LLM → TTS) — 를 만들면서 겪은 일을 정리한다. 1부에서는 STT 평가가 나를 어떻게 속였는지를 다뤘다. 이번에는 LLM을 둘러싼 텍스트 이야기다: 들어오고 나가는 숫자, STT가 거의 맞게 듣는 이름, 그리고 LLM 호출이 latency를 감수할 만한 자리. 3월의 어느 금요일 새벽 2시 17분, TTS normalizer 버그 하나를 고쳤다. 27,000원 같은 금액을 “이, 칠, 공, 공, 공 원"처럼 한 자리씩 읽어 버리는 버그였다. 그리고 30분쯤 뒤, 한국어 숫자 읽는 rule을 손으로 짜는 건 그만두고 그 일을 LLM에게 넘겼다. 어차피 한국어는 내 regex보다 LLM이 더 잘하니까. (새벽 세 시를 앞둔 사람의 논리였다.) ...

2026년 6월 9일 · 9 분

STT 평가가 나를 속인 네 가지 방식: 실제 전화 통화 앞에 선 Whisper

이 글은 한국어 전화 Voice Agent 현장 노트 7부작 중 1부다. 내가 리드했던 프로젝트 — 공공 서비스 전화 상담용 실시간 한국어 voice agent(STT → LLM → TTS) — 를 만들면서 겪은 일을 정리한다. Whisper fine-tuning 시리즈가 모델을 어떻게 학습했는지를 다뤘다면, 이번 시리즈는 그 모델이 실제 통화를 만났을 때 벌어진 일에서 시작한다. 작년 말, 내 Whisper fine-tuning 곡선은 더 바랄 게 없을 만큼 예뻤다. 공개 한국어 8 kHz 전화망 corpus(AI Hub의 저음질 전화망 음성인식 데이터)의 held-out split에서 라운드마다 기록이 갱신됐다: CER 9.0% → 6.3% → 5.5% → fine-tuned large-v3-turbo의 3.8%. 손대지 않은 large-v3-turbo는 6.5%였다. 스스로 잡은 목표가 4% 미만이었으니 3.8%면 통과다. (그때는 꽤 뿌듯했다.) ...

2026년 5월 19일 · 9 분

Fine-Tuning이 진짜 효과가 있었나? Whisper 한국어 STT Evaluation과 Benchmarking

이 글은 한국어 STT를 위한 Whisper fine-tuning 3부작 중 3부다: Preprocessing → Training → Evaluation. 여기서는 fine-tuning한 모델이 정말 나아졌는지, 얼마나 나아졌는지를 측정한다. 1부는 전처리, 2부는 학습을 다뤘다. 학습이 끝난 모델은 그냥 디스크에 있는 checkpoint일 뿐이다. Training loss curve가 내려가는 걸 보고 기분이 좋을 수는 있지만, held-out data에 실제로 돌려서 CER, WER, category별 성능을 측정하기 전까지는 fine-tuning이 효과가 있었는지, 특정 도메인에서 오히려 망가졌는지, base model 대비 얼마나 좋아졌는지 알 수 없다. 이 글에서는 두 가지 script를 다룬다: 단일 모델 evaluation용 스크립트와, 여러 모델을 category별로 비교하는 benchmarking 스크립트. 엔지니어링 측면에서는 수천 개 audio sample, multi-GPU, 여러 model checkpoint를 I/O bottleneck이나 메모리 문제 없이 효율적으로 처리하는 데 초점을 맞췄다. ...

2026년 2월 19일 · 6 분

Precomputed Feature로 Whisper 학습하기: 한국어 STT Full Fine-Tune

이 글은 한국어 STT를 위한 Whisper fine-tuning 3부작 중 2부다: Preprocessing → Training → Evaluation. 여기서는 전처리된 dataset을 불러와 학습 루프를 돌린다. 1부는 전처리, 3부는 evaluation/benchmarking을 다룰 예정이다. Mel spectrogram과 tokenized label을 디스크에 저장해 두었다면, 다음은 이걸 training loop에 넣고 모델을 최적화하는 일이다. 말만 하면 간단한데, 막상 선택지가 쏟아진다. Full fine-tuning 할까 LoRA 할까? Learning rate랑 batch size는? Encoder-decoder에서 길이 다른 sequence는 어떻게 padding 하고, GPU 메모리를 낭비하지 않으면서 터지지 않게 할까? 이 글에서는 한국어 통화 음성에 대해 Whisper large-v3를 학습시킬 때 쓰는 training 설정과, 그 뒤에 있는 공학적 선택(trade-off)을 정리한다. ...

2026년 2월 15일 · 5 분

Mel Spectrogram을 매번 다시 계산하지 마라: Whisper Fine-tuning 전 데이터 전처리

이 글은 한국어 STT를 위한 Whisper fine-tuning 3부작 중 1부다: Preprocessing → Training → Evaluation. 이번 글에서는 data preprocessing pipeline을 소개한다. 2부와 3부에서는 각각 training loop과 evaluation/benchmarking을 다룰 예정이다. OpenAI의 오픈소스 STT 모델인 Whisper를 파인튜닝하는 과정에서 생각지 못했던 난관에 봉착했다. learning rate를 바꾸든, batch size를 키우든, 아니면 그냥 GPU가 OOM으로 터지든 — 학습을 돌릴 때마다 수십 시간을 원본 오디오 파일 처리에 쓰는 것이다. WAV 파일 로드, 16 kHz로 sample rate 변경, mel spectrogram 계산, 텍스트 tokenization로 구성된 이 전처리 과정은 매번 동일하다. 데이터는 전혀 바뀌지 않는데, 매번 데이터 준비에 드는 시간과 비용을 전부 지불하고 있었던 거다. (남몰래 줄줄 새는 EC2 대여료…) ...

2026년 2월 11일 · 5 분