arabic-audio-reader-worker / docs /research-watchlist.md
Syncre's picture
Deploy Arabic Audio Reader worker
2e1a095 verified
|
Raw
History Blame Contribute Delete
106 kB

Free Arabic OCR/TTS Research Watchlist

Use this file to evaluate new free models without changing the production default first. A candidate should become a default only after it wins on a representative Arabic book sample and produces listenable audio. License policy: production/default entries must use a permissive or explicitly acceptable license; uncertain, non-commercial, Llama-licensed, and correction-risk entries stay benchmark-only until reviewed.

Candidate Type Role Status License Hardware Source
QARI-OCR 0.4 ocr Arabic-book OCR upgrade wired optional sidecar Apache-2.0 GPU or strong CPU worker; 4B VLM https://huggingface.co/NAMAA-Space/Qari-OCR-0.4.0-VL-4B-Instruct
QARI-OCR 0.4 GGUF ocr portable QARI packaging benchmark not wired; benchmark externally first Apache-2.0 via QARI 0.4 model card; confirm GGUF packaging metadata before production strong worker or local llama.cpp/GGUF runner; QARI 0.4 packaging https://huggingface.co/marwan-osama/Qari-OCR-0.4.0-VL-4B-Instruct-GGUF
PaddleOCR-VL-1.6 ocr general document parser upgrade wired optional sidecar Apache-2.0 strong worker; 0.9B document VLM https://huggingface.co/PaddlePaddle/PaddleOCR-VL-1.6
oi-OCR ocr Arabic-capable document parser benchmark not wired; benchmark externally first Apache-2.0 strong worker or external benchmark; PDF/document parser https://huggingface.co/oi-uae/oi-OCR
NuExtract3 ocr multilingual document-to-Markdown OCR benchmark not wired; benchmark externally first Apache-2.0 GPU/large worker; 4B Qwen3.5 VLM, vLLM path recommended https://huggingface.co/numind/NuExtract3
Qianfan-OCR ocr large multilingual document-intelligence OCR benchmark not wired; benchmark externally first Apache-2.0 GPU/large worker; 5B BF16 VLM, no hosted inference provider https://huggingface.co/baidu/Qianfan-OCR
Chandra OCR 2 ocr multilingual structured document OCR benchmark not default; OpenRAIL weights and GPU-heavy Apache-2.0 code; modified OpenRAIL-M model weights GPU/large worker; 4B OCR model, vLLM path recommended https://github.com/datalab-to/chandra
dots.ocr ocr compact multilingual document-layout OCR benchmark not wired; benchmark externally first MIT GPU/strong worker; compact 1.7B document parser, vLLM path recommended https://huggingface.co/rednote-hilab/dots.ocr
olmOCR Arabic LoRA v2 ocr full-page Arabic manuscript OCR benchmark not wired; benchmark externally first Apache-2.0 adapter; confirm base model license/runtime before production GPU/large worker; 7B olmOCR/Qwen2.5-VL base plus LoRA adapter https://huggingface.co/hastyle/olmOCR-arabic-lora-v2
Arabic Large Nougat ocr Arabic book page OCR-to-Markdown benchmark not default; GPL-3.0 and benchmark externally first GPL-3.0 GPU/strong worker; 0.4B VisionEncoderDecoder/Nougat-style model https://huggingface.co/MohamedRashad/arabic-large-nougat
DocTR Arabic FAST/PARSEQ ocr classic Arabic OCR detector/recognizer benchmark not wired; benchmark externally first Apache-2.0 detector; recognition card lacks clear metadata, confirm before production CPU/GPU worker; DocTR detector plus Arabic PARSEQ recognizer https://huggingface.co/madskills/doctr-fast_base-arabic
Kraken/eScriptorium Arabic script ocr open-source historical Arabic-script OCR benchmark not wired; benchmark externally first Apache-2.0 engine; model license depends on selected Kraken model CPU/GPU external benchmark; best with line segmentation and Arabic-script models https://kraken.re/main/index.html
Kairawan/Qalamus manuscript OCR ocr free Arabic manuscript OCR service signal not wired; service-only benchmark signal free web service; engine/package license not established external web service; not a reusable local worker package https://kairawan.org/
GLM-OCR Arabic/French documents ocr Arabic administrative/document OCR benchmark not wired; benchmark externally first check model card/base license before production use GPU/strong worker; GLM-OCR LoRA fine-tune https://huggingface.co/maloukafer/GLM-OCR-finetuned-documents
mimoha Arabic OCR ocr minimal Arabic OCR model-card watchlist not wired; benchmark externally first Apache-2.0 external benchmark; sparse card and no inference provider https://huggingface.co/mimoha/ocr
KATIB 0.8B ocr light Arabic-trained OCR VLM wired optional sidecar Apache-2.0 smaller worker than QARI; 0.8B VLM https://huggingface.co/oddadmix/Katib-Qwen3.5-0.8B-0.1
Arabic-GLM-OCR-v2 ocr recent Arabic OCR VLM sidecar wired optional sidecar Apache-2.0 strong worker; GLM-OCR fine-tune https://huggingface.co/sherif1313/Arabic-GLM-OCR-v2
Arabic-Qwen3.5-OCR-v4 ocr small Arabic OCR VLM sidecar wired optional sidecar Apache-2.0 strong worker; 0.9B OCR VLM https://huggingface.co/sherif1313/Arabic-Qwen3.5-OCR-v4
aNS Qwen3-VL Arabic OCR v3 ocr fresh Qwen3-VL Arabic OCR benchmark candidate not wired; benchmark externally first check model card/base license before production use GPU/strong worker; Qwen3-VL-2B fine-tune https://huggingface.co/aNS2024/qwen3-vl-arabic-ocr-v3
Waraqon v3 Arabic OCR HTML Qari ocr Qari-family structured HTML OCR benchmark not wired; benchmark externally first Apache-2.0 GPU/strong worker; Qwen2-VL/Qari LoRA path https://huggingface.co/FatimahEmadEldin/Waraqon-v3-Arabic-OCR-HTML-Qari
DeepSeek-OCR-2 ocr latest general document OCR VLM benchmark candidate not wired; benchmark externally first Apache-2.0 GPU/large worker; 3B DeepSeek OCR VLM https://huggingface.co/deepseek-ai/DeepSeek-OCR-2
DeepSeek Arabic OCR v6 ocr DeepSeek-OCR Arabic benchmark candidate not wired; benchmark externally first Apache-2.0 GPU/large worker; 3B DeepSeek-OCR fine-tune https://huggingface.co/melsiddieg/deepseek_ocr_arabic_v6
Loay Arabic-OCR-DeepSeek-OCR-2 ocr Arabic DeepSeek-OCR-2 layout benchmark candidate not wired; benchmark externally first Apache-2.0 GPU/large worker; 3B DeepSeek-OCR-2 fine-tune https://huggingface.co/loay/Arabic-OCR-DeepSeek-OCR-2
Arabic-English handwritten OCR v3 ocr handwriting/manuscript OCR benchmark candidate not wired; benchmark externally first Apache-2.0 strong worker; Qwen2.5-VL 3B-class model, 7.5GB model assets https://huggingface.co/sherif1313/Arabic-English-handwritten-OCR-v3
Arabic handwritten OCR 4-bit Qwen2.5-VL ocr lighter quantized handwriting/manuscript OCR benchmark not wired; benchmark externally first Apache-2.0 strong worker; 4-bit Qwen2.5-VL 3B-class model, about 2.44GB model assets https://huggingface.co/sherif1313/Arabic-handwritten-OCR-4bit-Qwen2.5-VL-3B-v3
NAKBA Arabic manuscript line OCR baseline ocr Arabic manuscript line-transcription benchmark not wired; benchmark externally first check model card/base license before production use large GPU/strong worker; Qwen3-VL-8B LoRA baseline, H100 used in reported evaluation https://huggingface.co/U4RASD/ar-ms-baseline
HAFITH ocr historical Arabic manuscript line OCR benchmark not wired; benchmark externally first Apache-2.0 GPU/strong worker likely; 642M line OCR model with line segmentation required https://huggingface.co/mdnaseif/hafith
Glimpse RTL OCR ocr Arabic/Persian RTL text-line OCR benchmark not wired; benchmark externally first Apache-2.0 GPU/strong worker likely; 1B text-line VLM fine-tune https://huggingface.co/surfiniaburger/unsloth_finetune_ocr_arabic
Arabic OCR Qwen2.5-VL GGUF ocr QariOCR-trained Arabic/English GGUF OCR benchmark not wired; benchmark externally first check model card/base license before production use large GPU/strong worker; Qwen2.5-VL 7B-class GGUF/Unsloth path https://huggingface.co/mo1998/arabic-ocr-qwen2.5-vl
Qwen3-VL Persian/Arabic line OCR ocr line-level Persian/Arabic OCR benchmark candidate not wired; benchmark externally first Apache-2.0 strong worker; Qwen3-VL 2B line-level OCR model https://huggingface.co/mohajesmaeili/Qwen3-VL-2B-Persian-Arabic-Ocr-v1.0
Loay Arabic-OCR-Qwen2.5-VL-7B ocr large Arabic OCR VLM benchmark candidate not wired; benchmark externally first Apache-2.0 via Qwen2.5-VL base, confirm model-card license before production large GPU/strong worker; Qwen2.5-VL 7B fine-tune https://huggingface.co/loay/Arabic-OCR-Qwen2.5-VL-7B-Vision
DIMI Arabic OCR v2 ocr large Arabic OCR LoRA benchmark candidate not wired; benchmark externally first Apache-2.0 large GPU/strong worker; Qwen2.5-VL 7B LoRA with 4-bit option https://huggingface.co/AhmedZaky1/DIMI-Arabic-OCR-V2
AtlasOCR ocr Darija/Moroccan Arabic OCR watchlist not wired; benchmark externally first check model card before production use strong worker; Qwen2.5-VL 3B fine-tune https://huggingface.co/atlasia/AtlasOCR
Ketaba-OCR LoRA ocr Arabic manuscript OCR benchmark candidate not wired; benchmark externally first Apache-2.0 strong worker; Qwen2.5-VL-3B base plus LoRA adapter https://huggingface.co/HassanB4/Ketaba-OCR-LoRA
Qari-OCR-LoRA ocr Arabic manuscript OCR secondary QARI-family benchmark not wired; benchmark externally first Apache-2.0 strong worker; QARI/Qwen2-VL-family base plus LoRA adapter https://huggingface.co/HassanB4/Qari-OCR-LoRA
Tawkeed OCR ocr Arabic-first OCR sidecar wired optional sidecar Apache-2.0 strong worker or edge/GPU test; QARI v0.3 2B fork https://huggingface.co/tawkeed-sa/tawkeed-ocr
Falcon-OCR ocr compact document OCR VLM watchlist not wired; benchmark externally first Apache-2.0 strong worker; 300M document VLM https://huggingface.co/tiiuae/Falcon-OCR
Baseer OCR V1.0 ocr Arabic legal/complex document OCR sidecar wired optional sidecar Apache-2.0 strong worker; Qwen2-VL 2B fine-tune https://huggingface.co/AbdoTarek/Baseer-OCR-V1.0
Raqim post-OCR correction ocr Arabic OCR correction research caution not wired; correction can alter source text open-access paper; implementation/license not established for this app depends on correction model; dictionary plus LLM workflow https://www.sciencedirect.com/science/article/pii/S187705092600058X
Arabic Legal Documents OCR 1.0 ocr legal/structured Arabic OCR benchmark candidate not default; Gemma license and domain-specific Gemma license GPU/large worker; Gemma-3-4B-IT VLM fine-tune https://huggingface.co/bakrianoo/arabic-legal-documents-ocr-1.0
SILMA TTS tts default Arabic neural voice wired default local voice MIT code, Apache-2.0 model weights CPU worker practical baseline https://huggingface.co/silma-ai/silma-tts
Habibi-TTS MSA tts optional Arabic MSA voice comparison wired optional sidecar Apache-2.0 for specialized MSA; other variants may be non-commercial CPU/GPU worker depending on model/runtime https://github.com/SWivid/Habibi-TTS
Mishkala Tashkeel tts Arabic pronunciation preprocessor benchmark not wired; benchmark externally first Apache-2.0 CPU/worker practical; 12.5M diacritization model https://huggingface.co/flokymind/mishkala
Tashkeel-350M tts larger Arabic pronunciation preprocessor benchmark not wired; benchmark externally first Apache-2.0 GPU/strong worker likely; 350M Arabic diacritization model https://huggingface.co/Etherll/Tashkeel-350M
Mushkil tts AraT5V2 Arabic pronunciation preprocessor benchmark not wired; benchmark externally first Apache-2.0 GPU/strong worker likely; AraT5V2 Arabic diacritization model https://huggingface.co/riotu-lab/mushkil
Thaka KSAA-2026 speech diacritization tts Arabic diacritization research signal research signal only; no deployable model yet CC BY 4.0 paper; implementation/model license not established not applicable until code/weights are released; paper describes CATT-Whisper ensemble inference https://arxiv.org/abs/2605.25928
3arab-TTS 500M tts new Arabic-only voice benchmark not wired; benchmark externally first Apache-2.0 GPU/strong worker likely; 500M Arabic RF-DiT model https://huggingface.co/sherif1313/3arab-TTS-500M-v1
KaniTTS Arabic tts high-speed Arabic voice benchmark not wired; benchmark externally first model card says Apache-2.0, but Hugging Face metadata reports lfm1.0; confirm before production GPU/strong worker likely; 400M model, reported low latency with vLLM https://huggingface.co/nineninesix/kani-tts-400m-ar
Emirati VITS Male tts Gulf/Emirati Arabic voice benchmark not wired; benchmark externally first Apache-2.0 GPU/NeMo runtime; 22.05 kHz VITS voice https://huggingface.co/vadimbelsky/emirati-vits-male-1.0
VoxCPM2 tts strong-worker multilingual voice watchlist not wired; benchmark externally first Apache-2.0 GPU/large worker; 2B model, about 8GB VRAM guidance https://huggingface.co/openbmb/VoxCPM2
Voxtral TTS tts non-commercial Arabic-capable strong-worker voice watchlist not default; non-commercial and GPU-heavy CC-BY-NC-4.0 GPU/large worker; 4B BF16 model, 16GB+ GPU guidance https://huggingface.co/mistralai/Voxtral-4B-TTS-2603
OmniVoice tts priority permissive strong-worker voice benchmark not wired; benchmark externally first Apache-2.0 GPU/large worker; 0.6B model https://huggingface.co/k2-fsa/OmniVoice
OmniVoice Arabic LoRA tts Arabic adapter for OmniVoice benchmark not wired; benchmark externally first Apache-2.0 GPU/large worker; OmniVoice plus LoRA adapter https://huggingface.co/vivooglobal/omnivoice-lora-ar
Arabic-text-to-speech OmniVoice tts Arabic-focused OmniVoice packaging benchmark not wired; benchmark externally first Apache-2.0 GPU/large worker; OmniVoice 0.6B packaging with Arabic-focused model card https://huggingface.co/bilalRHCH/Arabic-text-to-speech
Lahgtna OmniVoice v2 tts Arabic dialect OmniVoice benchmark not wired; benchmark externally first license not declared on model card GPU/large worker; OmniVoice 0.6B fine-tune https://huggingface.co/oddadmix/lahgtna-omnivoice-v2
TADA multilingual TTS tts strong-worker off-script-resistant voice benchmark not default; Llama 3.2 license and GPU-heavy Llama 3.2 license GPU/large worker; 3B-class multilingual model plus language aligners https://huggingface.co/HumeAI/tada-3b-ml
Lahgtna Chatterbox tts Arabic dialect TTS benchmark not wired; benchmark externally first MIT GPU recommended; Chatterbox multilingual base https://huggingface.co/oddadmix/lahgtna-chatterbox-v1
NAMAA-Saudi-TTS tts Saudi Arabic Chatterbox dialect benchmark not wired; benchmark externally first MIT GPU recommended; 0.5B Chatterbox Multilingual fine-tune https://huggingface.co/NAMAA-Space/NAMAA-Saudi-TTS
NAMAA-Egyptian-TTS tts Egyptian Arabic Chatterbox dialect benchmark not wired; benchmark externally first MIT GPU recommended; 0.5B Chatterbox Multilingual fine-tune https://huggingface.co/NAMAA-Space/NAMAA-Egyptian-TTS
Saudi Chatterbox fine-tune tts Saudi Arabic Chatterbox dialect benchmark not wired; benchmark externally first Apache-2.0 GPU recommended; Chatterbox Multilingual T3 fine-tune https://huggingface.co/FatimahEmadEldin/saudi-tts-chatterbox-finetuned
Saudi TTS tts Saudi Arabic dialect TTS benchmark not wired; benchmark externally first Apache-2.0 GPU/worker benchmark; model card has demo Spaces but no inference-provider deployment https://huggingface.co/AhmedEladl/saudi-tts
Egyptian Arabic Chatterbox tts Egyptian Arabic dialect Chatterbox benchmark not wired; benchmark externally first Apache-2.0 GPU recommended; Chatterbox Multilingual fine-tune https://huggingface.co/AliAbdallah/egyptian-arabic-tts-chatterbox
NileTTS-XTTS tts Egyptian Arabic XTTS benchmark not wired; benchmark externally first Apache-2.0 GPU recommended; XTTS v2 fine-tune https://huggingface.co/KickItLikeShika/NileTTS-XTTS
Arabic XTTS-v2 Egyptian fine-tune tts Egyptian Arabic XTTS voice-quality benchmark not wired; benchmark externally first MIT project; XTTS-v2 base uses Coqui Public Model License GPU recommended; XTTS-v2 fine-tune and voice-cloning runtime https://huggingface.co/Moeeldouma/arabic-tts-xtts-v2
Chatterbox-Multilingual tts MIT Arabic-capable multilingual TTS benchmark not wired; benchmark externally first MIT GPU recommended; multilingual TTS/voice cloning https://github.com/resemble-ai/chatterbox
Chatterbox Arabic fine-tune tts MSA-focused Chatterbox Arabic adapter benchmark not wired; benchmark externally first MIT GPU recommended; Chatterbox Multilingual LoRA/adapter https://huggingface.co/juliardi/chatterbox-multilingual-finetuned-arabic
Chatterbox-Multilingual ONNX tts CPU/ONNX Arabic-capable voice benchmark not wired; benchmark externally first MIT CPU/ONNX-capable worker; multilingual Chatterbox runtime https://huggingface.co/onnx-community/chatterbox-multilingual-ONNX
Spark-TTS Arabic tts classical Arabic voice-cloning benchmark not wired; benchmark externally first Apache-2.0 GPU/large worker; Spark-TTS repo required https://huggingface.co/azeddinShr/Spark-TTS-Arabic-Complete
Sofelia-TTS tts Palestinian Arabic dialect voice benchmark not wired; benchmark externally first Apache-2.0 GPU/large worker; MiraTTS runtime https://huggingface.co/hamdallah/Sofelia-TTS
Arabic-F5-TTS-v2 tts personal/non-commercial MSA voice caution not default; non-commercial and requires tashkeel fair non-commercial research license GPU recommended; F5-TTS fine-tune https://huggingface.co/IbrahimSalah/Arabic-F5-TTS-v2
MOSS-TTS-Nano tts CPU-friendly multilingual voice watchlist not wired; benchmark externally first Apache-2.0 CPU-friendly 0.1B model; ONNX path available https://github.com/OpenMOSS/MOSS-TTS-Nano
tts-arabic-onnx tts compact Arabic-only ONNX voice benchmark not wired; benchmark externally first license not declared on model card/repo; confirm before production CPU/ONNX-capable worker; small FastPitch/MixerTTS plus vocoder models https://huggingface.co/nipponjo/tts-arabic-onnx
Supertonic 3 tts wired optional fast CPU Arabic-capable voice wired optional sidecar OpenRAIL model, MIT sample code CPU-only ONNX; 99M model assets https://huggingface.co/Supertone/supertonic-3
Qwen3-TTS tts strong open TTS to not promote for Arabic yet not Arabic-ready for this app Apache-2.0 GPU/large worker; 0.6B or 1.7B models https://huggingface.co/Qwen/Qwen3-TTS-12Hz-1.7B-Base
Saudi Arabic Qwen3-TTS tts Saudi/KSA Arabic dialect voice benchmark not wired; benchmark externally first Apache-2.0 GPU/large worker; Qwen3-TTS 1.7B fine-tune https://huggingface.co/vadimbelsky/qwen3-TTS-KSA
Emirati Qwen3.5-TTS tts Emirati/Gulf Qwen voice benchmark not wired; benchmark externally first Apache-2.0 GPU/large worker; Qwen3-TTS fine-tune https://huggingface.co/vadimbelsky/qwen3.5-TTS-Emirati

