Cohere Transcribe 03-2026

June 28, 2026 · View on GitHub

Cohere's CohereLabs/cohere-transcribe-03-2026 ported to transcribe.cpp. A Conformer encoder with a Transformer encoder-decoder head (cross-attention, tied token embedding).

What it's for

Offline multilingual speech-to-text covering 14 languages: English, French, German, Spanish, Italian, Portuguese, Dutch, Polish, Greek, Arabic, Japanese, Chinese, Vietnamese, Korean. The model takes a 16 kHz mono WAV and produces a transcript. Cohere uses an encoder-decoder with cross-attention, decoding is autoregressive.

See Cohere's model card for training data, intended use, and upstream evaluation methodology.

Licensed Apache-2.0. Ported from upstream commit 76b8b23, pinned 2026-04-16.

Input limits

Accepts up to about 6.7 minutes (400 s) of 16 kHz mono audio per call — the encoder's positional table is the binding limit. Longer audio is rejected up front with TRANSCRIBE_ERR_INPUT_TOO_LONG rather than silently truncated; split it into shorter segments. See the input-length contract.

Download

QuantizationDownloadSizeWER (LibriSpeech test-clean)
BF16cohere-transcribe-03-2026-BF16.gguf4.10 GB1.26%
F16cohere-transcribe-03-2026-F16.gguf4.11 GB1.26%
Q8_0cohere-transcribe-03-2026-Q8_0.gguf2.41 GB1.27%
Q6_Kcohere-transcribe-03-2026-Q6_K.gguf1.97 GB1.27%
Q5_K_Mcohere-transcribe-03-2026-Q5_K_M.gguf1.76 GB1.25%
Q4_K_Mcohere-transcribe-03-2026-Q4_K_M.gguf1.55 GB1.25%

WER is measured on the full LibriSpeech test-clean split (2620 utterances) with greedy decoding and no external LM. BF16 reference baseline: 1.26%. Cohere's self-reported number on the same split is 1.25% (Open ASR Leaderboard, as of 2026-03-26). Text normalizer: Whisper EnglishTextNormalizer — the same normalizer the Open ASR Leaderboard uses, so the comparison is apples-to-apples.

Quick Start

cmake -B build
cmake --build build

build/bin/transcribe-cli \
  -m models/cohere-transcribe-03-2026/cohere-transcribe-03-2026-F16.gguf \
  samples/jfk.wav

If your audio is not already 16 kHz mono WAV, convert it first:

ffmpeg -i input.mp3 -ar 16000 -ac 1 output.wav

Performance

Cells are wall-clock latency (mean over 3 iterations after 1 warmup), with speedup over realtime in parentheses. Units: ms below 1 s, s above (2 decimal places).

Apple M4 Max

BackendSampleQ8_0Q4_K_M
Metaljfk (11.0s)150 ms (74×)154 ms (71×)
Metaldots (35.3s)491 ms (72×)465 ms (76×)
CPUjfk (11.0s)1.21 s (9×)1.05 s (11×)
CPUdots (35.3s)4.13 s (9×)3.49 s (10×)

macOS 26.4.1, transcribe.cpp e0fa0f6.

AMD Ryzen 7 4750U Pro

BackendSampleQ8_0Q4_K_M
Vulkanjfk (11.0s)1.43 s (8×)1.33 s (8×)
Vulkandots (35.3s)4.25 s (8×)4.25 s (8×)
CPUjfk (11.0s)3.57 s (3×)2.90 s (4×)
CPUdots (35.3s)12.40 s (3×)10.08 s (4×)

Fedora 43, transcribe.cpp 2ab01b8. Vulkan device: AMD Radeon Graphics (RADV RENOIR).

Benchmark reproduction:

uv run scripts/bench/run.py \
  --models cohere-transcribe-03-2026 \
  --quants q8_0,q4_k_m \
  --samples jfk,dots \
  --backends metal,cpu,vulkan \
  --iters 3 --warmup 1 \
  --name cohere-transcribe-03-2026-publication

Numerical Validation

transcribe.cpp is validated tensor-by-tensor against the Transformers reference implementation on samples/jfk.wav. All 22 checkpointed tensors fall within family tolerance, and the final transcript matches the reference verbatim. Last validated at commit bf0d0b7.

FieldValue
ReferenceTransformers, CohereLabs/cohere-transcribe-03-2026
Dump scriptscripts/dump_reference_cohere_transformers.py
Manifesttests/golden/cohere/cohere-transcribe-03-2026.manifest.json
Commanduv run scripts/validate.py compare --family cohere

Selected tensors:

TensorMax abs diffMean abs diffNotes
enc.mel.in2.678e-014.238e-03fp64 vs fp32 STFT precision gap
enc.pre_encode.out8.794e+003.049e-02Mel gap propagated through pre-encoder
enc.block.0.out4.542e+001.939e-02Early encoder
enc.block.23.out3.173e+003.118e-02Mid-encoder
enc.block.47.out2.039e-014.615e-03Final encoder block
enc.final2.039e-014.615e-03Encoder output
enc_dec_proj.out3.693e-011.074e-02Encoder→decoder projection
dec.token_emb2.980e-082.910e-12Exact within fp32 round-off
dec.pos_emb0.000e+000.000e+00Exact
dec.embed_norm1.241e-011.327e-03LayerNorm output
dec.block.0.out3.409e+002.491e-02Early decoder
dec.block.7.out3.177e+011.416e-01Final decoder block (accumulated)
dec.out_before_head2.465e-011.339e-02Pre-head projection
dec.logits_raw6.675e-013.328e-02Raw logits
dec.logitsnannanSoftmax: -inf entries produce nan; first diff index 114692 is masked

The expected divergence is in the frontend: C++ runs the STFT in fp64 where the reference runs fp32. The gap enters at the mel spectrogram, propagates through the encoder, and attenuates to a few tenths by the final encoder block. Decoder numerics track the reference within fp32 round-off on the first autoregressive step.

Reproduction

Convert

Downloads the upstream HF repo via huggingface-cli (or an existing local clone) and converts with the family-specific script. Output path is derived from the repo id.

uv run --project scripts/envs/cohere \
  scripts/convert-cohere.py CohereLabs/cohere-transcribe-03-2026

Quantize

Run transcribe-quantize once per target quant. Example for F16; repeat with Q8_0, Q6_K, Q5_K_M, Q4_K_M:

build/bin/transcribe-quantize \
  models/cohere-transcribe-03-2026/cohere-transcribe-03-2026-BF16.gguf \
  models/cohere-transcribe-03-2026/cohere-transcribe-03-2026-F16.gguf \
  --quant F16

Validate

uv run scripts/validate.py all --family cohere

Run real-model tests

cmake -B build -DTRANSCRIBE_BUILD_REAL_MODEL_TESTS=ON
cmake --build build

TRANSCRIBE_COHERE_GGUF=models/cohere-transcribe-03-2026/cohere-transcribe-03-2026-BF16.gguf \
  ctest --test-dir build --output-on-failure -R 'cohere'