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

When 'SwiftUI' Becomes '스위트 트라이'

~10 min · transliteration, speechanalyzer, mixed-language, default-choice

Level 0Unlit
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"The faster engine was faster at the wrong answer."

A Tempting Upgrade

macOS 26 ships SpeechAnalyzer / SpeechTranscriber: fully on-device, no model files to manage, and in early benchmarks 3–10× faster per clip than WhisperKit large-v3-turbo. On paper it should be the default. For Dad's speech, it isn't — and the reason is a subtle language behavior, not a speed number.

The Trap

Running in ko-KR, SpeechAnalyzer transliterates embedded English tech terms into Hangul. Say "SwiftUI" in the middle of a Korean sentence and it writes "스위트 트라이." For pure Korean this is fine. For Dad — whose speech is a constant weave of Korean grammar and English framework names (SwiftUI, WhisperKit, async, pasteboard) — it's exactly wrong. Every technical noun comes out as a phonetic Korean smear that has to be mentally un-transliterated. Fast and unusable beats nothing, but it loses to slower and correct.

Spoken (mixed ko/en):   "SwiftUI 로 오버레이를 만들었어"
SpeechAnalyzer ko-KR:   "스위트 트라이 로 오버레이를 만들었어"   (transliterated!)
WhisperKit turbo:       "SwiftUI 로 오버레이를 만들었어"           (kept as-is)

Two More Gotchas, and the Verdict

SpeechAnalyzer also runs one locale per transcriber and does no audio language identification — so an "Auto" mode can't truly detect language; it degrades to the system locale. Stack that on the transliteration behavior and the verdict is clear: SpeechAnalyzer is the excellent second engine — a fast path for pure-language dictation and the natural home for live streaming preview later — but WhisperKit large-v3-turbo, which keeps English terms intact in a Korean sentence, stays the default for Dad's mixed speech. The fastest engine is not automatically the default engine.

Correctness for your actual input beats speed on someone else's. Benchmarks measure the engine on generic clips; you care about the engine on your clips. An engine that's 5× faster but mangles the exact vocabulary you use all day is slower in the only unit that matters — usable words per minute. Choose the default on your real distribution, not the leaderboard.
A great non-default is still worth shipping. SpeechAnalyzer isn't rejected — it's the second engine, offered in settings for users whose speech is monolingual and who want the speed. 'Not the default' and 'not shipped' are different verdicts; the adapter layer lets both engines coexist without either compromising the other.

Code

The engine choice encodes who the user is·swift
// Default is chosen for the ACTUAL user's speech, not the benchmark winner.
func defaultEngine(for speech: SpeechProfile) -> STTEngineID {
    // Dad's speech: Korean grammar + English framework names, constantly mixed.
    // SpeechAnalyzer ko-KR transliterates the English terms -> wrong for him.
    if speech.isMixedLanguage {
        return .whisperKit          // keeps "SwiftUI" as "SwiftUI"
    }
    // Monolingual speech that wants raw speed can opt into the fast engine.
    return .appleSpeechAnalyzer
}

// Both engines ship. The adapter layer means neither constrains the other.

External links

Exercise

Write three sentences the way you actually speak them — including any code-switching, jargon, or names you'd never write 'properly.' Imagine an engine that transliterates every foreign term phonetically. Which of your sentences would it wreck, and would a generic benchmark ever have caught that?
Hint
Generic benchmarks use clean, monolingual, mid-register sentences — nothing like how a bilingual technical person actually talks. The mismatch is the point: the engine that wins on the benchmark can lose badly on your real speech, and only a test built from your own words will show it.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.