Benchmark Steps

QARI-OCR 0.4

Why: Directly trained for Arabic OCR on Islamic books and Arabic manuscripts.

Next step: Install the sidecar or build the worker with INSTALL_QARI_OCR=1, then benchmark against arabic-max/arabic/arabic-qwen-ocr/katib-ocr/paddleocr/tesseract on the 5-page sample.

python scripts\benchmark_ocr.py C:\path\to\book-best-5-pages.pdf --page-limit 1 --engines arabic-max arabic arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract

QARI-OCR 0.4 GGUF

Why: A newer GGUF packaging of QARI-OCR 0.4 could make the strongest Arabic-book OCR candidate easier to test in portable runtimes, but it must prove identical or better text quality and acceptable memory/runtime before app wiring.

Next step: Benchmark the GGUF package externally on the same exported Arabic pages against the wired QARI sidecar, KATIB, Arabic-Qwen, Baseer, PaddleOCR, and Tesseract before considering a llama.cpp-style worker path.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate qari-gguf=outputs\external-ocr-sample\qari-gguf.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "QARI-OCR 0.4 GGUF" --kind ocr --license "Apache-2.0 via QARI 0.4 model card; confirm GGUF packaging metadata before production" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

PaddleOCR-VL-1.6

Why: Fresh Apache-2.0 PaddleOCR document parser release with a June 2026 paper signal; the model card claims SOTA document parsing/text performance and the license file is Apache-2.0, but Arabic-book quality still needs same-page scoring.

