
Android, iOS, macOS, Windows에서 16개 온디바이스 음성인식 모델과 9개 추론 엔진에 대한 종합 벤치마크
소스 코드:
- android-offline-transcribe — 16개 ASR 모델 및 6개 추론 엔진을 탑재한 Android 벤치마크 앱
- ios-mac-offline-transcribe — 17개 ASR 모델 및 9개 추론 엔진을 탑재한 iOS/macOS 벤치마크 앱
- windows-offline-transcribe — 12개 ASR 모델을 탑재한 Windows 벤치마크 앱 (CPU 전용)
개요
Android, iOS, macOS, Windows 전 플랫폼에서 16개 온디바이스 음성인식 모델을 9개 추론 엔진에 걸쳐 벤치마크하여 추론 속도(tok/s), 실시간 계수(RTF), 메모리 사용량을 측정했습니다. 본 벤치마크는 속도만 측정하며 전사 정확도(WER/CER)는 평가하지 않습니다. 주요 발견: 추론 엔진 선택에 따라 동일 모델의 성능이 51배까지 달라질 수 있으며(Android에서 sherpa-onnx vs whisper.cpp), Moonshine Tiny와 SenseVoice Small이 전 플랫폼에서 가장 빠른 추론을 달성하고, WhisperKit CoreML은 4GB iOS 기기에서 Whisper Tiny 이상 모델이 크래시합니다. 모든 벤치마크 앱과 결과는 오픈소스입니다.
동기
음성 기반 엣지 애플리케이션을 개발하는 개발자들은 조합 선택 문제에 직면합니다. 수십 개의 ASR 모델(31MB Whisper Tiny부터 1.8GB Qwen3 ASR까지), 여러 추론 엔진(ONNX Runtime, CoreML, whisper.cpp, MLX), 4개 이상의 타겟 플랫폼이 있으며, 각 조합이 크게 다른 속도와 메모리 특성을 보입니다. 기존 모델 벤치마크는 대부분 서버 GPU에서의 결과를 보고하며, 실제로 배포하는 소비자용 모바일 및 노트북 하드웨어에서의 결과가 아닙니다.
본 벤치마크는 배포 선택 문제에 직접 대응합니다. 각 타겟 플랫폼에서 어떤 모델+엔진 조합이 실시간 전사를 구현하는지, 메모리 제약은 어떠한지를 실측 데이터로 제시합니다.
방법론
Android, iOS, macOS 벤치마크는 JFK 취임 연설을 반복한 30초 WAV 파일(16kHz, 모노, PCM 16비트)을 사용합니다. Windows 벤치마크는 동일 음원의 11초 발췌본을 사용합니다(상세 내용은 Windows 섹션 참조).
측정 지표(속도만 해당 — 전사 정확도/WER는 측정하지 않음):
- 추론 시간: 엔진 호출부터 결과 반환까지의 실측 시간
- tok/s: 초당 출력 단어 수 (높을수록 빠름)
- RTF: 실시간 계수 — 처리 시간과 오디오 길이의 비율 (1.0 미만 = 실시간보다 빠름)
테스트 기기:
| 기기 | 칩 | RAM | OS |
|---|---|---|---|
| Samsung Galaxy S10 | Exynos 9820 | 8 GB | Android 12 (API 31) |
| iPad Pro 3세대 | A12X Bionic | 4 GB | iOS 17+ |
| MacBook Air | Apple M4 | 32 GB | macOS 15+ |
| 노트북 | Intel Core i5-1035G1 | 8 GB | Windows (CPU 전용) |
Android 결과
기기: Samsung Galaxy S10, Android 12, API 31
| 모델 | 엔진 | 파라미터 | 크기 | 지원 언어 | 추론 시간 | tok/s | RTF | 결과 |
|---|---|---|---|---|---|---|---|---|
| Moonshine Tiny | sherpa-onnx | 27M | ~125 MB | 영어 | 1,363 ms | 42.55 | 0.05 | ✅ |
| SenseVoice Small | sherpa-onnx | 234M | ~240 MB | zh/en/ja/ko/yue | 1,725 ms | 33.62 | 0.06 | ✅ |
| Whisper Tiny | sherpa-onnx | 39M | ~100 MB | 99개 언어 | 2,068 ms | 27.08 | 0.07 | ✅ |
| Moonshine Base | sherpa-onnx | 61M | ~290 MB | 영어 | 2,251 ms | 25.77 | 0.08 | ✅ |
| Parakeet TDT 0.6B v3 | sherpa-onnx | 600M | ~671 MB | 유럽 25개 언어 | 2,841 ms | 20.41 | 0.09 | ✅ |
| Android Speech (오프라인) | SpeechRecognizer | 시스템 | 내장 | 50개 이상 언어 | 3,615 ms | 1.38 | 0.12 | ✅ |
| Android Speech (온라인) | SpeechRecognizer | 시스템 | 내장 | 100개 이상 언어 | 3,591 ms | 1.39 | 0.12 | ✅ |
| Zipformer Streaming | sherpa-onnx streaming | 20M | ~73 MB | 영어 | 3,568 ms | 16.26 | 0.12 | ✅ |
| Whisper Base (.en) | sherpa-onnx | 74M | ~160 MB | 영어 | 3,917 ms | 14.81 | 0.13 | ✅ |
| Whisper Base | sherpa-onnx | 74M | ~160 MB | 99개 언어 | 4,038 ms | 14.36 | 0.13 | ✅ |
| Whisper Small | sherpa-onnx | 244M | ~490 MB | 99개 언어 | 12,329 ms | 4.70 | 0.41 | ✅ |
| Qwen3 ASR 0.6B (ONNX) | ONNX Runtime INT8 | 600M | ~1.9 GB | 30개 언어 | 15,881 ms | 3.65 | 0.53 | ✅ |
| Whisper Turbo | sherpa-onnx | 809M | ~1.0 GB | 99개 언어 | 17,930 ms | 3.23 | 0.60 | ✅ |
| Whisper Tiny (whisper.cpp) | whisper.cpp GGML | 39M | ~31 MB | 99개 언어 | 105,596 ms | 0.55 | 3.52 | ✅ |
| Qwen3 ASR 0.6B (CPU) | Pure C/NEON | 600M | ~1.8 GB | 30개 언어 | 338,261 ms | 0.17 | 11.28 | ✅ |
| Omnilingual 300M | sherpa-onnx | 300M | ~365 MB | 1,600개 이상 언어 | 44,035 ms | 0.05 | 1.47 | ❌ |
16개 중 15개 통과 — OOM 0건. 유일한 실패(Omnilingual 300M)는 영어 언어 감지 관련 알려진 모델 한계입니다.
Android 엔진 비교: 동일 모델, 다른 백엔드
Whisper Tiny 모델에서 추론 백엔드에 따라 극적인 성능 차이가 발생합니다.
| 백엔드 | 추론 시간 | tok/s | 속도 배율 |
|---|---|---|---|
| sherpa-onnx (ONNX) | 2,068 ms | 27.08 | 51배 |
| whisper.cpp (GGML) | 105,596 ms | 0.55 | 1배 (기준) |
동일 Whisper Tiny 모델에서 Android의 sherpa-onnx가 whisper.cpp보다 51배 빠릅니다 — 추론 런타임 선택이 얼마나 중요한지 보여주는 핵심 발견입니다.
iOS 결과
기기: iPad Pro 3세대, A12X Bionic, 4 GB RAM
| 모델 | 엔진 | 파라미터 | 크기 | 지원 언어 | tok/s | 상태 |
|---|---|---|---|---|---|---|
| Parakeet TDT v3 | FluidAudio (CoreML) | 600M | ~600 MB (CoreML) | 유럽 25개 언어 | 181.8 | ✅ |
| Zipformer 20M | sherpa-onnx streaming | 20M | ~46 MB (INT8) | 영어 | 39.7 | ✅ |
| Whisper Tiny | whisper.cpp | 39M | ~31 MB (GGML Q5_1) | 99개 언어 | 37.8 | ✅ |
| Moonshine Tiny | sherpa-onnx offline | 27M | ~125 MB (INT8) | 영어 | 37.3 | ✅ |
| Moonshine Base | sherpa-onnx offline | 61M | ~280 MB (INT8) | 영어 | 31.3 | ✅ |
| Whisper Base | WhisperKit (CoreML) | 74M | ~150 MB (CoreML) | 영어 | 19.6 | ❌ 4GB OOM |
| SenseVoice Small | sherpa-onnx offline | 234M | ~240 MB (INT8) | zh/en/ja/ko/yue | 15.6 | ✅ |
| Whisper Base | whisper.cpp | 74M | ~57 MB (GGML Q5_1) | 99개 언어 | 13.8 | ✅ |
| Whisper Small | WhisperKit (CoreML) | 244M | ~500 MB (CoreML) | 99개 언어 | 6.3 | ❌ 4GB OOM |
| Qwen3 ASR 0.6B | Pure C (ARM NEON) | 600M | ~1.8 GB | 30개 언어 | 5.6 | ✅ |
| Qwen3 ASR 0.6B (ONNX) | ONNX Runtime (INT8) | 600M | ~1.6 GB (INT8) | 30개 언어 | 5.4 | ✅ |
| Whisper Tiny | WhisperKit (CoreML) | 39M | ~80 MB (CoreML) | 99개 언어 | 4.5 | ✅ |
| Whisper Small | whisper.cpp | 244M | ~181 MB (GGML Q5_1) | 99개 언어 | 3.9 | ✅ |
| Whisper Large v3 Turbo (압축) | WhisperKit (CoreML) | 809M | ~1 GB (CoreML) | 99개 언어 | 1.9 | ❌ 4GB OOM |
| Whisper Large v3 Turbo | WhisperKit (CoreML) | 809M | ~600 MB (CoreML) | 99개 언어 | 1.4 | ❌ 4GB OOM |
| Whisper Large v3 Turbo | whisper.cpp | 809M | ~547 MB (GGML Q5_0) | 99개 언어 | 0.8 | ⚠️ RTF >1 |
| Whisper Large v3 Turbo (압축) | whisper.cpp | 809M | ~834 MB (GGML Q8_0) | 99개 언어 | 0.8 | ⚠️ RTF >1 |
WhisperKit OOM 경고: 4GB 기기에서 WhisperKit CoreML은 Whisper Base 이상 모델에서 크래시(OOM)가 발생합니다. OOM 표시된 모델의 tok/s 값은 크래시 전에 측정된 것으로, 완전한 성공적 실행을 나타내지 않습니다. whisper.cpp는 동일 모델을 OOM 없이 처리하지만 처리량은 낮습니다.
macOS 결과
기기: MacBook Air M4, 32 GB RAM
| 모델 | 엔진 | 파라미터 | 크기 | 지원 언어 | tok/s | 상태 |
|---|---|---|---|---|---|---|
| Parakeet TDT v3 | FluidAudio (CoreML) | 600M | ~600 MB (CoreML) | 유럽 25개 언어 | 171.6 | ✅ |
| Moonshine Tiny | sherpa-onnx offline | 27M | ~125 MB (INT8) | 영어 | 92.2 | ✅ |
| Zipformer 20M | sherpa-onnx streaming | 20M | ~46 MB (INT8) | 영어 | 77.4 | ✅ |
| Moonshine Base | sherpa-onnx offline | 61M | ~280 MB (INT8) | 영어 | 59.3 | ✅ |
| SenseVoice Small | sherpa-onnx offline | 234M | ~240 MB (INT8) | zh/en/ja/ko/yue | 27.4 | ✅ |
| Whisper Tiny | WhisperKit (CoreML) | 39M | ~80 MB (CoreML) | 99개 언어 | 24.7 | ✅ |
| Whisper Base | WhisperKit (CoreML) | 74M | ~150 MB (CoreML) | 영어 | 23.3 | ✅ |
| Apple Speech | SFSpeechRecognizer | 시스템 | 내장 | 50개 이상 언어 | 13.1 | ✅ |
| Whisper Small | WhisperKit (CoreML) | 244M | ~500 MB (CoreML) | 99개 언어 | 8.7 | ✅ |
| Qwen3 ASR 0.6B (ONNX) | ONNX Runtime (INT8) | 600M | ~1.6 GB (INT8) | 30개 언어 | 8.0 | ✅ |
| Qwen3 ASR 0.6B | Pure C (ARM NEON) | 600M | ~1.8 GB | 30개 언어 | 5.7 | ✅ |
| Whisper Large v3 Turbo | WhisperKit (CoreML) | 809M | ~600 MB (CoreML) | 99개 언어 | 1.9 | ✅ |
| Whisper Large v3 Turbo (압축) | WhisperKit (CoreML) | 809M | ~1 GB (CoreML) | 99개 언어 | 1.5 | ✅ |
| Qwen3 ASR 0.6B (MLX) | MLX (Metal GPU) | 600M | ~400 MB (4-bit) | 30개 언어 | — | 미측정 |
| Omnilingual 300M | sherpa-onnx offline | 300M | ~365 MB (INT8) | 1,600개 이상 언어 | 0.03 | ❌ 영어 미지원 |
macOS에서 OOM 문제 없음 — 32GB RAM으로 WhisperKit CoreML 기반 Whisper Large v3 Turbo를 포함한 모든 모델이 정상 실행됩니다.
Windows 결과
기기: Intel Core i5-1035G1 @ 1.00 GHz (4C/8T), 8 GB RAM, CPU 전용
| 모델 | 엔진 | 파라미터 | 크기 | 추론 시간 | Words/s | RTF |
|---|---|---|---|---|---|---|
| Moonshine Tiny | sherpa-onnx offline | 27M | ~125 MB | 435 ms | 50.6 | 0.040 |
| SenseVoice Small | sherpa-onnx offline | 234M | ~240 MB | 462 ms | 47.6 | 0.042 |
| Moonshine Base | sherpa-onnx offline | 61M | ~290 MB | 534 ms | 41.2 | 0.049 |
| Parakeet TDT v2 | sherpa-onnx offline | 600M | ~660 MB | 1,239 ms | 17.8 | 0.113 |
| Zipformer 20M | sherpa-onnx streaming | 20M | ~73 MB | 1,775 ms | 12.4 | 0.161 |
| Whisper Tiny | whisper.cpp | 39M | ~80 MB | 2,325 ms | 9.5 | 0.211 |
| Omnilingual 300M | sherpa-onnx offline | 300M | ~365 MB | 2,360 ms | — | 0.215 |
| Whisper Base | whisper.cpp | 74M | ~150 MB | 6,501 ms | 3.4 | 0.591 |
| Qwen3 ASR 0.6B | qwen-asr (C) | 600M | ~1.9 GB | 13,359 ms | 1.6 | 1.214 |
| Whisper Small | whisper.cpp | 244M | ~500 MB | 21,260 ms | 1.0 | 1.933 |
| Whisper Large v3 Turbo | whisper.cpp | 809M | ~834 MB | 92,845 ms | 0.2 | 8.440 |
| Windows Speech | Windows Speech API | N/A | 0 MB | — | — | — |
11초 JFK 취임 연설 발췌 오디오(22단어)로 테스트. 모든 모델은 x86_64 CPU에서만 동작(i5-1035G1, 4C/8T) — GPU 가속 없음. Parakeet TDT v2는 빠른 추론(17.8 words/s)과 구두점 출력을 모두 지원하는 점이 주목할 만합니다.
한계
- 속도만 측정: 본 벤치마크는 추론 속도만 측정하며 전사 정확도(WER/CER)는 평가하지 않습니다. 정확도는 모델, 언어, 오디오 조건에 따라 다르므로 개발자는 대상 사용 사례에 맞게 별도로 평가해야 합니다.
- 단일 오디오 샘플: 모든 플랫폼에서 JFK 취임 연설 녹음 하나를 사용합니다. 다른 오디오 특성(노이즈, 억양, 분야별 어휘)에서는 결과가 달라질 수 있습니다.
- Windows 클립 길이: Windows는 다른 플랫폼의 30초 대비 11초 오디오 클립을 사용하므로, 크로스 플랫폼 속도 비교 시 이 차이를 고려해야 합니다.
- iOS OOM 값: OOM 표시된 iOS 모델의 tok/s 값은 크래시 전에 측정된 것으로 완전한 성공적 실행을 나타내지 않습니다.
향후 연구
- 정확도 벤치마크 추가: 다국어 데이터셋과 잡음 환경에서의 WER/CER을 속도 지표와 함께 측정.
- 오디오 조건 확대: 단일 음성 샘플 대신 장시간 오디오, 화자 중첩, 분야별 어휘(회의, 콜센터, 산업용) 추가.
- 양자화 전수 조사: 엔진 전반에 걸친 INT8/INT4 및 혼합 정밀도 변형 벤치마크로 메모리/속도/정확도 트레이드오프 분석.
- 소형 Qwen3-ASR 모델: 속도 향상이 품질 저하를 정당화하는지 검증하기 위한 Qwen3-ASR-0.6B 및 향후 1B 미만 체크포인트 테스트.
- 전력 및 발열 프로파일링: 지속적 온디바이스 전사 워크로드에서의 배터리 소모 및 지속 성능 측정.
결론
온디바이스 음성 전사는 주요 모바일 및 데스크톱 플랫폼 전반에서 실시간을 초과하는 속도를 달성합니다. 추론 엔진의 선택은 모델 선택만큼 중요하며, Android에서는 sherpa-onnx가, Apple 플랫폼에서는 CoreML이 단순 CPU 추론 대비 10~50배의 속도 향상을 제공합니다. 가장 빠른 모델 중에서는 Moonshine Tiny(영어) 또는 Whisper Tiny(다국어)와 적절한 엔진의 조합이 최소한의 메모리 비용으로 실시간 전사를 달성합니다. 모델 선택 시 본 벤치마크에서 측정하지 않은 전사 정확도(WER)도 함께 고려해야 합니다.
참고 자료
저장소:
- android-offline-transcribe — Android 벤치마크 앱 (Apache 2.0)
- ios-mac-offline-transcribe — iOS/macOS 벤치마크 앱 (Apache 2.0)
- windows-offline-transcribe — Windows 벤치마크 앱 (Apache 2.0)
모델:
- Moonshine Tiny/Base — Useful Sensors, 영어 전용
- Whisper Tiny/Base/Small/Turbo — OpenAI, 99개 언어
- SenseVoice Small — FunAudioLLM, 5개 언어
- Parakeet TDT 0.6B v3 — NVIDIA NeMo, 유럽 25개 언어
- Qwen3 ASR 0.6B — Alibaba Qwen, 30개 언어
- Zipformer Streaming — Next-gen Kaldi, 영어
- Omnilingual 300M — MMS, 1,600개 이상 언어
추론 엔진:
- sherpa-onnx — Next-gen Kaldi ONNX Runtime
- whisper.cpp — OpenAI Whisper의 C/C++ 포팅
- WhisperKit — Apple용 CoreML Whisper
- MLX — Apple 머신러닝 프레임워크


