벤치마크
RTF (실시간 계수)가 1.0보다 작으면 실시간보다 빠르다는 의미입니다.
Apple Silicon (MLX + CoreML)
모든 벤치마크는 릴리즈 빌드와 컴파일된 metallib을 사용해 Apple M5 Pro, 48 GB, macOS 25.5에서 측정되었습니다.
ASR — 단어 오류율
LibriSpeech test-clean (2620 발화, 약 5.4시간의 영어 낭독 음성)에서 평가되었습니다.
| Engine | Quant | WER% | RTF | xRT | Peak RSS |
|---|---|---|---|---|---|
| Qwen3-ASR 1.7B MLX | 5-bit | 1.32 | 0.027 | 36.4× | 1.92 GB |
| Qwen3-ASR 1.7B MLX | 8-bit | 1.52 | 0.033 | 30.5× | 2.7 GB |
| Qwen3-ASR 0.6B MLX | 8-bit | 1.82 | 0.015 | 66.0× | 1.3 GB |
| Qwen3-ASR 0.6B MLX | 5-bit | 1.74 | 0.014 | 70.5× | 1.03 GB |
| WhisperKit Large-v3 Turbo | FP16 | 1.71 | 0.084 | 11.9× | 0.4 GB |
| WhisperASR native CoreML | FP16 | 1.40 | 0.089 | 14.0× | 384 MB |
| Qwen3-ASR 0.6B MLX | 4-bit | 2.20 | 0.012 | 85.6× | 1.0 GB |
| Parakeet TDT v3 | INT8 | 2.37 | 0.009 | 117.4× | 0.9 GB |
| Qwen3-ASR 0.6B CoreML | INT8 | 3.02 | 0.098 | 10.2× | 1.4 GB |
| Omnilingual CTC 300M MLX | 4-bit | 4.26 | 0.005 | 222.1× | 0.4 GB |
| Omnilingual CTC 300M CoreML | INT8 | 5.67 | 0.128 | 7.8× | 0.5 GB |
| Nemotron Streaming | INT8 | 2.82 | 0.058 | 17.1× | 961 MB |
주요 선택: Qwen3-ASR MLX 1.7B 5-bit는 1.32% WER로 새로운 정확도 1위입니다. WhisperKit Large-v3 Turbo(1.71%)와 자체 1.7B 8-bit(1.52%)를 앞서며, 8-bit보다 피크 RSS를 약 600 MB 덜 쓰고 23% 더 빠릅니다. Parakeet TDT v3는 영어 전용에서 가장 빠릅니다(실시간 117×, 유럽 25개 언어). Omnilingual CTC 300M MLX 4-bit는 다국어 처리량 리더로, 실시간 222×, 피크 384 MB, 1 672개 언어를 지원합니다.
Qwen3-ASR 0.6B CoreML 행은 재구축된 chunked block-attention 인코더(aufklarer/Qwen3-ASR-CoreML)를 반영합니다. 이전 export는 zero-padding된 mel에 마스크 없는 전역 self-attention을 적용했고, 첫 문장 끝 마침표 직후 <|im_end|>를 출력했습니다(같은 fixture에서 재구축 전 24.88% WER).
장시간 안정성 (Neural Engine 지속 부하)
200개의 LibriSpeech 발화를 순차 처리 (약 30분 오디오, M5 Pro). 지속적인 전사 환경에서 WER이나 지연이 저하되는지 테스트합니다.
| 지표 | 처음 25% | 마지막 25% | 전체 |
|---|---|---|---|
| WER% | 1.30 | 1.23 | 2.43 |
| RTF | 0.672 | 0.400 | 0.539 |
저하가 감지되지 않습니다. WER은 세션 전체에 걸쳐 안정적입니다. CoreML이 실행 계획 캐시를 워밍업하면서 RTF는 오히려 향상됩니다. 42분간 연속 Neural Engine 추론 후에도 thermal throttling이 발생하지 않았습니다. Parakeet은 각 청크를 독립적으로 처리하므로 청크 간 상태 누적이 없습니다.
다언어 결과 (FLEURS)
CJK 언어에 대해서는 단어 경계가 없으므로 CER을 사용합니다. Parakeet은 약 25개의 유럽어를 지원합니다 (CJK 미지원).
| 언어 | 지표 | Qwen3 4비트 | Qwen3 8비트 | Parakeet INT8 |
|---|---|---|---|---|
| 스페인어 | WER | 6.44 | 5.06 | 5.18 |
| 영어 | WER | 6.57 | 5.64 | 9.30 |
| 중국어 | CER | 8.41 | 7.71 | — |
| 독일어 | WER | 9.45 | 6.81 | 12.33 |
| 프랑스어 | WER | 11.42 | 8.50 | 13.02 |
| 일본어 | CER | 16.11 | 8.64 | — |
| 러시아어 | WER | 16.35 | 10.52 | 11.49 |
| 한국어 | WER | 19.95 | 6.89 | — |
| 힌디어 | WER | 25.93 | 18.57 | — |
| 아랍어 | WER | 33.47 | 20.31 | — |
압축 델타
낮은 비트폭으로 양자화할 때의 정확도 손실입니다.
| 변형 | WER% | 치환 | 삽입 | 삭제 | 총 오류 | 크기 |
|---|---|---|---|---|---|---|
| Qwen3 0.6B 8비트 | 2.80 | 1111 | 92 | 268 | 1471 | 960 MB |
| Qwen3 0.6B 4비트 | 3.34 | 1323 | 123 | 308 | 1754 | 675 MB |
| 델타 | +0.54 | +212 | +31 | +40 | +283 | -30% |
| Parakeet TDT INT8 | 2.74 | 990 | 125 | 308 | 1423 | 634 MB |
Qwen3-ASR 1.7B MLX는 5-bit에서 1.32% WER(8-bit는 1.52%)를 달성해 WhisperKit Large-v3 Turbo(1.71%)를 앞서며 Apple Silicon에서 실시간 30-36×로 실행됩니다.
TTS — 왕복 명료도
텍스트를 합성한 후 Qwen3-ASR 0.6B로 다시 오디오를 전사하고 원본 텍스트와의 WER을 계산합니다. 30개의 내장 영어 대화 문장에서 평가되었습니다.
| 엔진 | 모델 | 파라미터 | 크기 | WER% | RTF |
|---|---|---|---|---|---|
| CosyVoice3 | 0.5B 4비트 | 500M | 약 1.9 GB | 3.25 | 0.59 |
| Qwen3-TTS | 1.7B 4비트 | 1.7B | 약 2.3 GB | 3.47 | 0.79 |
| Qwen3-TTS | 1.7B 8비트 | 1.7B | 약 3.5 GB | 3.66 | 0.85 |
| Kokoro-82M | CoreML | 82M | 약 170 MB | 3.90 | 0.17 |
| Qwen3-TTS | 0.6B 8비트 | 600M | 약 960 MB | 9.74 | 0.76 |
| Qwen3-TTS | 0.6B 4비트 | 600M | 약 675 MB | 15.58 | 0.76 |
지연 분석 (Qwen3-TTS)
| 단계 | 시간 | 전체 비중 | 설명 |
|---|---|---|---|
| 임베드 | 1-3 ms | <1% | 텍스트 임베딩 (TTFT) |
| 생성 | 2-6 s | 약 92% | 자기회귀 코덱 토큰 |
| 디코딩 | 244-457 ms | 약 8% | 코덱 디코더에서 파형으로 |
모든 TTS 엔진이 실시간보다 빠르게 실행됩니다 (RTF < 1.0). CosyVoice3가 명료도(3.25% WER)에서 선두입니다. Kokoro는 단 170 MB로 가장 빠릅니다 (RTF 0.17).
VAD — 감지 정확도
FLEURS 평가 (10개 언어, 250개 파일)
동일한 임계값에서 Python FireRedVAD 레퍼런스 그라운드 트루스 대비 평가했습니다.
| 엔진 | 파라미터 | 백엔드 | F1% | FAR% | MR% | RTF |
|---|---|---|---|---|---|---|
| FireRedVAD | 588K | CoreML (ANE) | 99.12 | 2.52 | 0.47 | 0.007 |
| Silero v5 | 309K | CoreML (ANE) | 95.13 | 15.76 | 1.89 | 0.022 |
| Silero v5 | 309K | MLX (GPU) | 95.11 | 15.85 | 1.89 | 0.027 |
| Pyannote | 1.5M | MLX (GPU) | 94.86 | 14.71 | 2.92 | 0.358 |
VoxConverse 평가 (다화자)
5개의 다화자 대화 파일을 10 ms 프레임 해상도로 평가했습니다.
| 엔진 | 파라미터 | 백엔드 | F1% | FAR% | MR% | RTF |
|---|---|---|---|---|---|---|
| Pyannote | 1.5M | MLX (GPU) | 98.22 | 50.09 | 0.19 | 0.358 |
| Silero v5 | 309K | CoreML (ANE) | 97.52 | 33.29 | 2.69 | 0.022 |
| Silero v5 | 309K | MLX (GPU) | 95.98 | 21.02 | 5.88 | 0.027 |
| FireRedVAD | 588K | CoreML (ANE) | 94.21 | 40.12 | 5.05 | 0.007 |
공개된 수치와의 비교
| 모델 | F1% | FAR% | MR% | 파라미터 | 데이터셋 |
|---|---|---|---|---|---|
| Pyannote (자체) | 98.22 | 50.09 | 0.19 | 1.5M | VoxConverse |
| FireRedVAD (논문) | 97.57 | 2.69 | 3.62 | 588K | FLEURS-VAD-102 |
| Silero (자체) | 95.98 | 21.02 | 5.88 | 309K | VoxConverse |
| Silero-VAD (논문) | 95.95 | 9.41 | 3.95 | 309K | FLEURS-VAD-102 |
| FireRedVAD (자체) | 94.21 | 69.33 | 5.05 | 588K | VoxConverse |
FireRedVAD는 가장 낮은 거짓 알람률(2.52%)로 FLEURS에서 99.12% F1을 달성하며 실시간의 135배로 실행됩니다. Silero v5는 청크당 32 ms의 최고의 스트리밍 옵션을 제공합니다.
화자 임베딩
추출 지연
20초 오디오 클립, 워밍업 후 10회 반복.
| 모델 | 차원 | 백엔드 | 지연 |
|---|---|---|---|
| CAM++ (3D-Speaker) | 192 | CoreML (ANE) | 12 ms |
| WeSpeaker ResNet34-LM | 256 | MLX (GPU) | 64 ms |
| WeSpeaker ResNet34-LM | 256 | CoreML (ANE) | 143 ms |
임베딩 품질 (VoxConverse)
5개의 다화자 녹음에서 세그먼트 수준 임베딩 간 코사인 유사도. 분리도가 높을수록 화자 구별이 더 우수합니다.
| 모델 | 백엔드 | 화자 내 | 화자 간 | 분리도 |
|---|---|---|---|---|
| WeSpeaker | MLX | 0.726 | 0.142 | 0.584 |
| WeSpeaker | CoreML | 0.726 | 0.143 | 0.582 |
| CAM++ | CoreML | 0.723 | 0.395 | 0.328 |
세 엔진 모두 Python pyannote 레퍼런스 (분리도 0.577, 코사인 유사도 >0.96)와 일치합니다. WeSpeaker는 MLX와 CoreML 모두에서 0.584의 분리도를 달성합니다. CAM++는 양호한 분리도(0.328)를 유지하면서 5배 더 빠르게 (12 ms 대 65 ms) 실행됩니다.
소스 분리 — SDR
MUSDB18-HQ (50개의 풀 길이 테스트 트랙, 스테레오 44.1kHz)에서의 신호 대 왜곡비(SDR). 높을수록 좋습니다. 두 모델 크기: HQ (스템당 8.9M 파라미터)와 L (스템당 28.3M 파라미터).
| 대상 | UMX-HQ (MLX) | UMX-L (MLX) | UMX-HQ (논문) |
|---|---|---|---|
| 보컬 | 6.23 dB | 약 10.5 dB | 6.32 dB |
| 드럼 | 6.44 dB | 약 7.0 dB | 5.73 dB |
| 베이스 | 4.56 dB | 약 5.5 dB | 5.23 dB |
| 기타 | 3.41 dB | 약 4.5 dB | 4.02 dB |
| 모델 | 스템당 파라미터 | 크기 | RTF | 속도 |
|---|---|---|---|---|
| Open-Unmix HQ | 8.9M | 136 MB | 0.23 | 실시간의 4.3배 |
| Open-Unmix L | 28.3M | 432 MB | 0.21 | 실시간의 4.8배 |
UMX-HQ는 경량 8.9M 모델로 보컬과 드럼에서 공개된 SDR과 일치합니다. UMX-L은 모델 크기의 3배로 +2–4 dB 향상을 제공합니다. 둘 모두 multichannel Wiener EM 후처리 필터링을 포함하며 Apple Silicon에서 실시간보다 빠르게 실행됩니다.
Android — 온디바이스(Galaxy S23)
삼성 Galaxy S23(SM-S918B), arm64, CPU 전용에서 측정했으며 표시된 곳은 INT8입니다. RTF는 실행 시간 ÷ 오디오(낮을수록 실시간보다 빠름; <1.0은 실시간), Peak RSS는 실행 중 모델의 상주 메모리입니다. STT는 20 초 클립, TTS는 RTF 또는 첫 오디오까지의 시간(TTFA)을 보고합니다.
| Model | Task | Runtime | Speed | Peak RSS |
|---|---|---|---|---|
| Parakeet-EOU 120M | Streaming STT + EOU | ONNX INT8 | 0.21 RTF | 232 MB |
| Omnilingual CTC 300M | Multilingual STT | LiteRT | 0.15 RTF | 831 MB |
| Nemotron Streaming 0.6B | Streaming STT | LiteRT | 0.67 RTF | 1.30 GB |
| Parakeet-TDT 0.6B | STT (batch) | ONNX INT8 | 0.082 RTF | 1.15 GB |
| Supertonic-3 99M | TTS (preset voice) | LiteRT | 0.34 RTF · ~1.1 s TTFA | 832 MB |
| Kokoro-82M | TTS (preset voice) | ONNX FP32 | 0.53 RTF | 640 MB |
핵심: Parakeet-EOU-120M은 약 232 MB로 여기서 가장 가벼운 STT입니다. 다국어(유럽 25개 언어), 스트리밍, 발화 종료 감지 내장으로 0.6B Parakeet보다 약 5–6× 가볍습니다. ONNX의 CPU 메모리 아레나 비활성화(현재 기본값)로 Parakeet-TDT가 약 1.34 GB에서 약 1.15 GB로 줄었습니다.
재현
# ASR 벤치마크 (LibriSpeech test-clean)
make build
python scripts/benchmark_asr.py --batch --engine qwen3 --model 0.6B
python scripts/benchmark_asr.py --batch --engine qwen3 --model 0.6B-8bit
python scripts/benchmark_asr.py --batch --engine parakeet
python scripts/benchmark_asr.py --batch --engine parakeet --model int8
# ASR 다언어 (FLEURS, 자동 다운로드)
python scripts/benchmark_asr.py --dataset fleurs --language en_us --batch
# TTS 왕복
python scripts/benchmark_tts.py --compare
# VAD 비교
python scripts/benchmark_vad.py --compare
# 화자 임베딩 비교
python scripts/benchmark_speaker.py --compare
# 소스 분리 (MUSDB18-HQ, Zenodo에서 다운로드)
python scripts/benchmark_separation.py --data-dir benchmarks/data/musdb18-hq