Skip to content

Transcription

Pipeline

  1. Decode recording.m4a; delay the mic track by micDelayMs; AEC3 on the mic against the system track.
  2. Resample to 16 kHz; Silero VAD (FluidAudio) finds speech segments per track.
  3. ASR per segment with the configured model. A voiced segment that decodes empty is retried with the model's second pass when beamRetry = true (Parakeet only; Whisper has its own fallback).
  4. Diarization of the system track (pyannote community-1 via FluidAudio): far-end speakers become S1..SN in the order they first speak, capped by maxSpeakers. The mic track is always you.
  5. Merge, sort by time, write transcript.json + transcript.md; pipeline.log records every stage's timing, model ids and warnings.

Re-run with different knobs from the meeting toolbar (Re-transcribe) or rex transcribe <folder>.

Models

id Engine Notes
parakeet-tdt-0.6b-v2 (default) FluidAudio CoreML English, fast, word timings + confidence
parakeet-tdt-0.6b-v3 FluidAudio CoreML Multilingual
whisper-tiny / whisper-base / whisper-small WhisperKit CoreML Small, multilingual, lower accuracy
whisper-large-v3-turbo WhisperKit CoreML Good accuracy, ≈1.6 GB
whisper-large-v3 WhisperKit CoreML Best accuracy, ≈3 GB, slow
whisper-distil-large-v3 WhisperKit CoreML English, between turbo and large

Settings › Transcription lists every model with its size (approximate until downloaded), download / remove buttons and the cache folder. Downloads never start while recording. Models unload after [models] idleMinutes by default (unloadPolicy = keep | idle | immediate).

Speakers

  • [speakers] you is the label for the mic track; unknownLabel = "Speaker {n}" formats the others. Rename a speaker by clicking its chip in the transcript: the label is rewritten in transcript.json, transcript.md and meeting.json.speakers.map - segment text never changes.
  • diarizer picks how voices are clustered. Both options use the same pyannote segmentation and WeSpeaker embedding models; pyannote-community-1-vbx (default) scores the whole recording with PLDA and VBx re-clustering, which keeps one voice together far better on long meetings. pyannote-community-1 is the streaming clustering from earlier releases.
  • maxSpeakers drops the least talkative speakers beyond the cap (VBx caps the clustering itself). With capSpeakersToInvitees (default on) and an invite list, the cap becomes the number of invitees other than you, so a two-person call cannot split into three voices. An uninvited joiner is folded into the closest voice; re-transcribe with the cap off or a higher maximum.
  • speakerThreshold (40–90, default 70) is the cosine-distance cutoff in percent for "same voice" in the streaming diarizer: lower splits voices more readily, higher merges similar voices. VBx uses its own tuned threshold and ignores it. Tune per meeting from the Re-transcribe sheet before changing the default.

Confidence

Segments carry the engine's confidence; words carry theirs when the engine provides them. In the transcript view a segment under the threshold ([ui] lowConfidencePercent, default 60 %, in Settings › Transcription) shows a Low confidence (n%) caption, and words a tenth below the threshold get a dotted underline, so you know where to check against the audio. Exports do not include confidence except json.

Player

The meeting detail view plays the recording with per-track mute/volume, speed, a level-bar scrubber, click-to-seek on any segment, space / ← / → keys, and highlights the current segment.