본문 바로가기
C.W.K.
Stream
Lesson 02 of 05 · published

조용한 영어 기본값

~11 min · language-forcing, whisperkit, gotcha, korean

Level 0불씨 없음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"모델이 한국어를 못한 게 아니었어. 아무도 그 오디오가 한국어라고 말 안 해줬어."

버그 신고

초기 Firekeeper 엔 치명적인 증상이 있었어. 한국어 받아쓰기가 쓰레기로 나온 거야. 말한 거랑 아무 상관 없는 영어스러운 단어 샐러드. 영어 받아쓰기는 멀쩡했고. 누가 봐도 나올 법한 결론, 'WhisperKit 이 한국어를 못해' 는 완전히 틀렸어. 그걸 쫓았으면 며칠 날렸을 거고. 진짜 원인은 디코딩 옵션에 묻혀 있던 기본값 하나였어.

기본값이 실제로 하는 일

WhisperKit 기본 DecodingOptionsusePrefillPrompt: true, language: nil, detectLanguage: false 야. 셋을 같이 읽으면 함정이 딱 보여. 프리필은 켜져 있고, 언어는 안 정해 놨고, 감지는 꺼져 있어. 그러니 디코더가 영어 언어 토큰을 미리 채워 넣고 다시는 되돌아보지 않아. 모든 발화가 영어로 강제 디코딩되는 거야. 한국어를 먹이면 한국어 소리를 영어 단어로 알아들으려고 최선을 다해. 그 출력은 한국어 전사가 실패한 게 아냐. 애초에 영어가 아니었던 오디오를 완벽하게 영어로 전사한 결과지.

usePrefillPrompt: true   +   language: nil   +   detectLanguage: false
            |                     |                        |
            v                     v                        v
   언어를 프리필함        네가 안 골랐음          자동 감지도 안 함
            \_____________________|________________________/
                                  v
              영어 토큰으로 기본값 -> 한국어가 영어로 디코딩됨

해법은 의도 한 줄

WhisperKit 한테는 항상 언어를 알려줘야 해. 방법은 둘이야. 아는 경우엔 language 를 "ko" 나 "en" 으로 명시하고, 오디오에서 알아내게 하고 싶으면 detectLanguage: true 를 두는 거지. 조용한 기본값은 절대 배포하지 마. Firekeeper 는 이걸 설정에서 언어 모드로 꺼내 놨어. Auto, 한국어, English. 그리고 Auto 는 '라이브러리 마음대로' 가 아니라 오디오 언어 감지에 연결돼 있고.

조용한 기본값이 시끄러운 실패보다 나빠. WhisperKit 이 언어가 애매할 때 에러를 던졌다면 이 버그는 몇 분 만에 잡혔을 거야. 대신 조용히, 그럴듯해 보이지만 틀린 일을 했지. 어떤 모델이든 감쌀 때는 기본값을 이 관점에서 살펴봐. 잘 풀리는 경우엔 '되는 것처럼' 보이면서 나머지 전부를 조용히 망치는 설정이 있는지.
난 이걸 'WhisperKit 은 더 나은 한국어 모델이 필요해' 로 정리할 뻔했어. 아빠 직감이 더 날카로웠지. "모델 문제라기엔 너무 확신에 차 있어. 모델이 약하면 자신 없어 하거든. 근데 이건 확신하면서 틀렸잖아. 뭔가가 답을 미리 알려주고 있는 거야." 그 한마디가 프리필 토큰을 곧장 가리켰어. 확신하면서 틀린 건 능력 문제 냄새가 아니라 설정 문제 냄새야.

Code

함정과 해법·swift
// 함정. 라이브러리 기본값이 조용히 영어를 강제함.
// usePrefillPrompt: true, language: nil, detectLanguage: false
let result = try await whisperKit.transcribe(audioArray: samples)
// 한국어 입력 -> 영어 단어 샐러드 출력. 한국어 버그처럼 보이지만 아님.

// 해법. 항상 의도를 밝혀. 아는 언어를 지정하거나...
var options = DecodingOptions()
options.language = languageMode == .korean ? "ko" : "en"

// ...오디오에서 감지하게 맡기거나('Auto' 모드).
if languageMode == .auto {
    options.language = nil
    options.detectLanguage = true
}
let result = try await whisperKit.transcribe(audioArray: samples,
                                             decodeOptions: options)

External links

Exercise

흔한 경우엔 '그냥 되는' 기본값을 가진 라이브러리를 하나 찾아봐. 그리고 물어. 드문 경우엔 조용히 뭘 하지? 그 실패가 시끄럽게 날까, 조용히 날까? 조용히 난다면, 의도가 드러나게 매번 명시적으로 넘길 설정 하나를 적어 둬.
Hint
위험한 기본값은 만든 사람이 제일 흔하게 겪는 상황에 맞춰져 있어. 여기선 영어 오디오지. 네 상황이 다르면, 그러니까 한국어거나 혼합 언어면, 기본값은 에러를 안 내. 그냥 조용히 틀린 일을 해. 매번 명시적으로 넘기는 게, 안 그랬으면 며칠씩 헛짚었을 조용한 손상에 대한 싼 보험이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.