Next step: Build with INSTALL_PADDLEOCR_VL=1 only after the smaller Arabic OCR stack is not clean enough, then benchmark the same 5-page Arabic sample before any full-book run.

python scripts\benchmark_ocr.py C:\path\to\book-best-5-pages.pdf --page-limit 1 --engines arabic-max arabic arabic-qwen-ocr katib-ocr qari-ocr paddleocr paddleocr-vl tesseract

oi-OCR

Why: Apache-2.0 document parser tagged for English/Arabic PDF OCR and layout extraction, with April 2026 ParseBench claims; promising for structured Arabic PDFs but not Arabic-book-specific.

Next step: Export the same selected Arabic page images and compare its Markdown/text output against QARI/KATIB/Arabic-Qwen/PaddleOCR/Tesseract before considering any wiring.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\score_external_ocr.py --candidate oi-ocr=outputs\external-ocr-sample\oi-ocr.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "oi-OCR" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

NuExtract3

Why: Apache-2.0 4B document understanding model for OCR, document-to-Markdown, tables, forms, invoices, contracts, and multilingual documents. It is not Arabic-book-specific, so compare it externally on the same page images before considering any worker wiring.

Next step: Use document-to-Markdown/content mode on the exported page images and score the resulting Arabic text against QARI/KATIB/Arabic-Qwen/Baseer/PaddleOCR/Tesseract before promotion.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate nuextract3=outputs\external-ocr-sample\nuextract3.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "NuExtract3" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Qianfan-OCR

Why: Apache-2.0 unified end-to-end document OCR/VLM with multilingual/document-intelligence tags and strong general document benchmark claims. It is not Arabic-book-specific and is heavier than the normal free worker path.

Next step: Benchmark externally only after QARI/KATIB/Arabic-Qwen/Baseer/PaddleOCR are not clean enough; score it on the same exported Arabic book pages before considering any worker wiring.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
# Run baidu/Qianfan-OCR externally on the same page images, then save merged text as outputs\external-ocr-sample\qianfan-ocr.txt.
python scripts\score_external_ocr.py --candidate qianfan-ocr=outputs\external-ocr-sample\qianfan-ocr.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Qianfan-OCR" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Chandra OCR 2

