Benchmarks
RTF (real-time factor) abaixo de 1.0 significa mais rapido que tempo real.
Apple Silicon (MLX + CoreML)
Todos os benchmarks em Apple M5 Pro, 48 GB, macOS 25.5 com builds de release e metallib compilada.
ASR — Taxa de erro de palavra
Avaliado em LibriSpeech test-clean (2620 enunciados, ~5.4 horas de fala lida em ingles).
| 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 |
Destaques: Qwen3-ASR MLX 1.7B 5-bit é o novo líder de precisão com 1.32% WER: supera WhisperKit Large-v3 Turbo (1.71%) e nosso 1.7B 8-bit (1.52%), usando ~600 MB a menos de RSS pico que 8-bit e rodando 23% mais rápido. Parakeet TDT v3 é o mais rápido para inglês (117× tempo real, 25 idiomas europeus). Omnilingual CTC 300M MLX 4-bit lidera o throughput multilíngue: 222× tempo real, 384 MB pico, 1 672 idiomas.
A linha Qwen3-ASR 0.6B CoreML reflete o encoder chunked block-attention reconstruído (aufklarer/Qwen3-ASR-CoreML). O export anterior rodava self-attention global sem máscara sobre mel com zero padding e emitia <|im_end|> logo após o primeiro ponto final (24.88% WER no mesmo fixture antes do rebuild).
Estabilidade em longa duracao (carga sustentada no Neural Engine)
200 enunciados LibriSpeech processados sequencialmente (~30 min de audio, M5 Pro). Testa se a WER ou a latencia degradam sob transcricao sustentada.
| Metrica | Primeiros 25% | Ultimos 25% | Geral |
|---|---|---|---|
| WER% | 1.30 | 1.23 | 2.43 |
| RTF | 0.672 | 0.400 | 0.539 |
Nenhuma degradacao detectada. A WER e estavel durante a sessao. O RTF na verdade melhora conforme o CoreML aquece seu cache de plano de execucao. Nenhum thermal throttling apos 42 minutos de inferencia continua no Neural Engine. O Parakeet processa cada chunk independentemente — sem acumulacao de estado entre chunks.
Resultados multilingues (FLEURS)
CER usado para idiomas CJK (sem fronteiras de palavras). Parakeet suporta ~25 idiomas europeus (sem CJK).
| Idioma | Metrica | Qwen3 4-bit | Qwen3 8-bit | Parakeet INT8 |
|---|---|---|---|---|
| Espanhol | WER | 6.44 | 5.06 | 5.18 |
| Ingles | WER | 6.57 | 5.64 | 9.30 |
| Chines | CER | 8.41 | 7.71 | — |
| Alemao | WER | 9.45 | 6.81 | 12.33 |
| Frances | WER | 11.42 | 8.50 | 13.02 |
| Japones | CER | 16.11 | 8.64 | — |
| Russo | WER | 16.35 | 10.52 | 11.49 |
| Coreano | WER | 19.95 | 6.89 | — |
| Hindi | WER | 25.93 | 18.57 | — |
| Arabe | WER | 33.47 | 20.31 | — |
Delta de compressao
Perda de precisao ao quantizar para larguras de bits menores.
| Variante | WER% | Substituicoes | Insercoes | Delecoes | Erros totais | Tamanho |
|---|---|---|---|---|---|---|
| Qwen3 0.6B 8-bit | 2.80 | 1111 | 92 | 268 | 1471 | 960 MB |
| Qwen3 0.6B 4-bit | 3.34 | 1323 | 123 | 308 | 1754 | 675 MB |
| Delta | +0.54 | +212 | +31 | +40 | +283 | -30% |
| Parakeet TDT INT8 | 2.74 | 990 | 125 | 308 | 1423 | 634 MB |
Qwen3-ASR 1.7B MLX chega a 1.32% WER em 5-bit (1.52% em 8-bit), supera WhisperKit Large-v3 Turbo (1.71%) e roda a 30-36× tempo real no Apple Silicon.
TTS — Inteligibilidade round-trip
Sintetize texto, depois transcreva o audio de volta com Qwen3-ASR 0.6B e calcule a WER contra o texto original. Avaliado em 30 frases conversacionais integradas em ingles.
| Engine | Modelo | Parametros | Tamanho | WER% | RTF |
|---|---|---|---|---|---|
| CosyVoice3 | 0.5B 4-bit | 500M | ~1.9 GB | 3.25 | 0.59 |
| Qwen3-TTS | 1.7B 4-bit | 1.7B | ~2.3 GB | 3.47 | 0.79 |
| Qwen3-TTS | 1.7B 8-bit | 1.7B | ~3.5 GB | 3.66 | 0.85 |
| Kokoro-82M | CoreML | 82M | ~170 MB | 3.90 | 0.17 |
| Qwen3-TTS | 0.6B 8-bit | 600M | ~960 MB | 9.74 | 0.76 |
| Qwen3-TTS | 0.6B 4-bit | 600M | ~675 MB | 15.58 | 0.76 |
Breakdown de latencia (Qwen3-TTS)
| Estagio | Tempo | % do total | Descricao |
|---|---|---|---|
| Embed | 1-3 ms | <1% | Embedding de texto (TTFT) |
| Generate | 2-6 s | ~92% | Tokens de codec autoregressivos |
| Decode | 244-457 ms | ~8% | Decodificador de codec para waveform |
Todos os engines TTS rodam mais rapido que tempo real (RTF < 1.0). CosyVoice3 lidera em inteligibilidade (3.25% WER). Kokoro e o mais rapido (RTF 0.17) com apenas 170 MB.
VAD — Precisao de deteccao
Avaliacao FLEURS (10 idiomas, 250 arquivos)
Avaliado contra o ground truth de referencia do Python FireRedVAD no mesmo limiar.
| Engine | Parametros | Backend | 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 |
Avaliacao VoxConverse (multi-locutor)
5 arquivos de conversa multi-locutor avaliados em resolucao de frame de 10 ms.
| Engine | Parametros | Backend | 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 |
Comparacao com numeros publicados
| Modelo | F1% | FAR% | MR% | Parametros | Dataset |
|---|---|---|---|---|---|
| Pyannote (nossos) | 98.22 | 50.09 | 0.19 | 1.5M | VoxConverse |
| FireRedVAD (paper) | 97.57 | 2.69 | 3.62 | 588K | FLEURS-VAD-102 |
| Silero (nossos) | 95.98 | 21.02 | 5.88 | 309K | VoxConverse |
| Silero-VAD (paper) | 95.95 | 9.41 | 3.95 | 309K | FLEURS-VAD-102 |
| FireRedVAD (nossos) | 94.21 | 69.33 | 5.05 | 588K | VoxConverse |
FireRedVAD atinge 99.12% F1 no FLEURS com a menor taxa de falso alarme (2.52%) e roda a 135x tempo real. Silero v5 oferece a melhor opcao de streaming com 32 ms por chunk.
Embeddings de falante
Latencia de extracao
Clipe de audio de 20 segundos, 10 iteracoes apos warmup.
| Modelo | Dim | Backend | Latencia |
|---|---|---|---|
| CAM++ (3D-Speaker) | 192 | CoreML (ANE) | 12 ms |
| WeSpeaker ResNet34-LM | 256 | MLX (GPU) | 64 ms |
| WeSpeaker ResNet34-LM | 256 | CoreML (ANE) | 143 ms |
Qualidade de embedding (VoxConverse)
Similaridade de cosseno entre embeddings de nivel de segmento em 5 gravacoes multi-locutor. Maior separacao = melhor discriminacao de falante.
| Modelo | Backend | Intra-locutor | Inter-locutor | Separacao |
|---|---|---|---|---|
| WeSpeaker | MLX | 0.726 | 0.142 | 0.584 |
| WeSpeaker | CoreML | 0.726 | 0.143 | 0.582 |
| CAM++ | CoreML | 0.723 | 0.395 | 0.328 |
Os tres engines correspondem a referencia Python pyannote (separacao de 0.577, similaridade de cosseno >0.96). WeSpeaker atinge 0.584 de separacao em MLX e CoreML. CAM++ roda 5x mais rapido (12 ms vs 65 ms) com boa separacao (0.328).
Separacao de fontes — SDR
Relacao sinal-distorcao (SDR) no MUSDB18-HQ (50 faixas de teste completas, estereo 44.1 kHz). Maior e melhor. Dois tamanhos de modelo: HQ (8.9M params/stem) e L (28.3M params/stem).
| Alvo | UMX-HQ (MLX) | UMX-L (MLX) | UMX-HQ (publicado) |
|---|---|---|---|
| Vocal | 6.23 dB | ~10.5 dB | 6.32 dB |
| Bateria | 6.44 dB | ~7.0 dB | 5.73 dB |
| Baixo | 4.56 dB | ~5.5 dB | 5.23 dB |
| Outros | 3.41 dB | ~4.5 dB | 4.02 dB |
| Modelo | Params/stem | Tamanho | RTF | Velocidade |
|---|---|---|---|---|
| Open-Unmix HQ | 8.9M | 136 MB | 0.23 | 4.3x tempo real |
| Open-Unmix L | 28.3M | 432 MB | 0.21 | 4.8x tempo real |
UMX-HQ iguala o SDR publicado em vocal e bateria com um modelo leve de 8.9M. UMX-L fornece melhoria de +2–4 dB com 3x o tamanho do modelo. Ambos incluem pos-filtragem multichannel Wiener EM e rodam mais rapido que tempo real em Apple Silicon.
Android — no dispositivo (Galaxy S23)
Medido num Samsung Galaxy S23 (SM-S918B), arm64, apenas CPU, INT8 quando indicado. O RTF é tempo ÷ áudio (menor = mais rápido que tempo real; <1.0 = tempo real); Peak RSS é a memória residente do modelo. STT usa um clipe de 20 s; TTS indica o RTF ou o tempo até ao primeiro áudio (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 |
Destaque: Parakeet-EOU-120M é o STT mais leve aqui, com ~232 MB – multilíngue (25 idiomas europeus), em streaming e com deteção de fim de turno integrada, cerca de 5–6× menor que o Parakeet de 0.6B. Desativar a arena de memória de CPU do ONNX (agora padrão) reduziu o Parakeet-TDT de ~1.34 GB para ~1.15 GB.
Reproducao
# ASR benchmarks (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 multilingual (FLEURS, auto-download)
python scripts/benchmark_asr.py --dataset fleurs --language en_us --batch
# TTS round-trip
python scripts/benchmark_tts.py --compare
# VAD comparison
python scripts/benchmark_vad.py --compare
# Speaker embeddings comparison
python scripts/benchmark_speaker.py --compare
# Source separation (MUSDB18-HQ, download from Zenodo)
python scripts/benchmark_separation.py --data-dir benchmarks/data/musdb18-hq