음성으로 코딩하기 (7편) — 소리를 키워도 안 됐다: 무료 모델의 벽

인식이 자꾸 약하길래 "소리가 작아서 그런가?" 했어요. 그래서 음량을 키워봤죠. 그런데 키워도, 더 키워도 안 됐습니다. 결국 마주한 건 무료 모델의 천장이었어요.

지난 편 → 6편 — 한국어로 말했는데 영어로 알아듣는 이유

"소리가 작아서 그런가?" — 게인을 넣었어요

핀마이크가 USB라 윈도우 입력 볼륨은 이미 최대(100%)였어요. 마이크 부스트 같은 것도 없었고요. 그래서 소프트웨어로 소리를 키우는(게인) 기능을 넣었어요. 인식기에 들어가기 직전에 음량을 몇 배로 증폭하는 거죠.

키워도, 더 키워도 안 됐어요

게인을 1.5배, 3배, 5배까지 올려봤어요. 로그로 레벨이 실제로 올라간 것도 확인했고요. 그런데 정작 인식은…

게인 배수입력 레벨"긁어온" 인식
×1.5낮음즐거운 ❌
×3중간즐거운 ❌
×5원음 수준즐거운 ❌

소리를 원음 수준까지 키웠는데도 "긁어온"이 여전히 "즐거운"으로 틀렸어요. 여기서 깨달았죠. 음량은 범인이 아니었구나. whisper의 음향 모델은 생각보다 튼튼해서, 소리가 좀 작아도 알아듣긴 하더라고요. (재밌게도, 게인이 없어도 인식하던 걸 데이터가 보여줬어요.)

진짜 벽은 모델 자체였어요

그러면 "긁어온"은 왜 안 될까? 이건 음량이 아니라 whisper 모델이 그 발음을 잘 못 잡는 문제였어요. 비슷한 걸 하나 더 발견했죠.

"싶어요"라고 말하면 자꾸 "싶습니다"로 바꿔서 인식했어요. whisper의 디코더는 사실 언어모델이라, 학습한 데이터(뉴스·문어)에 격식체(-습니다)가 훨씬 많다 보니, 음향이 조금만 애매해도 더 익숙한 "-습니다"로 완성해버리는 거였죠.

즉 모델이 "내가 아는 그럴듯한 말"로 밀어붙이는 경향이 있었어요. 이건 소리를 아무리 키워도 안 바뀌는, 모델의 성격 같은 거였죠.

initial_prompt도 양날이었어요

"긁어온"을 힌트 목록(initial_prompt)에 넣어봤어요. 그랬더니 "긁어온"은 잘 잡혔는데, 이번엔 음향이 비슷한 "읽어온"이 "긁어온"으로 끌려갔어요. 한쪽을 세우면 다른 쪽이 희생되는 거죠. 만능 해결책은 없었어요.

결론 — 여기까지가 무료 모델의 천장

정리하면 이랬어요.

  • 음량(게인) 은 어느 선까지만 도움 — 결정타는 아님
  • whisper large-v3 는 무료로 쓰기엔 훌륭하지만, 애매한 발음을 "익숙한 말"로 밀어붙이는 한계가 있음
  • initial_prompt 는 도메인 단어엔 좋지만 유사어 충돌 시 양날

이 이상은 모델을 바꾸거나(유료·대형·파인튜닝), 인식 후 LLM으로 교정하는 별도의 큰 작업이 필요했어요. 무료 모델로 갈 수 있는 데까지는 온 거죠. 한계를 명확히 아는 것도, 다음 결정을 위한 수확이었어요.

다음 편

이제 인식 싸움은 일단락. 다음은 매번 켜기 귀찮던 걸 자동화하고, 설정을 코드 수정 없이 바꾸는 이야기. → 8편 — 매번 켜기 귀찮아서: 자동화와 설정 철학


(이전 편: 6편 — 한국어로 말했는데 영어로 알아듣는 이유)

댓글