자동 감지가 자꾸 틀린다면, 언어를 고정하세요
받아쓰기가 자꾸 엉뚱한 언어로 나오나요? 자동 감지는 설계상 이중언어 발화에서 흔들립니다. 한 번 고정하면 계속 고정된 채로 있습니다.
두 개 이상의 언어로 받아쓴다면 그 실패를 본 적이 있을 겁니다. 루마니아어로 한 문장을 말했는데 전사본이 음성만 흉내 낸 엉망진창의 영어로 돌아옵니다. 진짜 단어들이지만 당신 말은 하나도 없죠. 아니면 문장 중간에 뒤집힙니다. 앞 절반은 맞는 언어로, 뒤 절반은 모델이 당신이 갈아탔다고 판단한 무언가로요. 아니면, 제가 개인적으로 제일 좋아하는 것, 알파벳이 섞인 죽입니다. 라틴 문자에 키릴 문자가 몇 개 뿌려져 있죠. 모델이 글자 단위로 양다리를 걸친 것처럼요.
이건 어느 한 제품에 대한 불만이 아닙니다. Keebye의 영어에 맞춰진 기본 엔진을 포함해, 자동 언어 감지의 예측 가능한 실패 양상입니다. 억양이 섞인 영어를 쓰는 사람과 하루 종일 언어를 갈아타는 모든 사람에게 닥칩니다. Slack은 폴란드어로 쓰고 커밋 메시지는 영어로 쓰는 이중언어 개발자는 자동 감지가 가장 못 다루는 혼합 신호를 그대로 줍니다.
불만의 나머지 절반은 더 조용하지만 그만큼 실재합니다. 언어 설정이 있을 때조차, 그건 대개 파묻혀 있습니다. 메뉴 세 겹 아래, 엔진 선택기 뒤, 이름에 언어라는 말이 아예 없는 토글 너머에요. 하루에 스무 번 언어를 바꾼다면, 파묻힌 설정은 사실상 설정이 없는 것입니다.
왜 이 흔들림이 생기는지 설명하고 싶습니다. 제 제품의 전투 기록을 써서요. Keebye도 해법을 갖기 전에 이 문제를 갖고 있었으니까요. 그다음 실제 해법이 어떤 모습인지 보여 드리겠습니다.
자동 감지는 왜 흔들리나 (그리고 왜 정확히는 버그가 아닌가)
솔직한 작동 원리는 이렇습니다. 현대 음성 모델은 디코딩의 일부로 언어 식별을 조용히 수행합니다. 모델이 듣고, 어떤 언어를 듣고 있는지에 대한 내부 추측을 세우고, 그 추측에 맞춰 디코딩합니다. 오디오가 깨끗하고 억양이 없고 단일 언어일 때는 너무 잘 돌아가서 생각조차 안 하게 됩니다.
이제 실제 발화를 먹여 보세요. 억양은 모음을 다른 언어의 음소 쪽으로 밀어냅니다. 한 문장에 영어 차용어가 세 개 들어 있습니다. 모든 기술 대화가 그렇죠. 뒤에서 아이가 떠들거나, 노트북 마이크를 쓰고 있습니다. 이 하나하나가 모델의 내부 언어 추측을 덜 확신하게 만들고, 확신이 낮은 추측은 프레임 사이에서 뒤집힐 수 있습니다. 뒤집히면 디코딩도 함께 뒤집히고, 생각 중간에 언어가 바뀌는 전사본을 받게 됩니다.
핵심은 이겁니다. 대부분의 도구에는 그 추측을 붙들어 매는 것이 없습니다. 모델이 발화마다 조용히 결정하고, 당신에게는 덮어쓸 방법이 없습니다. 그건 어느 앱의 버그가 아니라, 조용한 자동 감지가 _본래 그런 것_입니다. 당신이 바로잡을 수 없는 판단을 내리는 모델이죠.
제가 이걸 잘 아는 건 Keebye의 기본 엔진이 정확히 이 성질을 가졌기 때문입니다. 영어에 맞춰진 기본 엔진 Parakeet은 디코딩 계층에서 어떤 언어 힌트도 무시합니다. 무엇을 말할 참인지 알려 줄 수 없습니다. 또렷한 영어에서는 훌륭하고, 그래서 기본값입니다. 또렷하지 않은 오디오에서는 이 분야의 다른 모든 것처럼 언어 사이에서 흔들릴 수 있습니다. 제 제품 이야기를 먼저 하는 이유는, 문제가 어느 경쟁사의 허술함이 아니라 아키텍처에 산다는 걸 받아들여야 해법이 말이 되기 때문입니다.
언어를 고정한다는 건 실제로 무엇을 하나?
해법은 모델에게 추측을 시키기를 그만두는 것입니다. Keebye에는 두 번째 온디바이스 엔진이 들어 있습니다. NVIDIA의 Canary 1B v2를 int8로 양자화한 것이고, 정확히 25개 언어를 다룹니다. 불가리아어, 크로아티아어, 체코어, 덴마크어, 네덜란드어, 영어, 에스토니아어, 핀란드어, 프랑스어, 독일어, 그리스어, 헝가리어, 이탈리아어, 라트비아어, 리투아니아어, 몰타어, 폴란드어, 포르투갈어, 루마니아어, 슬로바키아어, 슬로베니아어, 스페인어, 스웨덴어, 러시아어, 우크라이나어. 기본 엔진과 달리 Canary는 언어 지시를 받아들이고 그것을 따릅니다.
Keebye는 그것을 고정으로 노출합니다. 발화마다 Canary 엔진에 전달되는 명시적인 언어 설정이죠. 루마니아어를 고정하면 디코더는 자동으로 언어를 고르는 대신 루마니아어를 씁니다. 특히 차용어와 시끄러운 오디오 주변에서 인식은 여전히 틀릴 수 있지만, 언어 선택만큼은 더 이상 검증되지 않은 추측이 아닙니다.
이 설정은 받아쓸 때마다 실시간으로 읽힙니다. 바꾸면 다음 누르고 말하기부터 앱을 다시 시작하지 않고 새 언어를 씁니다. 들리는 것보다 중요합니다. 언어 제어는 바꾸는 일이 작업을 끊지 않을 때 훨씬 쓸모 있습니다.
그리고 Canary도 Keebye의 다른 모든 것처럼 온디바이스로 돌기 때문에, 고정은 프라이버시 이야기를 대가로 요구하지 않습니다. 모델은 약 1.3 GB이고 한 번 내려받습니다. 그 뒤로 당신의 루마니아어, 폴란드어, 우크라이나어는 기기를 떠나지 않습니다. (로컬 다국어 받아쓰기가 애초에 왜 중요하다고 보는지는 그 자체로 하나의 글입니다. 개발자를 위한 받아쓰기가 영어 전용이어서는 안 되는 이유. 이 글은 그것의 실전 속편입니다. 그 글이 언어를 주장한다면, 이 글은 그것들을 실제로 쓸 만하게 만드는 이야기입니다.)
메뉴 세 겹이 아니라 두 번의 클릭
닿을 수 없는 고정은 쓰지 않을 고정이므로, 전환은 트레이에 있습니다. Keebye의 메뉴 막대 아이콘에는 11개 언어를 추린 "Dictation Language" 메뉴가 있습니다. 영어, 루마니아어, 프랑스어, 독일어, 스페인어, 이탈리아어, 포르투갈어, 네덜란드어, 폴란드어, 러시아어, 우크라이나어. 어느 앱에서든 두 번의 클릭입니다. 트레이를 클릭하고, 언어를 클릭하세요. Settings를 열지 않고, 작업하던 창을 떠나지 않습니다.
추린 목록 밖의 언어를 위해 25개 전체 목록은 Settings에 있습니다. 다만 추린 목록이 대부분의 이중언어 작업의 일상적 현실을 감당합니다. 한 언어로는 팀에게 쓰고 다른 언어로는 고객이나 AI 에이전트에게 쓰는데, 그 전환에 비용이 들지 않아야 하니까요.
알아 둘 만한 옵션이 하나 더 있습니다. 어떤 사람들에게는 고정을 쓰는 방식 자체를 바꿔 놓기 때문입니다. 영어로 번역하기 토글입니다. 당신의 언어로 말하면 커서에는 영어가 떨어집니다. 같은 엔진, 같은 온디바이스 실행입니다. 속으로 하는 독백은 루마니아어인데 결과물은 영어여야 한다면(커밋 메시지, 코딩 에이전트에게 주는 프롬프트, 국제 팀에 보내는 답장) 머릿속에서 하던 번역 단계가 사라집니다. 저는 예상보다 훨씬 자주 씁니다.
고정이 치르는 대가
25개 언어는 25개 언어입니다. 클라우드 받아쓰기 도구는 훨씬 많이 나열합니다. 큰 서버 모델로 오디오를 보내는 게 언어를 늘리는 값싼 방법이니까요. 그게 온디바이스의 진짜 맞바꿈입니다. 당신의 Mac에 들어가는 모델은 데이터센터를 채우는 모델보다 세계를 덜 감당합니다. 당신의 언어가 25개 목록에 없다면 Keebye의 다국어 엔진은 오늘 당신을 감당하지 못하고, 저는 그걸 올려 잡기보다 그대로 말하겠습니다.
고정은 고정입니다. 이건 결정론의 뒷면이고, 분명히 말해 두고 싶습니다. 루마니아어를 고정해 놓고 영어로 말하면, Keebye는 당신이 바꾸기 전까지 당신의 영어를 충실하게 루마니아어로 잘못 디코딩합니다. 엔진은 당신이 시킨 그대로 하고 있습니다. 자동 감지의 매력은 이런 걸 생각할 필요가 없다는 것이었죠. 고정은 그 편의를 예측 가능성과 맞바꿉니다. 제 경험으로는 그럴 값어치가 있습니다. 통제할 수 없는 틀린 추측이 두 번의 클릭으로 고칠 수 있는 틀린 설정보다 나쁘니까요. 하지만 이건 맞바꿈이지 공짜가 아닙니다.
트레이의 추린 목록은 25개가 아니라 11개입니다. 매일 쓰는 한 쌍에 이를테면 핀란드어나 그리스어가 들어 있다면, 그중 한쪽은 Settings를 거쳐야 합니다. 추린다는 건 누군가의 언어가 빠른 메뉴에 못 들어갔다는 뜻입니다.
이 불만은 어디로 가나
분야 차원의 불만 — "내 받아쓰기가 자꾸 엉뚱한 언어로 나온다" — 은 사실 조용한 결정에 대한 불만입니다. 모델이 추측했고, 추측이 틀렸고, 달리 말할 방법이 없었습니다. 추측을 그대로 두는 모든 개선(더 나은 감지, 더 긴 오디오 창, 확신도 임계값)은 실패를 더 드물고 더 낯설게 만들 뿐입니다. 불만을 실제로 끝내는 해법은 결정권을 사용자에게 돌려주는 것입니다.
지금 다른 도구로 이걸 겪고 있다면, 저희 비교 페이지가 각 도구가 어디에 맞는지 솔직하게 적어 두었습니다. Keebye vs Superwhisper와 Keebye vs Wispr Flow 모두 언어 문제를 다른 주제들과 함께 다룹니다. 고정 자체를 시험해 보려면 아래에서 무료 체험을 시작하고, 이 글 첫머리의 루마니아어나 폴란드어 문장을 다시 받아쓰고, 그 흔들림 중 얼마나가 당신의 억양이 아니라 검증되지 않은 추측에서 왔는지 보세요.
실제로 쓰는 언어를 고정하세요
무료 체험을 시작해, 자동 감지가 예전에 망가뜨렸던 모국어 답장 하나를 다시 받아쓰세요.
Start free trialEarly access: we'll email you the moment the macOS build is ready — your 14 days start when you first sign in from the app.
계속 읽기
코드 리뷰를 당신의 언어로 받아쓰세요
코드는 영어입니다. 리뷰 코멘트까지 그럴 필요는 없습니다. 25개 언어 중 하나로 리뷰를 온디바이스 받아쓰는 방법, 그리고 언어 고정이 중요한 이유.
병렬 에이전트에 프롬프트 받아쓰기, 레인 하나씩
코딩 에이전트를 두세 개 동시에 돌리면 프롬프트 쓰는 일이 병목이 됩니다. 지금 보고 있는 레인을 떠나지 않고 병렬 레인에 먹이를 주는 음성 워크플로.
Claude Code를 목소리로 조종하기: 병렬 레인으로 만들기
AI 코딩 에이전트는 타이핑을 병목으로 만들었습니다. macOS에서 병렬 에이전트 레인을 가로질러 프롬프트와 리뷰와 방향 수정을 받아쓰는 실전 워크플로.