Use case · Pipeline

Diarized transcription.
Every speaker named.

From a meeting recording or a call file to a fully-attributed transcript — speech recognition, speaker diarization, and speaker identification stitched into one on-device pipeline. No cloud APIs, no per-minute pricing, no data leaving the device.

What you can build

Four shapes of the same pipeline.

Each shape stitches an ASR + a diarizer + an optional speaker-ID enrolment store. The components are interchangeable; what you choose depends on the audio source and your latency budget.

Meeting minutes

"Alice said …" / "Bob said …" attribution from a single Zoom export.

Call-center analytics

Agent vs. caller turns, sentiment per speaker, on-device for compliance.

Podcast transcripts

Host + guests identified across the episode, word-level timestamps.

Legal / interview records

Court-grade attribution with no audio ever leaving the device.

Recommended stack

Each stage runs on-device.

Defaults are tuned for accuracy on cleanly-recorded audio. Swap in the alternatives when your input differs (noisy room, streaming pipeline, long-tail language, iOS Neural Engine constraints).

StageDefaultAlternativesWhen
Pre-clean (optional)DeepFilterNet3—Noisy room, phone audio, far-field mics.
Speech recognitionQwen3-ASR 0.6BQwen3-ASR 1.7B, Parakeet TDT, Omnilingual, Nemotron1.7B for lowest WER, Parakeet for iOS, Omnilingual for long-tail languages, Nemotron for streaming.
Speaker diarizationPyannote (default)Community-1 (full pipeline), Sortformer (streaming)Community-1 adds bounded speaker counts and returned centroids with native PLDA/VBx, but uses substantially more memory and latency than the default Pyannote engine.
Speaker identificationWeSpeaker ResNet34CAM++256-d vs 192-d embeddings — cosine match against enrolled voices.
Word-level alignmentForced AlignerBuilt into Qwen3-ASR / Parakeet outputsUse forced alignment for retroactive word timing.
Quickstart

Transcribe words and inspect speaker segments.

After installing the CLI on Apple Silicon, transcribe a recording and inspect speaker segments with separate commands.

Print the recognized words in Terminal.

speech transcribe meeting.wav

Inspect speaker labels and time ranges as JSON, or use --rttm for RTTM.

speech diarize meeting.wav --json

These commands return separate results. They do not produce a transcript with speaker labels or match enrolled voices.

Save one plain-text transcript per WAV recording in a folder:

speech transcribe-batch recordings/ --extensions wav --output-dir transcripts/
M4A to text on Mac: complete walkthrough
Choosing an ASR engine

Pick the engine that matches your audio.

All ASR models work with the same diarization + speaker-ID pipeline, so swapping is a one-flag change.

NeedPickWhyBackend
Best accuracyQwen3-ASR 1.7B 8-bitLowest WER across 52 languagesMLX
Whisper baselineWhisper Large-v3 TurboNative CoreML runtime in speech-swift; ONNX exports for speech-coreCoreML, ONNX
Real-time streamingNemotron StreamingRNN-T, sub-100 ms per chunk, native punctuationCoreML
iOS / Neural EngineParakeet TDTFastConformer, 32× real-time, runs on the Apple Neural EngineCoreML
Long-tail languagesOmnilingual ASR1,672 languages via Meta wav2vec2 + CTCCoreML, MLX
Android / Linux / WindowsParakeet TDT v3114 languages, INT8; platform setup and model matrixONNX Runtime
Deeper reading

Component guides.