음성으로 코딩하기 (3편) — 인식이 안 되던 진짜 범인은 마이크였다

음성으로 코딩을 시작하고 가장 답답했던 건, 말을 해도 엉뚱하게 알아듣는 거였어요. 처음엔 "모델이 별로인가?" 했는데, 범인은 전혀 다른 데 있었습니다.

지난 편을 안 보셨다면 → 음성으로 코딩하기 (2편) — 듣기는 쉬운데 왜 말하기가 어려울까

처음엔 모델을 의심했어요

STT(음성→텍스트)로 faster-whisper의 large-v3를 쓰고 있었어요. 꽤 정확하다는 모델인데도 자꾸 틀리니까, "더 큰 모델을 써야 하나?", "코드가 뭔가 잘못됐나?" 하고 그쪽만 파고들었죠.

그런데 아무리 코드를 만져도 인식률이 안 올라갔어요. 뭔가 다른 데 원인이 있다는 뜻이었죠.

avg_logprob라는 숫자를 들여다봤어요

whisper는 인식 결과와 함께 avg_logprob라는 값을 줘요. 쉽게 말하면 "내가 이 인식을 얼마나 확신하는가" 예요. 0에 가까울수록 확신(좋음), 마이너스로 클수록 불확실하다는 뜻이죠.

이걸 로그로 찍어보니 제 발화가 대부분 −0.6~−0.9 언저리였어요. 모델이 "잘 모르겠는데 대충 이거"라고 답하고 있었던 거예요. 그러면 문제는 모델이 아니라 모델에게 들어가는 소리 자체일 수 있겠다 싶었죠.

블루투스 마이크가 사실은 통화용이었어요

제가 쓰던 건 QCY 블루투스 이어폰의 마이크였어요. 여기서 핵심을 알게 됐습니다. 블루투스 마이크는 통화용 프로파일(HFP)로 동작하는데, 이게 8~16kHz로 압축된 저음질이에요. 음악 들을 때(A2DP)는 고음질인데, 마이크로 말할 때는 통화 수준으로 확 떨어지는 거죠.

즉 제 목소리가 whisper에 닿기도 전에 이미 뭉개져 있었던 거예요. 아무리 좋은 모델도 뭉개진 소리는 못 살립니다.

데이터로 범인을 잡았어요

가설을 확인하려고, 음질만 다른 마이크로 같은 말을 A/B로 녹음해 avg_logprob를 비교했어요.

마이크방식avg_logprob (0에 가까울수록 좋음)
QCY (블루투스)HFP 통화용 압축−0.64
WO Mic (폰 → USB, 진단용)압축 없음−0.27

코드는 한 줄도 안 바꿨는데, 마이크만 바꿨더니 확신도가 확 올라갔어요. 범인 확정. 음질이 인식률의 천장이었던 거죠.

4만 원짜리 핀마이크가 답이었어요

그래서 2.4GHz 무선 핀마이크를 샀어요. 39,900원. 이게 왜 좋냐면:

  • 블루투스가 아니라 2.4GHz 전용 무선이라 HFP 압축이 없어요 (USB급 음질)
  • 핀(라발리에) 형이라 입 근처에 있어 신호 대 잡음비(SNR)가 높고
  • USB 수신기라 꽂으면 바로 인식 (드라이버·앱 불필요)

결과는 avg_logprob −0.12. QCY(−0.64)와는 비교가 안 됐어요. 서서, 손 자유롭게 쓰기에도 딱이었고요.

교훈 — 소프트웨어 튜닝 전에 입력부터

이 삽질의 교훈은 명확했어요. 모델·코드를 붙잡기 전에 입력(마이크) 음질부터 확인하라. AI(Claude)는 "코드 이렇게 고쳐봐"는 잘 제안했지만, "애초에 마이크가 통화용이라 소리가 뭉개진 거 아니야?" 는 결국 제가 데이터를 뽑아 직접 확인해야 했죠.

다음 편

마이크를 바꿨더니, 이번엔 "끊긴 줄 알았다" 는 새로운 지옥이 열립니다. 멀쩡한 마이크를 죽었다고 오판하던 이야기. → 4편 — 멀쩡한 마이크를 죽었다고 오판한 이유


(이전 편: 2편 — 듣기는 쉬운데 왜 말하기가 어려울까)

댓글