Why: Recent Chandra 2 release supports Arabic among 90+ languages and reports strong structured document OCR/layout performance, but the weights are modified OpenRAIL-M and it is not Arabic-book-specific.

Next step: Benchmark externally on the same exported page images for hard layouts, tables, forms, or mixed-language pages; keep QARI/KATIB/Arabic-Qwen/Baseer first for Arabic books unless Chandra wins same-page scoring and the license/runtime fit.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
chandra outputs\external-ocr-sample\images outputs\external-ocr-sample\chandra --method hf
python scripts\score_external_ocr.py --candidate chandra=outputs\external-ocr-sample\chandra.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Chandra OCR 2" --kind ocr --license "Apache-2.0 code; modified OpenRAIL-M model weights" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

dots.ocr

Why: MIT multilingual document parser that unifies layout detection and content recognition with reading-order, table, and formula support. It is not Arabic-book-specific, but it is worth scoring on difficult Arabic layouts because public sources mention Arabic/low-resource multilingual OCR.

Next step: Run externally on the same exported Arabic page images and score the resulting text against QARI/KATIB/Arabic-Qwen/Baseer/PaddleOCR/Tesseract before considering any worker wiring.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate dots-ocr=outputs\external-ocr-sample\dots-ocr.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "dots.ocr" --kind ocr --license "MIT" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

olmOCR Arabic LoRA v2

Why: Apache-2.0 Arabic manuscript OCR LoRA trained on full-page manuscript images, which makes it relevant when line-cropping is impractical; still too heavy for the default free family worker.

Next step: Run externally on the same exported full-page manuscript images and compare against Ketaba, QARI, HAFITH/Glimpse line workflows, Kraken/eScriptorium, and the wired Arabic OCR baseline before considering any sidecar work.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-manuscript.pdf --out-dir outputs\external-ocr-sample
# Run hastyle/olmOCR-arabic-lora-v2 with allenai/olmOCR-2-7B-1025 on the exported full-page images, then save merged text as outputs\external-ocr-sample\olmocr-arabic-lora.txt.
python scripts\score_external_ocr.py --candidate olmocr-arabic-lora=outputs\external-ocr-sample\olmocr-arabic-lora.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "olmOCR Arabic LoRA v2" --kind ocr --license "Apache-2.0 adapter; confirm base model license/runtime before production" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Arabic Large Nougat

Why: Arabic-specific OCR model for converting Arabic book page images into structured text/Markdown. It is lighter than many VLM OCR options and directly relevant to book pages, but GPL-3.0 keeps it out of the default public hosted worker.

Next step: Run externally on the same exported Arabic book page images and compare Markdown/text output against QARI, KATIB, Arabic-Qwen, Baseer, PaddleOCR, Tesseract, and the other external OCR benchmarks before considering any separate license-aware workflow.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
# Run MohamedRashad/arabic-large-nougat externally on the exported page images, then save merged text/Markdown as outputs\external-ocr-sample\arabic-large-nougat.txt.
python scripts\score_external_ocr.py --candidate arabic-large-nougat=outputs\external-ocr-sample\arabic-large-nougat.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Arabic Large Nougat" --kind ocr --license "GPL-3.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

DocTR Arabic FAST/PARSEQ

Why: Apache-2.0 Arabic FAST text detector designed to pair with an Arabic PARSEQ recognizer; useful as a non-VLM Arabic OCR benchmark when large document VLMs are too heavy.

Next step: Benchmark externally on the same exported Arabic page images and promote only if the recognition model license is confirmed and it beats PaddleOCR/Tesseract/EasyOCR on book text ordering and word preservation.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\score_external_ocr.py --candidate doctr-arabic=outputs\external-ocr-sample\doctr-arabic.txt --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "DocTR Arabic FAST/PARSEQ" --kind ocr --license "Apache-2.0 detector; recognition card lacks clear metadata, confirm before production" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Kraken/eScriptorium Arabic script

Why: Kraken is an open-source ATR/OCR system optimized for historical and non-Latin scripts. eScriptorium builds on Kraken for manuscript and archival OCR, including Arabic-script workflows, so it is useful when book scans look more like historical print or manuscripts than modern PDFs.

Next step: Export the same selected page images, run Kraken/eScriptorium with an Arabic-script recognition model or line-cropped workflow, then score the resulting text against the wired Arabic OCR stack before considering any sidecar work.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
kraken -i outputs\external-ocr-sample\images\page-0001.png outputs\external-ocr-sample\kraken-page-0001.txt segment ocr -m C:\path\to\arabic-script-kraken-model.mlmodel
python scripts\score_external_ocr.py --candidate kraken=outputs\external-ocr-sample\kraken.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Kraken/eScriptorium Arabic script" --kind ocr --license "Apache-2.0 engine; model license depends on selected Kraken model" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Kairawan/Qalamus manuscript OCR

Why: Kairawan is a 2026 Arabic and Islamic manuscript index that offers free automatic Arabic transcription where rights allow, and related public pages mention Qalamus as the manuscript HTR/OCR engine. This is useful evidence that Arabic manuscript OCR is improving, but it is not a drop-in free software dependency for this Vercel plus worker app.

Next step: Use only as an external comparison when the source PDF is manuscript-like; do not wire it into the app unless a reusable open engine, API terms, privacy story, and same-page scoring beat QARI/KATIB/Kraken/HAFITH on the selected sample.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-manuscript.pdf --out-dir outputs\external-ocr-sample
# If Kairawan/Qalamus output is available for the same pages, save it as outputs\external-ocr-sample\kairawan-qalamus.txt.
python scripts\score_external_ocr.py --candidate kairawan-qalamus=outputs\external-ocr-sample\kairawan-qalamus.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Kairawan/Qalamus manuscript OCR" --kind ocr --license "free web service; engine/package license not established" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

GLM-OCR Arabic/French documents

Why: Recent GLM-OCR LoRA fine-tune on thousands of manually annotated Arabic and French scanned documents; useful for forms, receipts, newspapers, and official documents, but not Arabic-book-specific.

Next step: Benchmark externally for administrative/form-like Arabic PDFs and compare against Arabic-GLM-OCR-v2, QARI, KATIB, Baseer, PaddleOCR, and Tesseract before wiring.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\score_external_ocr.py --candidate glm-docs=outputs\external-ocr-sample\glm-docs.txt --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "GLM-OCR Arabic/French documents" --kind ocr --license "check model card/base license before production use" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

mimoha Arabic OCR

Why: Apache-2.0 Arabic OCR model card says it extracts Arabic text from images, but the public card is sparse and references a Mistral OCR-style API path rather than a detailed local runner.

Next step: Keep as a low-priority external benchmark only; test on exported page images if the stronger Arabic OCR candidates fail or if a clean local runner becomes available.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\score_external_ocr.py --candidate mimoha-ocr=outputs\external-ocr-sample\mimoha-ocr.txt --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "mimoha Arabic OCR" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

KATIB 0.8B

Why: Fine-tuned specifically for Arabic OCR, including printed and handwritten text, while being much smaller than QARI 4B.

Next step: Install the sidecar or build the worker with INSTALL_KATIB_OCR=1, then benchmark against arabic-max/arabic/arabic-qwen-ocr/qari-ocr/paddleocr/tesseract on the 5-page sample.

python scripts\benchmark_ocr.py C:\path\to\book-best-5-pages.pdf --page-limit 1 --engines arabic-max arabic arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract

Arabic-GLM-OCR-v2

Why: Recent Arabic OCR model card claims strong Arabic document extraction and noise reduction; it is wired as an optional sidecar so it can be scored against QARI/KATIB/Arabic-Qwen/Baseer on the target book pages.

Next step: Install the sidecar or build the worker with INSTALL_ARABIC_GLM_OCR=1, then benchmark it on the same 5-page sample before any full-book run.

.\scripts\setup_arabic_glm_ocr.ps1
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic arabic-glm-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract

Arabic-Qwen3.5-OCR-v4

Why: Recent Arabic OCR model card claims Arabic printed, handwritten, classical, and diacritic handling in a smaller 0.9B model.

Next step: Install the sidecar or build the worker with INSTALL_ARABIC_QWEN_OCR=1, then benchmark against arabic-max/arabic/katib-ocr/qari-ocr/paddleocr/tesseract on the 5-page sample.

python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract

aNS Qwen3-VL Arabic OCR v3

