C.W.K.
Stream
Lesson 01 of 05 · published

듣는 네 가지 방법

~12 min · stt-engines, whisperkit, on-device, apple-silicon

Level 0불씨 없음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"Apple Silicon 엔 좋은 귀가 넷 있어. 네 목소리엔 기본을 고르고, 나머지는 어댑터로 둬."

협상 불가: 온디바이스

엔진 비교 전에, 시장 대부분을 제거하는 한 규칙: 엔진은 기계 위에서 돌아야 해. 클라우드 API 가 더 정확할 수 있지만, Firekeeper 를 정당화하는 두 약속 — 오디오가 로컬에 남고 오프라인으로 됨 — 을 깨. 그래서 아래 모든 엔진이 온디바이스야. 그중 선택은 속도, 언어 처리, 패키징에 관한 거지 '오디오가 떠나야 하나?' 가 아냐. 그 답은 늘 아니오야.

네 엔진

엔진                   성격              Firekeeper 에서 역할
----                   ----              -----------------
WhisperKit             Swift 네이티브,   기본. 한/영 혼합 처리.
                       Core ML           large-v3-turbo 모델.
Apple SpeechAnalyzer   macOS 26 API,     빠른 2번 엔진. 모델 파일
                       무다운로드        없음. 스트리밍 친화.
whisper.cpp            C/C++, Core ML    폴백 / 벤치마크 하니스.
MLX Whisper            Python, MLX       선택적 배치 '파워 모드'.

WhisperKit 이 기본인 건 Swift 네이티브고, Core ML 최적화됐고, 결정적으로 아빠의 한/영 혼합 말을 처리해서야. Apple SpeechAnalyzer(macOS 26)는 빠른 두 번째 엔진: 관리할 모델 파일 없음, 네이티브 스트리밍, 근데 두 레슨 뒤 부딪힐 언어 함정이 있어. whisper.cpp 는 성숙한 폴백이고 CLI 벤치마크 하니스의 자연스러운 집. MLX Whisper 는 배치 작업용 Python 기반 파워 모드 — 긴 녹음엔 좋고, 패키징된 앱엔 틀려.

기본 더하기 어댑터

모양을 봐: 기본 하나 더하기 어댑터 여럿. 엔진 하나를 영원히 고르는 게 아니라; 흔한 경우엔 기본을 고르고 나머지는 공통 인터페이스 뒤에서 갈아끼울 수 있게 둬. 엔진은 텍스트 감지한 언어를 돌려줘서, 앱 나머지는 넷 중 뭐가 단어를 만들었는지 신경 쓸 필요가 절대 없어. 그 인터페이스가 다음 트랙의 주제 전체야 — 여기선 '어느 STT 엔진' 이 영구 결혼이 아니라 런타임 선택이란 것만 새겨.

온디바이스 먼저, 그다음 최적화. 프라이버시/오프라인 약속이 카테고리를 정하고(로컬 엔진만); 속도, 언어 처리, 패키징이 그 카테고리 안에서 기본을 정해. 더 빠른 클라우드 옵션이 정해진 질문을 다시 열게 절대 두지 마 — 오디오가 기계에 남는 게 튜닝값이 아니라 제품이야.
첫날부터 벤치마크 하니스를 둬. 후보 엔진 넷에 각각 모델 여럿이면, '뭐가 더 빠른가/나은가' 를 감으로 따질 수 없어. 같은 녹음 클립을 각 엔진에 돌려 전사 + 지연을 찍는 작은 CLI 가 엔진 선택을 데이터로 바꿔. Firekeeper 엔 하나 있어; 네 것도 있어야 해.

Code

인터페이스 하나, 귀 여럿 — 엔진이 텍스트와 언어를 돌려줘·swift
struct STTResult {
    let text: String
    let detectedLanguage: String   // "ko", "en", ... — 앱이 이걸로 라우팅
}

protocol STTEngine {
    var id: String { get }
    func prewarm() async            // 첫 단축키 전에 로드/컴파일
    func finalize(_ clip: AudioClip, language: LanguageMode) async throws -> STTResult
}

// WhisperKitEngine, AppleSpeechEngine, WhisperCppEngine 모두 준수.
// DictationController 는 `any STTEngine` 을 쥐고 브랜드를 절대 안 부름.

External links

Exercise

네가 지을 수 있는 보이스 기능에 대해, 특정 엔진을 비교하기 전에 엔진 카테고리를 정하는 한 문장 규칙을 써봐. 그다음 그 카테고리 안에서 기본을 고르려고 잴 속성 둘을 나열해. 왜 카테고리 규칙은 협상 불가고 기본은 갈아끼울 수 있어야 해?
Hint
카테고리 규칙은 제품 약속('오디오가 로컬에 남음')을 담아서, 제품을 안 깨고는 못 굽혀. 기본은 최적화('WhisperKit 이 오늘 나한테 혼합 언어를 제일 빨리 처리')라서, 모델과 OS API 가 나아지면 갈아끼울 수 있게 남아야 해.

Progress

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

댓글 0

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

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