🕌 Cohere-ar-tashkeel
Arabic Speech → Fully-Diacritized Text · التَّشْكِيل مِنَ الصَّوْت
Restores every ḥaraka — fatḥa, ḍamma, kasra, sukūn, shadda, tanwīn, and case-endings (iʿrāb) — directly from the audio, in a single pass.
📊 Performance at a glance
| 🎯 Diacritic Accuracy | 📉 DER · with iʿrāb | 📉 DER · no iʿrāb | 🔤 Letter WER |
|---|
| 95.30% | 6.62% | 5.67% | 10.13% |
Diacritic accuracy = correct ḥaraka placement on letters the model recognized correctly.
✨ What it does
Cohere-ar-tashkeel takes spoken Arabic and returns fully-voweled text. Instead of guessing diacritics from an unvoweled skeleton, it infers them from how the words are actually pronounced — so the output reflects the real reading, not a statistical best-guess.
It is built on
Cohere Labs' cohere-transcribe-arabic-07-2026 (a ~2B-parameter Arabic/English speech model) and specialized for acoustic diacritization.
🎧 Why diacritize from speech?
Restoring tashkeel from text alone is inherently ambiguous — one consonantal skeleton (رَسْم) maps to many valid voweled readings, and text-only tools must guess which one was intended. Speech removes that ambiguity: the vowels and grammatical endings are audible. This model simply listens and writes them down.
That is exactly why it excels at the hardest part of tashkeel — case-endings / iʿrāb (إِعْرَاب) — the word-final marks that text-only systems most often get wrong.
📈 Results
Evaluated on a held-out set of 260 natural Arabic speech clips.
| Metric | Score | What it measures |
|---|
| Diacritic accuracy | 95.30% | Correct ḥaraka on correctly-recognized letters — the purest tashkeel-quality signal. |
| DER — with case-endings | 6.62% | Diacritic Error Rate over all letters, including word-final iʿrāb. |
| DER — excluding case-endings | 5.67% | DER on word-internal diacritics only. |
| WER — undiacritized | 10.13% | Letter-level speech-recognition accuracy. |
| WER — fully diacritized | 24.35% | Strict: any single wrong ḥaraka marks the whole word wrong. |
How to read this: when the model hears a letter correctly, it places the right diacritic on it 95.3% of the time, and only ~1 diacritic in 15 is wrong even including the tricky grammatical endings. Diacritized WER is strict by design and reads high — DER and diacritic accuracy are the meaningful diacritization metrics.
📝 Example outputs
Fully-diacritized transcriptions produced by the model:
| # | النَّصُّ المُشَكَّل |
|---|
| ١ | السَّيِّدْ أُوكِي أُورَامَا رَئِيسُ مَجْلِسِ إِدَارَةِ بَنْكِ التَّنْمِيَةِ الْإِفْرِيقِيّ |
| ٢ | وَالْبُذُورْ لِضَمَانِ نَجَاحِ الْمُوسِمِ الزِّرَاعِيِّ الْقَادِمْ |
| ٣ | نِصْفُ الرِّبْحِ لِرَبِّ الْمَالِ خَاصَّةً ، لِأَنَّ الْمُضَارَبَةَ فِيهِ فَاسِدَةٌ |
🚀 Usage
The model is fully self-contained — it loads and runs just like the Cohere ASR base model (the fine-tuned weights are already merged in).
1import torch, soundfile as sf, librosa
2from transformers import AutoProcessor, CohereAsrForConditionalGeneration
3
4repo = "NAMAA-Space/Cohere-Speech-Tashkeel-2B"
5proc = AutoProcessor.from_pretrained(repo)
6model = CohereAsrForConditionalGeneration.from_pretrained(
7 repo, dtype=torch.bfloat16, device_map="auto"
8).eval()
9
10# load audio as 16 kHz mono
11wav, sr = sf.read("your_audio.wav", dtype="float32")
12if wav.ndim > 1:
13 wav = wav.mean(1)
14if sr != 16000:
15 wav = librosa.resample(wav, orig_sr=sr, target_sr=16000)
16
17feats = proc.feature_extractor(
18 [wav], sampling_rate=16000, return_tensors="pt",
19 padding="longest", return_attention_mask=True,
20)
21audio_chunk_index = feats.pop("audio_chunk_index")
22
23# request the diacritized Arabic decoding
24prompt = proc.get_decoder_prompt_ids(language="ar", punctuation=True)
25decoder_input_ids = torch.tensor([prompt], dtype=torch.long, device=model.device)
26
27with torch.no_grad():
28 out = model.generate(
29 input_features=feats["input_features"].to(model.device, torch.bfloat16),
30 attention_mask=feats["attention_mask"].to(model.device),
31 decoder_input_ids=decoder_input_ids,
32 max_new_tokens=448,
33 )
34
35text = proc.decode(out, skip_special_tokens=True,
36 audio_chunk_index=audio_chunk_index, language="ar")
37print(text)
Requirements: transformers, torch, soundfile, librosa, and a CUDA GPU (bf16).
🧩 Model details
| |
|---|
| Base model | CohereLabs/cohere-transcribe-arabic-07-2026 |
| Parameters | ~2B |
| Architecture | Conformer encoder + Transformer decoder (attention encoder–decoder) |
| Task | Arabic speech → fully-diacritized text |
| Input | 16 kHz mono audio |
| Output | Diacritized Arabic text (with punctuation) |
| Precision | bfloat16 |
| License | Apache 2.0 |
⚠️ Intended use & limitations
- Intended use: fully-diacritized Arabic transcripts from audio — captioning, language learning, MSA/liturgical read-speech, TTS front-ends, and linguistic annotation where correct harakāt matter.
- Diacritization is inferred from pronunciation, so on noisy audio or unclear articulation the letters and their diacritics can degrade together — a VAD / noise gate is recommended for noisy input.
- Inherits the base model's constraints: optimized for a single pre-specified language, no timestamps or speaker diarization.
📜 Citation & attribution
Released under
Apache 2.0. A fine-tuned derivative of
CohereLabs/cohere-transcribe-arabic-07-2026 by Cohere Labs; all original terms apply.
1@misc{cohere_ar_tashkeel_2026,
2 title = {Cohere-ar-tashkeel: Arabic Speech Diacritization},
3 author = {Omer Nacar},
4 year = {2026},
5 publisher = {Hugging Face},
6 howpublished = {\url{https://huggingface.co/NAMAA-Space/Cohere-Speech-Tashkeel-2B}},
7 note = {Built on CohereLabs/cohere-transcribe-arabic-07-2026}
8}