Why: Fresh Hugging Face Arabic OCR fine-tune from Qwen3-VL-2B; the public card shows no inference provider and sparse OCR evaluation detail, so it should be scored on the same selected Arabic pages before any app wiring.

Next step: Export the same 5-page Arabic sample images, run this model externally, and promote only if it beats QARI/KATIB/Arabic-Qwen/Baseer on faithful Arabic text, reading order, runtime, and license fit.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\score_external_ocr.py --candidate ans-qwen3-vl-arabic-ocr-v3=outputs\external-ocr-sample\ans-qwen3-vl-arabic-ocr-v3.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "aNS Qwen3-VL Arabic OCR v3" --kind ocr --license "check model card/base license before production use" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\ocr-promotion-gate.md

Waraqon v3 Arabic OCR HTML Qari

Why: Apache-2.0 Qari-family fine-tune for Arabic OCR with HTML structure, trained on a Qari 0.3 markdown/HTML-style dataset. It may help complex pages, but audiobook generation needs faithful continuous Arabic text, so same-page text scoring is required before any app wiring.

Next step: Export the same selected Arabic page images, run Waraqon externally, strip or normalize HTML to readable Arabic text, and promote only if text order, word preservation, runtime, and license fit beat QARI/KATIB/Arabic-Qwen/Baseer.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
# Run FatimahEmadEldin/Waraqon-v3-Arabic-OCR-HTML-Qari externally on the same page images, then save normalized readable text as outputs\external-ocr-sample\waraqon-v3.txt.
python scripts\score_external_ocr.py --candidate waraqon-v3=outputs\external-ocr-sample\waraqon-v3.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Waraqon v3 Arabic OCR HTML Qari" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\ocr-promotion-gate.md

DeepSeek-OCR-2

Why: Official 2026 DeepSeek OCR successor with Apache-2.0 licensing, vLLM/SGLang guidance, and public document OCR benchmark results; not Arabic-specific, so score it on the target Arabic book pages before promotion.

Next step: Benchmark externally on the same exported page images and promote only if it beats QARI/KATIB/Arabic-Qwen/Baseer while the worker can handle 3B VLM inference.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate deepseek-ocr-2=outputs\external-ocr-sample\deepseek-ocr-2.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "DeepSeek-OCR-2" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

DeepSeek Arabic OCR v6

Why: Newer Apache-2.0 Arabic-labeled DeepSeek-OCR fine-tune than v4/v5, but the model card has sparse evaluation detail and no hosted inference provider, so keep it as an external same-page benchmark.

Next step: Benchmark externally on the same exported page images and promote only if it beats the wired Arabic OCR stack on the target pages.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate deepseek-ar-v6=outputs\external-ocr-sample\deepseek-ar-v6.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "DeepSeek Arabic OCR v6" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Loay Arabic-OCR-DeepSeek-OCR-2

Why: Recent Apache-2.0 merged DeepSeek-OCR-2 Arabic fine-tune aimed at high-precision OCR and structural layout analysis from Arabic images; promising for pages where layout preservation matters, but it is still 3B-class and must beat the Arabic-specific QARI/KATIB/Arabic-Qwen/Baseer stack on the same book pages.

Next step: Benchmark externally on the same exported Arabic page images and promote only if it beats QARI/KATIB/Arabic-Qwen/Baseer without hallucinating or reordering text and the worker can handle 3B VLM inference.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate loay-deepseek-ocr-2=outputs\external-ocr-sample\loay-deepseek-ocr-2.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Loay Arabic-OCR-DeepSeek-OCR-2" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Arabic-English handwritten OCR v3

Why: Apache-2.0 Arabic/English handwritten OCR model with model-card claims for handwritten and manuscript pages; useful when the PDF has marginal notes, handwriting, or older script that the book OCR stack misses.

Next step: Benchmark externally on the same exported page images and promote only if it beats QARI/KATIB/Arabic-Qwen/Baseer on the target handwriting or manuscript pages.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate handwritten-v3=outputs\external-ocr-sample\handwritten-v3.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Arabic-English handwritten OCR v3" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Arabic handwritten OCR 4-bit Qwen2.5-VL

Why: Apache-2.0 4-bit Arabic handwritten OCR checkpoint that is much smaller than the full Arabic-English handwritten OCR model; useful when handwriting or manuscript pages matter and a free worker cannot handle the larger checkpoint.

Next step: Benchmark externally on the same exported handwriting/manuscript page images and promote only if it beats the wired Arabic OCR stack without introducing hallucinated or reordered text.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate handwritten-4bit=outputs\external-ocr-sample\handwritten-4bit.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Arabic handwritten OCR 4-bit Qwen2.5-VL" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

NAKBA Arabic manuscript line OCR baseline

Why: NAKBA NLP 2026 shared-task baseline for Arabic manuscript line transcription, with reported CER/WER on released line-image tests; useful only when the source PDF has manuscript or memoir-style handwritten line images.

Next step: Keep external and line-level only unless a preprocessing step crops pages into lines; compare with handwritten-v3 and handwritten-4bit on the same manuscript images before any wiring.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-manuscript.pdf --out-dir outputs\external-ocr-sample
python scripts\score_external_ocr.py --candidate nakba-ms-line=outputs\external-ocr-sample\nakba-ms-line.txt --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "NAKBA Arabic manuscript line OCR baseline" --kind ocr --license "check model card/base license before production use" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

HAFITH

Why: Apache-2.0 Arabic-native OCR model for historical manuscript line recognition with 5.10% CER claims, but it operates on pre-segmented text lines rather than full PDF pages.

Next step: Use only when a scanned book looks like historical print or manuscript pages; crop pages into text lines first, then compare HAFITH line output against Kraken/eScriptorium, NAKBA line OCR, and the wired OCR baseline.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
# Crop selected pages into text-line images before running mdnaseif/hafith, then save the merged line text as outputs\external-ocr-sample\hafith.txt.
python scripts\score_external_ocr.py --candidate hafith=outputs\external-ocr-sample\hafith.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "HAFITH" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Glimpse RTL OCR

Why: Apache-2.0 Arabic/Persian RTL text-line OCR model fine-tuned from an ERNIE/PaddleOCR-VL path with 6.97% CER claims on unseen RTL text lines, but it is line-level rather than a full-page PDF OCR default.

Next step: Use only after selected PDF pages are cropped into Arabic/Persian text-line images; compare against HAFITH, NAKBA line OCR, Qwen3-VL Persian/Arabic line OCR, Kraken/eScriptorium, and the wired OCR baseline.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
# Crop selected pages into text-line images before running surfiniaburger/unsloth_finetune_ocr_arabic, then save the merged line text as outputs\external-ocr-sample\glimpse-rtl.txt.
python scripts\score_external_ocr.py --candidate glimpse-rtl=outputs\external-ocr-sample\glimpse-rtl.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Glimpse RTL OCR" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Arabic OCR Qwen2.5-VL GGUF

Why: Arabic/English OCR fine-tune trained on QariOCR v0.3 mixed data and aimed at scanned books, religious texts, handwritten forms, and mixed-language documents; useful as an external GGUF-style comparison against QARI 0.4 and the wired Arabic OCR stack.

Next step: Benchmark externally on the same exported page images, confirm license fit, and promote only if it beats QARI/KATIB/Arabic-Qwen/Baseer on the target pages while the worker can handle 7B-class inference.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate qwen25-gguf=outputs\external-ocr-sample\qwen25-gguf.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Arabic OCR Qwen2.5-VL GGUF" --kind ocr --license "check model card/base license before production use" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Qwen3-VL Persian/Arabic line OCR

Why: Apache-2.0 Qwen3-VL 2B fine-tune for Persian/Arabic text-line OCR; interesting for cropped line images, but its model card says it was trained on individual text lines and is not designed for full-page OCR.

Next step: Keep external unless a preprocessing/layout step crops Arabic book pages into lines; benchmark only on exported/cropped line images and compare against the full-page Arabic OCR stack before any wiring.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\score_external_ocr.py --candidate qwen3-line-ocr=outputs\external-ocr-sample\qwen3-line-ocr.txt --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Qwen3-VL Persian/Arabic line OCR" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Loay Arabic-OCR-Qwen2.5-VL-7B

Why: Arabic OCR VLM fine-tuned from Qwen2.5-VL-7B for OCR on Arabic text from images; useful as a high-capacity comparison when smaller Arabic OCR sidecars fail.

Next step: Benchmark externally on the same exported page images and promote only if it beats QARI/KATIB/Arabic-Qwen/Baseer while the worker can handle 7B-class runtime.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate loay-qwen25=outputs\external-ocr-sample\loay-qwen25.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Loay Arabic-OCR-Qwen2.5-VL-7B" --kind ocr --license "Apache-2.0 via Qwen2.5-VL base, confirm model-card license before production" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

DIMI Arabic OCR v2

Why: Recent Arabic OCR model card reports improved diacritics handling, printed-document extraction, and lower WER/CER than its v1 model, but it is 7B-class and needs external scoring on the target book pages.

Next step: Benchmark externally on the same exported page images and promote only if it beats the wired Arabic OCR sidecars while the worker can handle the 7B LoRA runtime.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic arabic-glm-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate dimi-v2=outputs\external-ocr-sample\dimi-v2.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "DIMI Arabic OCR v2" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

AtlasOCR

Why: First open-source Darija OCR model; useful if the PDFs contain Moroccan Arabic or Darija rather than standard printed MSA.

Next step: Benchmark only for Darija/Moroccan content, and confirm licensing before any production wiring.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\score_external_ocr.py --candidate atlasocr=outputs\external-ocr-sample\atlasocr.txt --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "AtlasOCR" --kind ocr --license "check model card before production use" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Ketaba-OCR LoRA

Why: Arabic manuscript benchmark winner candidate with reported low character error rate, useful when book/manuscript scans defeat the wired OCR stack.

Next step: Benchmark externally on one or two page images before considering a sidecar because it needs a separate base VLM plus adapter setup.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate ketaba=outputs\external-ocr-sample\ketaba.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Ketaba-OCR LoRA" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Qari-OCR-LoRA

Why: Apache-2.0 experimental QARI-family LoRA from the NakbaNLP 2026 Arabic manuscript OCR task; useful as a secondary manuscript benchmark after Ketaba because its own model card says Ketaba was the primary winning submission.

Next step: Benchmark externally on the same manuscript-like page images only after QARI 0.4, Ketaba, KATIB, and the wired OCR stack have been scored.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-manuscript.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate qari-ocr-lora=outputs\external-ocr-sample\qari-ocr-lora.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Qari-OCR-LoRA" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Tawkeed OCR

Why: Arabic-first OCR model forked from QARI-OCR v0.3 and fine-tuned for Arabic documents, handwriting, and scene text; useful to test when QARI 0.4 is too heavy or when edge-style deployment matters.

Next step: Install the sidecar or build the worker with INSTALL_TAWKEED_OCR=1, then benchmark against QARI 0.4, KATIB, Arabic-Qwen, Baseer, and Tesseract on the same 5-page sample.

python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic tawkeed-ocr arabic-qwen-ocr katib-ocr qari-ocr baseer-ocr paddleocr tesseract

Falcon-OCR

Why: Smaller Apache-2.0 document OCR VLM that may be useful when VLM OCR is needed but larger parsers are too heavy.

Next step: Run an external one-page image benchmark and compare cleaned Arabic word count, quality score, and reading order against QARI, Arabic-Qwen, and Tesseract.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract --json > outputs\external-ocr-sample\wired-ocr-baseline.json
python scripts\score_external_ocr.py --candidate falcon=outputs\external-ocr-sample\falcon.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Falcon-OCR" --kind ocr --license "Apache-2.0" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Baseer OCR V1.0

Why: Arabic-specific VLM OCR for complex legal documents, multi-column layouts, stamps, tables, and handwritten/printed Arabic.

Next step: Install the sidecar or build the worker with INSTALL_BASEER_OCR=1, then benchmark against arabic-max/arabic/arabic-qwen-ocr/katib-ocr/qari-ocr/paddleocr/tesseract on the 5-page sample.

.\scripts\setup_baseer_ocr.ps1
python scripts\benchmark_ocr.py test_pdfs\book-best-5-pages.pdf --page-limit 5 --engines arabic-max arabic baseer-ocr arabic-qwen-ocr katib-ocr qari-ocr paddleocr tesseract

Raqim post-OCR correction

Why: 2026 research reports Arabic OCR correction gains by combining dictionary-based correction and LLMs, but correction may rewrite exact book/religious wording, so it should not run automatically before TTS.

Next step: Keep as a manual review/research idea only. If used later, expose it as an explicit reviewed correction mode, never as the default reading path.

python scripts\dry_run_pdf.py C:\path\to\arabic-book.pdf --include-speech-text --speech-sample-chars 1200
python scripts\score_external_ocr.py --candidate raqim-post-ocr-correction=outputs\external-ocr-sample\raqim-post-ocr-correction.txt --baseline-json outputs\external-ocr-sample\wired-ocr-baseline.json --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Raqim post-OCR correction" --kind ocr --license "open-access paper; implementation/license not established for this app" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

Arabic Legal Documents OCR 1.0

Why: Recent Arabic legal-document OCR VLM optimized for low-quality scanned Arabic legal documents and structured extraction; useful only when the target PDF is legal/structured rather than a normal book.

Next step: Benchmark externally on exported page images only for legal or form-like Arabic PDFs; keep it out of the default family audiobook stack because it is Gemma-licensed and domain-specific.

python scripts\export_ocr_sample_images.py C:\path\to\arabic-book.pdf --out-dir outputs\external-ocr-sample
python scripts\score_external_ocr.py --candidate legal-docs-ocr=outputs\external-ocr-sample\legal-docs-ocr.txt --write-report outputs\external-ocr-sample\external-ocr-score.md --write-json outputs\external-ocr-sample\external-ocr-score.json
python scripts\model_promotion_gate.py --candidate-name "Arabic Legal Documents OCR 1.0" --kind ocr --license "Gemma license" --score-json outputs\external-ocr-sample\external-ocr-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-ocr-sample\model-promotion-gate.md

SILMA TTS

Why: Arabic-focused Fusha/MSA voice with normalization and tashkeel options.

Next step: Keep as the first listen-test voice for every book sample.

python scripts\benchmark_voices.py --voices silma-local espeak-ar-clear --write-report outputs\voice-benchmark-report.md

Habibi-TTS MSA

Why: Arabic-specific 2026 TTS family worth comparing against SILMA on MSA passages.

Next step: Install the optional sidecar and listen against the same cleaned OCR sample.

python scripts\benchmark_voices.py --voices silma-local habibi-msa espeak-ar-clear --write-report outputs\voice-benchmark-report.md

Mishkala Tashkeel

Why: Lightweight Apache-2.0 Arabic diacritization model with model-card DER claims; useful to test whether adding tashkeel improves SILMA, Habibi, Supertonic, or eSpeak pronunciation on the exact book text.

Next step: Benchmark on the same cleaned speech sample before wiring. Promote only if listening tests improve pronunciation without changing meaning or adding distracting/incorrect harakat.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
# Then diacritize outputs\external-tts-sample\arabic-tts-sample.txt with flokymind/mishkala and listen-test the same text with SILMA/Habibi/Supertonic before enabling any automatic path.
python scripts\score_tts_preprocessor.py --rating plain=4,5,5,4,4 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\tts-preprocessor-score.md --write-json outputs\external-tts-sample\tts-preprocessor-score.json
python scripts\model_promotion_gate.py --candidate-name "Mishkala Tashkeel" --kind preprocessor --license "Apache-2.0" --score-json outputs\external-tts-sample\tts-preprocessor-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\preprocessor-promotion-gate.md

Tashkeel-350M

Why: Apache-2.0 Arabic diacritization model that is much larger than Mishkala. It may improve pronunciation for some voices, but larger tashkeel models can still add wrong harakat, so compare by listening before production use.

Next step: Export the same cleaned Arabic TTS sample, create a Tashkeel-350M diacritized copy, synthesize plain/Mishkala/Tashkeel-350M with the same voice, and score meaning preservation plus long-listen comfort.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
# Then diacritize outputs\external-tts-sample\arabic-tts-sample.txt with Etherll/Tashkeel-350M and score it with scripts\score_tts_preprocessor.py before enabling any automatic path. --write-json outputs\external-tts-sample\tts-preprocessor-score.json
python scripts\model_promotion_gate.py --candidate-name "Tashkeel-350M" --kind preprocessor --license "Apache-2.0" --score-json outputs\external-tts-sample\tts-preprocessor-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\preprocessor-promotion-gate.md

Mushkil

Why: Apache-2.0 AraT5V2 Arabic diacritization model. It belongs in the same pronunciation-preprocessor benchmark lane as Mishkala and Tashkeel-350M, but automatic harakat can still change perceived meaning or comfort.

Next step: Export the same cleaned Arabic TTS sample, create a Mushkil-diacritized copy, synthesize plain/Mishkala/Tashkeel-350M/Mushkil with the same voice, and score meaning preservation plus long-listen comfort.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
# Then diacritize outputs\external-tts-sample\arabic-tts-sample.txt with riotu-lab/mushkil and score it with scripts\score_tts_preprocessor.py before enabling any automatic path. --write-json outputs\external-tts-sample\tts-preprocessor-score.json
python scripts\model_promotion_gate.py --candidate-name "Mushkil" --kind preprocessor --license "Apache-2.0" --score-json outputs\external-tts-sample\tts-preprocessor-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\preprocessor-promotion-gate.md

Thaka KSAA-2026 speech diacritization

Why: Late-May 2026 winning KSAA shared-task system for Arabic speech dictation diacritization. It is useful evidence that acoustic-plus-text diacritization can improve Arabic pronunciation work, but it is not a plug-in free model for this PDF-to-audio app.

Next step: Track for released code/weights or a permissive checkpoint. Until then, keep website preprocessing limited to same-sample Mishkala/Tashkeel-350M/Mushkil listening tests and meaning-preservation scoring.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
# Do not wire Thaka automatically; use the paper as a benchmark signal until a permissive implementation exists.
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Thaka KSAA-2026 speech diacritization" --kind tts --license "CC BY 4.0 paper; implementation/model license not established" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

3arab-TTS 500M

Why: Very recent Arabic-only Apache-2.0 TTS model trained on Arabic speech datasets; promising enough to benchmark against SILMA/Habibi before any app wiring.

Next step: Export the same cleaned Arabic text used for SILMA/Habibi, then compare base and VoiceDesign variants for audiobook comfort, stability, and long-form pacing.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "3arab-TTS 500M" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

KaniTTS Arabic

Why: Recent Arabic-only TTS model with high-speed claims; promising for faster audiobook generation, but current Hugging Face metadata reports lfm1.0 while the card text says Apache-2.0.

Next step: Export the same cleaned Arabic sample used for SILMA/Habibi, then benchmark naturalness, skipped words, pacing, runtime, and license fit before considering app wiring.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "KaniTTS Arabic" --kind tts --license "model card says Apache-2.0, but Hugging Face metadata reports lfm1.0; confirm before production" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Emirati VITS Male

Why: Apache-2.0 bilingual Emirati Arabic/English VITS voice that may be useful for Gulf dialect material, but dialectal tuning makes it a comparison candidate rather than the default MSA book voice.

Next step: Benchmark only when the target PDF benefits from Emirati/Gulf pronunciation; keep SILMA/Habibi ahead for MSA books unless listening tests say otherwise.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Emirati VITS Male" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

VoxCPM2

Why: Apache-2.0 multilingual TTS with Arabic support, 48 kHz output, and voice design/cloning.

Next step: Benchmark externally with the same cleaned Arabic sample before deciding whether it is worth integrating.

python scripts\dry_run_pdf.py C:\path\to\arabic-book.pdf --include-speech-text --speech-sample-chars 1200
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "VoxCPM2" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Voxtral TTS

Why: Mistral's open-weight TTS model lists Arabic among 9 supported languages and has strong latency/quality claims, but the model card says it inherits CC-BY-NC-4.0 and recommends a large GPU setup.

Next step: Benchmark only as a personal/non-commercial strong-worker comparison using the same cleaned Arabic sample; do not wire it as the default public/free website voice.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Voxtral TTS" --kind tts --license "CC-BY-NC-4.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

OmniVoice

Why: Apache-2.0 zero-shot TTS with 646-language coverage, Arabic included, high current usage, and published 2026 OmniVoice evidence; benchmark it before heavier or license-unclear voices when a stronger worker is available.

Next step: Export the same cleaned Arabic text used for SILMA/Habibi and compare Arabic naturalness, speed, and setup complexity before wiring it into the app.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "OmniVoice" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

OmniVoice Arabic LoRA

Why: Arabic LoRA adapter for OmniVoice intended to improve zero-shot Arabic voice cloning quality.

Next step: Benchmark only after the base OmniVoice command is working, using the exact same cleaned Arabic sample and reference audio.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "OmniVoice Arabic LoRA" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Arabic-text-to-speech OmniVoice

Why: Apache-2.0 Arabic-labeled OmniVoice package with 646-language OmniVoice support and a demo Space signal; useful as a same-sample Arabic voice benchmark, but still not proven for long MSA audiobook passages.

Next step: Export the same cleaned Arabic sample used for SILMA/Habibi and compare naturalness, skipped words, repetition, runtime, and setup complexity before any app wiring.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Arabic-text-to-speech OmniVoice" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Lahgtna OmniVoice v2

Why: New Arabic dialect TTS model based on OmniVoice, with broad Arabic dialect tags and diacritics support; promising for conversational dialect audio but not the MSA book default.

Next step: Benchmark externally only when dialect pronunciation matters, confirm licensing before production, and keep SILMA/Habibi ahead for MSA books until listening tests prove otherwise.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Lahgtna OmniVoice v2" --kind tts --license "license not declared on model card" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

TADA multilingual TTS

Why: Free/open-weight multilingual TTS with Arabic support and a text-acoustic alignment design meant to reduce skipped or invented words, which matters for long book narration, but its Hugging Face metadata reports the Llama 3.2 license rather than Apache-2.0.

Next step: Export the same cleaned Arabic sample and benchmark with language='ar' only if the Llama 3.2 license is acceptable; keep SILMA/Habibi ahead for the permissive default.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "TADA multilingual TTS" --kind tts --license "Llama 3.2 license" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Lahgtna Chatterbox

Why: MIT Arabic dialect TTS model covering multiple dialect tags; promising when conversational dialect pronunciation matters more than MSA audiobook narration.

Next step: Export the same cleaned Arabic text and listen for repetition/stability before considering app wiring.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Lahgtna Chatterbox" --kind tts --license "MIT" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

NAMAA-Saudi-TTS

Why: MIT-licensed Saudi Arabic TTS model built on Chatterbox Multilingual; useful for Saudi/Gulf dialect material, but its model card says it targets everyday Saudi speech rather than MSA books.

Next step: Benchmark only when Saudi dialect pronunciation fits the target PDF; keep SILMA/Habibi first for MSA books and compare against Saudi Arabic Qwen3-TTS and Emirati voices before wiring.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "NAMAA-Saudi-TTS" --kind tts --license "MIT" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

NAMAA-Egyptian-TTS

Why: MIT-licensed NAMAA Egyptian Arabic TTS model built on Chatterbox Multilingual with local/hosted inference examples and a live demo, but its card says it targets everyday Egyptian speech rather than MSA books and notes number/pronunciation limitations.

Next step: Benchmark only for Egyptian/dialectal PDFs using the same cleaned Arabic sample; keep SILMA/Habibi first for MSA books and compare against Egyptian Arabic Chatterbox, NileTTS-XTTS, and Egyptian Arabic Qwen3-TTS before any wiring.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "NAMAA-Egyptian-TTS" --kind tts --license "MIT" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Saudi Chatterbox fine-tune

Why: Apache-2.0 Saudi Arabic Chatterbox Multilingual fine-tune trained on Saudi podcast and number-normalized speech data; useful as a same-family comparison against NAMAA-Saudi-TTS.

Next step: Benchmark only for Saudi/Gulf dialect fit using the same cleaned Arabic sample; keep SILMA/Habibi first for MSA books and compare against NAMAA-Saudi-TTS, Saudi Qwen3-TTS, and Emirati voices before wiring.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python -c "# Load ChatterboxMultilingualTTS, apply FatimahEmadEldin/saudi-tts-chatterbox-finetuned T3 weights, synthesize outputs\external-tts-sample\arabic-tts-sample.txt, language_id='ar'"
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Saudi Chatterbox fine-tune" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Saudi TTS

Why: Apache-2.0 high-quality Saudi Arabic dialect voice candidate. It may be useful for Gulf/Saudi material, but it is dialect-specific and not a proven MSA audiobook voice.

Next step: Benchmark beside NAMAA-Saudi-TTS, Saudi Chatterbox fine-tune, Saudi Arabic Qwen3-TTS, and SILMA/Habibi on the same cleaned Arabic sample before any app wiring.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Saudi TTS" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Egyptian Arabic Chatterbox

Why: Apache-2.0 Egyptian Arabic Chatterbox fine-tune with 120 hours of clean Egyptian Arabic training data; useful for Egyptian dialect content, but not a general MSA book voice and the model card says GPU is needed for real-time inference.

Next step: Benchmark only for Egyptian/dialectal PDFs using the same cleaned Arabic sample; keep SILMA/Habibi first for MSA books unless listening tests clearly favor the dialect voice for that text.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Egyptian Arabic Chatterbox" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

NileTTS-XTTS

Why: Apache-2.0 Egyptian Arabic XTTS fine-tune from the 2026 NileTTS work; useful for Egyptian dialect content, but not a general MSA book voice.

Next step: Benchmark only for Egyptian/dialectal PDFs using the same cleaned Arabic sample; keep SILMA/Habibi first for MSA books unless listening tests clearly favor this dialect voice.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "NileTTS-XTTS" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Arabic XTTS-v2 Egyptian fine-tune

Why: Recent Arabic XTTS-v2 improvement project with Egyptian speaker fine-tuning and documented same-text comparisons. It is worth a listening benchmark for dialectal material, but the XTTS-v2 base license and voice-cloning setup keep it out of the permissive default path.

Next step: Benchmark externally only for Egyptian/dialectal PDFs, confirm CPML fit for the intended personal use, and compare long-form stability against SILMA/Habibi/NileTTS-XTTS on the exact same cleaned text.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Arabic XTTS-v2 Egyptian fine-tune" --kind tts --license "MIT project; XTTS-v2 base uses Coqui Public Model License" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Chatterbox-Multilingual

Why: MIT-licensed Chatterbox-Multilingual lists Arabic among 23 supported languages and has local generation examples, making it a strong free Arabic voice benchmark candidate.

Next step: Export the same cleaned Arabic text used for SILMA/Habibi and compare naturalness, pacing, watermarking, and setup complexity before wiring it into the app.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Chatterbox-Multilingual" --kind tts --license "MIT" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Chatterbox Arabic fine-tune

Why: MIT Chatterbox Arabic fine-tune claims improved Arabic pronunciation, diacritics, intonation, MSA support, and common dialect support, making it worth a same-text listening test against SILMA/Habibi before any app wiring.

Next step: Export the same cleaned Arabic sample used for SILMA/Habibi and compare MSA pronunciation, skipped words, repetition, long-sentence stability, and runtime; keep it benchmark-only until it wins human listening tests.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Chatterbox Arabic fine-tune" --kind tts --license "MIT" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Chatterbox-Multilingual ONNX

Why: MIT ONNX packaging for Chatterbox-Multilingual with Arabic included in the supported language list. It may be easier to benchmark on CPU-style free workers than heavier GPU voice models.

Next step: Export the same cleaned Arabic text used for SILMA/Habibi and compare ONNX Chatterbox naturalness, repetition, pacing, pronunciation, and runtime before any app wiring.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Chatterbox-Multilingual ONNX" --kind tts --license "MIT" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Spark-TTS Arabic

Why: Apache-2.0 Arabic fine-tune of Spark-TTS on ClArTTS, aimed at Classical/MSA narration, but the model card says non-diacritized input is out of scope and the Spark-TTS repo is required.

Next step: Benchmark externally only with diacritized text/reference audio, then compare listenability and setup complexity against SILMA and Habibi.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Spark-TTS Arabic" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Sofelia-TTS

Why: Apache-2.0 Palestinian Arabic TTS/voice-cloning model that may be useful for dialectal content, but it is not a standard MSA audiobook voice and its training data is private.

Next step: Benchmark externally only if the target text is Palestinian/dialectal Arabic; keep SILMA/Habibi ahead for MSA books.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Sofelia-TTS" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Arabic-F5-TTS-v2

Why: Arabic MSA voice candidate with strong sample claims, but it requires fully diacritized Arabic and is not permissive enough for a default public website.

Next step: Use only for personal listening tests unless the license is acceptable; do not wire as the default free permissive app voice.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Arabic-F5-TTS-v2" --kind tts --license "fair non-commercial research license" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

MOSS-TTS-Nano

Why: Supports Arabic among 20 languages and has a lightweight ONNX CPU inference path, making it promising for a free worker if Arabic quality beats SILMA/Habibi.

Next step: Export a cleaned Arabic sample, run the ONNX CLI with an Arabic reference voice, then compare listenability and runtime against SILMA on the same text.

python scripts\dry_run_pdf.py C:\path\to\arabic-book.pdf --include-speech-text --speech-sample-chars 1200
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "MOSS-TTS-Nano" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

tts-arabic-onnx

Why: Arabic-only ONNX package with FastPitch, tiny MixerTTS models, HiFi-GAN/Vocos vocoders, speaker and pace controls, and offline Python examples. It is promising for free CPU benchmarking, but license clarity must be resolved before production use.

Next step: Export the same cleaned Arabic sample and benchmark FastPitch, MixerTTS, speaker IDs, pace, and vowelizer options against SILMA, Supertonic, MOSS-TTS-Nano, and Chatterbox ONNX before any app wiring.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "tts-arabic-onnx" --kind tts --license "license not declared on model card/repo; confirm before production" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Supertonic 3

Why: Supertonic 3 supports Arabic, runs locally with ONNX on CPU, and is much smaller than GPU-class multilingual voices, making it a practical free benchmark voice for long-book workers.

Next step: Install the sidecar with scripts/setup_supertonic.ps1 or build with INSTALL_SUPERTONIC=1, then benchmark it against SILMA/Habibi on the same cleaned Arabic text.

python scripts\benchmark_voices.py --voices silma-local habibi-msa supertonic-ar espeak-ar-clear --text-file outputs\external-tts-sample\arabic-tts-sample.txt --out-dir outputs\voice-benchmark --write-report outputs\voice-benchmark-report.md

Qwen3-TTS

Why: Official Qwen3-TTS sources are strong and Apache-2.0, but the released model cards list 10 languages and do not include Arabic.

Next step: Do not add it to the Arabic voice dropdown until an official Arabic-capable checkpoint or Arabic fine-tune is verified.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample

Saudi Arabic Qwen3-TTS

Why: Apache-2.0 Qwen3-TTS fine-tune for Saudi/KSA Arabic speech; useful when the target text should sound Gulf/Saudi rather than MSA audiobook narration.

Next step: Benchmark only for Saudi/KSA dialect fit using the same cleaned Arabic text as SILMA/Habibi, then keep it external unless it wins listening tests and the worker can handle 1.7B-class runtime.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Saudi Arabic Qwen3-TTS" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md

Emirati Qwen3.5-TTS

Why: Apache-2.0 Qwen3-TTS-family Emirati Arabic fine-tune; a newer dialect benchmark beside the smaller Emirati VITS voice.

Next step: Benchmark only when Gulf/Emirati pronunciation is desired; keep SILMA/Habibi first for MSA books and compare against Emirati VITS Male before wiring anything.

python scripts\export_tts_sample.py C:\path\to\arabic-book.pdf --env-file outputs\recommended-ocr.env --out-dir outputs\external-tts-sample
python scripts\score_voice_listening.py --rating silma-local=5,4,4,5,5 --rating candidate=5,5,5,5,5 --write-report outputs\external-tts-sample\voice-listening-score.md --write-json outputs\external-tts-sample\voice-listening-score.json
python scripts\model_promotion_gate.py --candidate-name "Emirati Qwen3.5-TTS" --kind tts --license "Apache-2.0" --score-json outputs\external-tts-sample\voice-listening-score.json --same-sample --runtime-ok --privacy-ok --human-reviewed --write-report outputs\external-tts-sample\voice-promotion-gate.md