Skip to content

Benchmarks ​

AgentDocBench is an open, reproducible benchmark for "document → Markdown for agents". It measures what an agent needs from a converter: the words verbatim, in reading order, tables intact, fast, and in as few tokens as possible. It runs anymd, Docling, Marker, MarkItDown, Kreuzberg, Unstructured, and pdftotext on the same license-clean documents on GitHub-hosted runners.

anymd is one of the tools measured, and this benchmark lives in its repository. The scoring does not know which tool produced an output, the corpus and ground truth are public, and the categories where anymd loses are in the tables below like everything else. The harness, corpus, ground truth, and raw results are in bench/.

Leaderboard ​

38 documents in 12 categories. Scores are 0–100; higher is better. Every failed, timed-out, or unsupported document scores 0.

ToolOverallDocs convertedSentencesText F1Reading orderTable cells F1Time, all docsOutput tokens
anymd96.438/3897.797.298.892.211.5 s368,659
docling93.038/3894.494.594.489.92,432.4 s430,148
kreuzberg81.738/3890.196.496.838.416.0 s455,689
unstructured81.238/3892.097.193.938.4346.5 s414,333
markitdown76.838/3873.791.785.557.275.6 s538,388
marker71.030/3878.979.976.860.97,104.5 s277,779
pdftotext42.223/3860.671.452.00.00.90 s201,448

Overall is the mean of the category scores below, so every category weighs the same. Time and tokens cover only the documents each tool converted; the table after the categories compares tools on the same documents.

By category ​

CategoryDocsanymddoclingkreuzbergunstructuredmarkitdownmarkerpdftotext
Papers (math)396.791.582.580.374.256.783.3
Two-column papers398.193.170.560.847.665.075.0
Reports296.997.783.887.497.488.287.5
Financial tables495.292.470.671.965.989.574.0
Forms398.095.673.174.674.861.074.2
Scanned (OCR)377.978.462.460.50.053.30.0
CJK399.197.456.971.879.887.675.0
Slides496.093.882.084.986.591.037.5
Spreadsheets4100.085.8100.085.799.738.10.0
Word399.999.999.899.899.894.70.0
EPUB398.999.799.199.197.766.40.0
HTML399.690.5100.098.198.160.60.0

Where anymd loses: Reports (docling 97.7 vs 96.9); Scanned (OCR) (docling 78.4 vs 77.9); EPUB (docling 99.7 vs 98.9); HTML (kreuzberg 100.0 vs 99.6).

Speed and tokens on the 19 documents every tool converted ​

ToolTotal timeMedian per documentOutput tokens
anymd4.58 s0.04 s146,660
docling1,723.3 s63.9 s162,290
kreuzberg7.94 s0.20 s139,422
unstructured187.4 s7.74 s145,360
markitdown45.4 s2.06 s194,382
marker5,256.3 s161.7 s181,132
pdftotext0.66 s0.02 s147,183
Every document (score · time)
DocumentCategoryanymddoclingkreuzbergunstructuredmarkitdownmarkerpdftotext
paper-evschedpaper98.4 · 0.07 s98.9 · 103.3 s74.9 · 0.20 s71.0 · 9.04 s77.5 · 2.76 s77.3 · 46.4 s75.0 · 0.06 s
paper-rankonepaper94.8 · 0.06 s90.7 · 353.6 s98.0 · 0.41 s95.9 · 11.7 s75.6 · 3.51 stimeout100.0 · 0.10 s
paper-ulampaper96.9 · 0.02 s84.8 · 65.0 s74.7 · 0.20 s74.0 · 10.1 s69.4 · 2.06 s92.8 · 600.6 s75.0 · 0.04 s
twocol-bygpt5two-column96.7 · 0.10 s93.6 · 74.7 s62.2 · 0.39 s63.5 · 7.74 s47.5 · 4.03 s99.0 · 73.2 s75.0 · 0.12 s
twocol-smiletwo-column99.1 · 0.08 s91.6 · 70.4 s74.7 · 0.31 s58.2 · 9.88 s45.1 · 3.13 s95.9 · 112.2 s75.0 · 0.06 s
twocol-uscoretwo-column98.6 · 0.08 s94.0 · 73.8 s74.7 · 0.35 s60.6 · 7.28 s50.3 · 3.37 stimeout75.0 · 0.10 s
report-crs-dod-appropsreport94.8 · 0.04 s96.1 · 42.4 s74.5 · 0.26 s74.9 · 8.40 s95.8 · 2.86 s77.5 · 297.3 s75.0 · 0.03 s
report-plzreport99.0 · 0.01 s99.3 · 22.9 s93.0 · 0.10 s99.9 · 5.34 s99.1 · 1.63 s98.9 · 10.8 s100.0 · 0.01 s
fed-h8financial98.0 · 0.06 s91.0 · 621.1 s71.9 · 0.40 s75.0 · 14.5 s75.0 · 6.79 s91.1 · 24.0 s75.0 · 0.06 s
fin-bls-realerfinancial88.3 · 0.02 s87.7 · 32.0 s65.9 · 0.15 s68.3 · 5.80 s55.6 · 1.69 s84.1 · 428.0 s75.0 · 0.02 s
fin-census-incomefinancial99.6 · 0.05 s91.6 · 129.4 s69.6 · 0.26 s69.2 · 8.56 s33.0 · 2.55 s92.9 · 621.1 s70.8 · 0.04 s
invoice-borderlessfinancial94.8 · 0.00 s99.5 · 25.8 s75.0 · 0.07 s75.0 · 5.09 s100.0 · 1.04 s89.8 · 25.4 s75.0 · 0.01 s
form-1040esform97.5 · 0.05 s94.6 · 101.8 s69.8 · 0.22 s74.1 · 10.2 s74.5 · 5.26 stimeout75.0 · 0.04 s
form-w4form97.7 · 0.03 s92.5 · 63.9 s74.7 · 0.16 s75.0 · 6.35 s75.0 · 3.34 s94.4 · 594.8 s72.7 · 0.02 s
irs-w9form98.9 · 0.03 s99.8 · 37.2 s74.8 · 0.15 s74.7 · 7.84 s74.9 · 2.71 s88.6 · 508.7 s75.0 · 0.02 s
scan-nasa-budgetscanned71.6 · 2.22 s77.2 · 33.7 s37.2 · 2.17 s40.0 · 30.6 s0.0 · 0.94 s93.3 · 561.9 s0.0 · 0.01 s
scan-nasa-notesscanned62.1 · 1.69 s58.1 · 32.6 s66.7 · 2.11 s58.1 · 25.6 s0.0 · 0.95 s66.7 · 524.6 s0.0 · 0.01 s
scan-oklahoma-addressscanned100.0 · 6.59 s100.0 · 56.5 s83.3 · 5.52 s83.3 · 64.1 s0.0 · 0.97 stimeout0.0 · 0.01 s
cjk-jp-stat-elderlycjk99.1 · 0.03 s98.0 · 70.8 s52.8 · 0.14 s66.7 · 7.23 s97.2 · 1.73 s97.6 · 10.4 s75.0 · 0.02 s
cjk-tw-archivescjk98.4 · 0.02 s98.1 · 27.8 s75.0 · 0.22 s75.0 · 4.99 s75.0 · 1.64 s76.9 · 10.4 s75.0 · 0.01 s
cjk-tw-dgbas-cpicjk99.9 · 0.04 s96.0 · 50.9 s42.9 · 0.43 s73.7 · 7.73 s67.1 · 1.86 s88.3 · 11.7 s75.0 · 0.03 s
slides-epa-1bpslides91.7 · 0.01 s92.1 · 6.00 s86.9 · 0.07 s90.0 · 3.47 s91.5 · 1.05 s92.7 · 86.7 sunsupported
slides-markitdown-pptxslides98.5 · 0.00 s99.0 · 8.54 s93.9 · 0.06 s100.0 · 4.76 s97.1 · 0.98 s91.0 · 396.8 sunsupported
slides-nasa-clarreoslides94.5 · 0.04 s95.2 · 89.6 s74.5 · 0.13 s74.4 · 5.62 s82.4 · 2.12 s91.8 · 161.7 s75.0 · 0.08 s
slides-nist-pqc-updateslides99.3 · 0.04 s89.0 · 129.8 s72.7 · 0.09 s75.0 · 6.94 s75.0 · 1.55 s88.6 · 633.1 s75.0 · 0.02 s
csv-census-popest-2023spreadsheet100.0 · 0.00 s100.0 · 5.99 s100.0 · 0.06 s100.0 · 1.05 s100.0 · 0.95 sunsupportedunsupported
csv-usgs-quakes-weekspreadsheet100.0 · 0.00 s100.0 · 8.52 s100.0 · 0.07 s100.0 · 1.37 s100.0 · 0.97 sunsupportedunsupported
sheet-ers-crop-insurancespreadsheet100.0 · 0.00 s93.3 · 9.25 s100.0 · 0.06 s92.7 · 3.70 s98.9 · 0.97 s52.3 · 9.71 sunsupported
sheet-markitdown-xlsxspreadsheet100.0 · 0.00 s50.0 · 9.03 s100.0 · 0.06 s50.0 · 4.68 s100.0 · 0.97 s100.0 · 8.74 sunsupported
docx-hhs-market-researchdocx100.0 · 0.01 s100.0 · 6.40 s100.0 · 0.06 s100.0 · 3.43 s100.0 · 1.50 s87.9 · 735.9 sunsupported
docx-markitdowndocx100.0 · 0.00 s100.0 · 8.16 s99.5 · 0.06 s100.0 · 4.69 s99.5 · 1.07 s97.4 · 73.8 sunsupported
docx-nsf-aaac-minutesdocx99.8 · 0.00 s99.7 · 9.68 s99.7 · 0.06 s99.3 · 3.56 s99.8 · 1.25 s98.7 · 14.0 sunsupported
epub-gutenberg-jekyllepub100.0 · 0.01 s100.0 · 9.38 s100.0 · 0.54 s100.0 · 8.84 s100.0 · 1.06 s99.9 · 246.1 sunsupported
epub-gutenberg-relativityepub100.0 · 0.01 s99.9 · 6.89 s100.0 · 0.08 s100.0 · 6.50 s100.0 · 1.23 stimeoutunsupported
epub-markitdownepub96.8 · 0.00 s99.3 · 8.08 s97.2 · 0.06 s97.2 · 4.80 s93.2 · 0.96 s99.3 · 7.88 sunsupported
html-bls-ooh-software-developershtml98.7 · 0.00 s93.7 · 9.44 s100.0 · 0.07 s94.4 · 4.84 s94.4 · 1.10 s83.2 · 182.9 sunsupported
html-markitdown-wikipediahtml100.0 · 0.01 s88.9 · 10.6 s100.0 · 0.10 s100.0 · 6.22 s100.0 · 1.37 s98.5 · 85.5 sunsupported
html-wikipedia-roman-numeralshtml100.0 · 0.02 s88.9 · 7.47 s100.0 · 0.14 s100.0 · 3.90 s100.0 · 1.66 stimeoutunsupported

Tools ​

ToolVersionTimed runsRun
anymdanymd 8.2.032026-10-01
docling2.130.012026-09-25
kreuzberg4.10.432026-09-25
unstructured0.27.812026-09-25
markitdown0.1.832026-09-25
marker2.0.012026-09-25
pdftotextpdftotext version 24.02.032026-09-25

Machine: Linux x86_64, 4 CPUs (GitHub-hosted runner). pdftotext is the reference extractor for born-digital PDFs (bench/reference/), so its text F1 on those documents is 100 by construction; it outputs plain text, so it scores 0 on tables and on non-PDF formats.

How it is scored ​

Every output is normalized the same way (Unicode NFKC, Markdown and HTML markup removed, whitespace collapsed, curly quotes straightened, spaces between CJK characters dropped) and compared with the document's ground truth:

  • Sentences: key sentences copied verbatim from the document must appear verbatim. Glued words, split columns, or dropped lines fail the sentence. For scanned documents these are the sentences a correct OCR produces.
  • Text F1: bag-of-words F1 against a reference text (the PDF text layer, the DOCX/PPTX XML text, or the EPUB spine text). Recall drops when text is lost, precision when noise is added.
  • Reading order: headings and passage openings must appear in order. The score is the longest in-order chain divided by the number of strings, so two-column interleaving and scrambled sections both cost.
  • Table cells F1: every ground-truth table row is matched to the output row with the longest in-order run of equal cells. Recall is matched cells over truth cells; on complete tables, precision is matched cells over the cells of the output tables they came from. Pipe tables and HTML tables both count; plain text scores 0.
  • Document score is the mean of the scores that apply; category score is the mean over its documents, with a failed, timed-out, or unsupported document counting 0; overall is the mean of the category scores.
  • Time is the wall time of a fresh process per file (start-up included), median of 3 runs (1 run for tools that take minutes per document), after one untimed warm-up. Tokens are o200k_base.

The full method, the ground-truth schema, and the known limits are in bench/README.md.

Corpus ​

Every document is public domain, CC0, CC BY, CC BY-SA, MIT-licensed, or under an open government license, and is pinned by SHA-256. Generated from bench/corpus.json:

DocumentCategoryFormatPagesLicenseSource
paper-evschedpaperpdf23CC-BY-4.0Emily van Huffelen, Roel Brouwer, Marjan van den Akker (Utrecht University) (arXiv:2403.03109v1)
paper-rankonepaperpdf27CC-BY-4.0Khazhgali Kozhasov, Josué Tonelli-Cueto (arXiv:2201.02191v2)
paper-ulampaperpdf11CC-BY-4.0Pat Devlin, Leo Douhovnikoff (Swarthmore College) (arXiv:2403.02276v1)
twocol-bygpt5two-columnpdf16CC-BY-4.0Jonas Belouadi, Steffen Eger (arXiv:2212.10474v2)
twocol-smiletwo-columnpdf13CC-BY-4.0Miao Peng, Ben Liu, Qianqian Xie, Wenjie Xu, Hua Wang, Min Peng (arXiv:2210.04870v3)
twocol-uscoretwo-columnpdf17CC-BY-4.0Jonas Belouadi, Steffen Eger (arXiv:2202.10062v3)
report-crs-dod-appropsreportpdf12public-domain-us-govCongressional Research Service (Cameron M. Keys)
report-plzreportpdf5public-domain-us-govU.S. Access Board
fed-h8financialpdf22public-domain-us-govBoard of Governors of the Federal Reserve System
fin-bls-realerfinancialpdf5public-domain-us-govU.S. Bureau of Labor Statistics
fin-census-incomefinancialpdf10public-domain-us-govU.S. Census Bureau (Gloria G. Guzman)
invoice-borderlessfinancialpdf2MITMicrosoft Corporation (markitdown test files)
form-1040esformpdf12public-domain-us-govInternal Revenue Service
form-w4formpdf4public-domain-us-govInternal Revenue Service
irs-w9formpdf6public-domain-us-govInternal Revenue Service
scan-nasa-budgetscannedpdf3public-domain-us-govJesse L. Mitchell (Office of the Special Assistant for Science and Technology) / Dwight D. Eisenhower Presidential Library, NARA
scan-nasa-notesscannedpdf3public-domain-us-govRobert Piland (White House science advisory staff) / Dwight D. Eisenhower Presidential Library, NARA
scan-oklahoma-addressscannedpdf7public-domain-us-govThe White House (President Dwight D. Eisenhower) / Dwight D. Eisenhower Presidential Library, NARA
cjk-jp-stat-elderlycjkpdf4PDL-1.0総務省統計局 (Statistics Bureau of Japan)
cjk-tw-archivescjkpdf4CC-BY-4.0國家發展委員會檔案管理局 (National Archives Administration, National Development Council, Taiwan)
cjk-tw-dgbas-cpicjkpdf6Taiwan-OGDL-1.0行政院主計總處 (Directorate-General of Budget, Accounting and Statistics, Executive Yuan, Taiwan)
slides-epa-1bpslidespptx27public-domain-us-govU.S. Environmental Protection Agency
slides-markitdown-pptxslidespptx6MITMicrosoft (markitdown contributors)
slides-nasa-clarreoslidespdf15public-domain-us-govYolanda L. Shea, Rajendra Bhatt / NASA Langley Research Center
slides-nist-pqc-updateslidespdf16public-domain-us-govDustin Moody / NIST Computer Security Division
csv-census-popest-2023spreadsheetcsv–public-domain-us-govU.S. Census Bureau, Population Division
csv-usgs-quakes-weekspreadsheetcsv–public-domain-us-govU.S. Geological Survey, Earthquake Hazards Program
sheet-ers-crop-insurancespreadsheetxlsx–public-domain-us-govUSDA Economic Research Service
sheet-markitdown-xlsxspreadsheetxlsx–MITMicrosoft (markitdown contributors)
docx-hhs-market-researchdocxdocx–public-domain-us-govU.S. Department of Health and Human Services
docx-markitdowndocxdocx–MITMicrosoft (markitdown contributors)
docx-nsf-aaac-minutesdocxdocx–public-domain-us-govU.S. National Science Foundation (AAAC)
epub-gutenberg-jekyllepubepub–public-domainRobert Louis Stevenson; Project Gutenberg
epub-gutenberg-relativityepubepub–public-domainAlbert Einstein, translated by Robert W. Lawson; Project Gutenberg
epub-markitdownepubepub–MITMicrosoft (markitdown test suite)
html-bls-ooh-software-developershtmlhtml–public-domain-us-govU.S. Bureau of Labor Statistics
html-markitdown-wikipediahtmlhtml–CC-BY-SA-4.0 (Wikipedia content in an MIT test file)Wikipedia contributors (article 'Microsoft'); Microsoft markitdown
html-wikipedia-roman-numeralshtmlhtml–CC-BY-SA-4.0Wikipedia contributors (article 'Roman numerals', oldid 1374259684)

Local doc-VLM resource measurements ​

Production worker run 36785961923, commit befd305, measured ten synthetic pages: English, Traditional Chinese and Simplified Chinese clean text, scans and photos, plus a mixed-language page. Each page starts a fresh worker, so timing includes model loading and process overhead. These are not OmniDocBench scores and are not directly comparable to the earlier 50-page spike.

Target / deviceDecoder weightsMedian seconds/pagep90 seconds/pagePeak process RSS MiBMean CER
Linux x64 / CPUnone81.493.453201.90%
Linux x64 / CPUq8229.7280.143781.96%
Linux x64 / CPUq4207.3254.641862.41%
Linux arm64 / CPUnone108.2129.553861.90%
Linux arm64 / CPUq859.873.443671.98%
Linux arm64 / CPUq462.477.342021.94%
macOS arm64 / Metalnone38.947.837631.88%
macOS arm64 / CPUq869.494.844771.94%
macOS arm64 / CPUq489.4110.444582.41%
Windows x64 / CPUnone101.8127.653581.90%
Windows x64 / CPUq8254.2338.043481.96%
Windows x64 / CPUq4230.6285.741752.47%

All twelve configurations converted all ten pages. Quantization applies only to the decoder's linear weights; vision, embeddings and layout stay unquantized. q8/q4 reduce peak RSS on Linux and Windows, but slow x64 CPUs substantially. They remain experimental, CPU-only options, not the default. macOS quantized rows use CPU rather than Metal. RSS was sampled every 100 ms (Windows uses the process peak working set), so it is not a whole-system or GPU-memory measurement.

The default remains unquantized. Automatic OCR never downloads models: without explicit setup it uses tesseract; anymd setup ocr opts into installed local models, including slower CPU inference. Native PDF text keeps its existing extraction path. The VLM binary adds 7.5 MiB on Linux x64, 6.1 MiB on Linux arm64, 6.9 MiB on macOS arm64 and 8.2 MiB on Windows x64 compared with the no-VLM build.

The Windows job passed tests, both binary builds and all measurements, then reached its two-hour limit while saving the Rust cache. Its measurements were uploaded before cancellation; the cancelled job itself is not a green release-target check.

OmniDocBench v1.6 ​

OmniDocBench (CVPR 2025) is the public benchmark for turning page images into Markdown: 1,651 pages, scored on text, display formulas, tables, and reading order. We ran anymd on all 1,651 pages with the official end2end evaluator, pinned by commit. anymd read each page image with tesseract, the way it reads any scan or image: it returns the recognised text and nothing else. There is no layout model and no table, formula, or reading-order recognition, and tesseract runs with its default English model.

OverallText (edit distance, lower is better)Formula (CDM)Table (TEDS)Reading order (edit distance, lower is better)
anymd 8.1.021.40.55419.30.20.423

Overall is the leaderboard formula, ((1 - text edit distance) x 100 + table TEDS + formula CDM) / 3. 4 of the 1,651 pages hit anymd's 60 s OCR timeout, and 53 came back empty.

The scores published by the model authors, for context, are self-reported and come from vision-language models trained for this task:

ModelOverall (self-reported)
TeleOCR (formerly NaviDC)96.91
OvisOCR296.47
PaddleOCR-VL-1.696.34
GLM-OCR95.22

This row measures anymd's scan and image path, which today is tesseract text recognition with no layout, table, or formula model. anymd's strength is documents that carry a text layer (PDF, Word, PowerPoint, Excel, EPUB, HTML), where it scores 96.4 on AgentDocBench above. The dataset ships page images only, so anymd's PDF engine is not measured here.

The dataset is licensed for research use only. We download it at run time, evaluate anymd, and publish our own score; nothing from the dataset is redistributed. The method, pins, and rerun command are in bench/omnidocbench. The scores above are the evaluator's own summary (run_summary.json).

Image and video extraction ​

Images and video require different extractors; there is no combined score. The image row below reuses the historical OmniDocBench v1.6 evaluation above, not a measurement of the current anymd OCR model. TeleOCR is the highest-scoring alternative in that v1.6 comparison (upstream leaderboard); its 96.91 is a published model-author result, not our same-run measurement.

For video embedded subtitles, the reference alternative is direct FFmpeg: it retains every authored cue in these fixtures and is the extractor anymd itself uses. The video rows are historical, same-run measurements of the published anymd 8.5.1 CLI and FFmpeg 6.1.1. They do not measure visual scene understanding or speech recognition. Speech-to-text below is a separate audio benchmark.

DatasetSamplesMetricanymdAlternativeEvidence
OmniDocBench v1.6 page images1,651 pagesOverall, higher is better21.4 (8.1.0, English tesseract)TeleOCR 96.91 (author-reported)Image method and pins
MP4 mov_text subtitle fixtures4 clips / 12 cuesExact text + start-second recall91.7% (11/12)FFmpeg 100% (12/12)Raw video results
Matroska SubRip subtitle fixtures4 clips / 12 cuesExact text + start-second recall91.7% (11/12)FFmpeg 100% (12/12)Raw video results

The video datasets are small, MIT-licensed, authored regression fixtures: English, multiline text, CJK and repeated captions, muxed into three-second black videos. They are not representative film or lecture datasets. At 2026-10-08T02:07:30Z, both tools converted all eight clips successfully on the same Linux x86_64 Build lease. anymd retained 11 of 12 cues in each dataset, dropping the second identical caption at a different timestamp; FFmpeg retained all 12. Precision was 100% for both. That version's rolling-caption cleanup caused this loss; it is not a transcription error.

These dated results are not relabelled when subtitle rendering changes. The subtitle fidelity regression reruns the same authored corpus through the built CLI and MCP read, plus separate sidecar and edge-case fixtures. The native integration test writes a commit/hash receipt next to its tested binary; that is a correctness check, not a new timing benchmark. To keep a separate receipt, run:

bash
python3 scripts/subtitle_fidelity.py --binary target/release/anymd --receipt target/subtitle-fidelity.json

Total extraction time was 2.108 s vs 1.128 s (anymd vs FFmpeg) for MP4 and 2.412 s vs 1.155 s for Matroska. Each tool ran once per clip, sequentially; times include process startup, exclude fixture generation, and are not throughput guarantees. anymd also probes metadata and renders Markdown; direct FFmpeg only extracts subtitles. The video benchmark method and rerun commands include exact versions, scoring rules, fixture text and all outputs. Cue end times, subsecond timestamps, frame OCR, metadata accuracy and audio transcription were not measured in these video rows.

Reproduce ​

bash
python3 bench/fetch.py .cache/bench-corpus          # download and verify the corpus
cargo build --release -p anymd     # anymd
python3 -m venv .venv && .venv/bin/pip install -r bench/requirements/harness.txt -r bench/requirements/markitdown.txt

ANYMD_BIN=target/release/anymd .venv/bin/python bench/run.py --tool anymd \
  --corpus .cache/bench-corpus --out bench/results/anymd.json
.venv/bin/python bench/run.py --tool markitdown --corpus .cache/bench-corpus --out bench/results/markitdown.json
.venv/bin/python bench/leaderboard.py --print

The Benchmark workflow runs every tool on its own GitHub-hosted runner with the same system packages (poppler, tesseract with Chinese and Japanese, pandoc), and publishes the merged results and every Markdown output as an artifact.

Submit a tool ​

Add an adapter in bench/adapters/<tool>.py (a name, a version, and the command that prints Markdown), pin the tool in bench/requirements/<tool>.txt, add it to the workflow matrix, and open a pull request. The workflow runs the benchmark; commit the resulting bench/results/<tool>.json and the regenerated leaderboard. Details are in Submitting a tool.

The official @modelcontextprotocol/server-pdf is not included because it has no headless text path: it renders PDFs in an interactive viewer, and its read_pdf_bytes tool returns base64-encoded bytes.

Speech-to-text ​

We selected transcribe-cpp 0.2.4 / Qwen3-ASR-1.7B Q8_0 as the one local ASR runtime/model for every language. The crate built on all four benchmark targets: x86_64 Linux, aarch64 Linux, x86_64 macOS and x86_64 Windows. CrispASR failed on Linux arm64 and macOS x64; its optional standalone aligner is not required for ASR. Whisper appears below only as the historical benchmark control, not a shipping engine option.

Source: ASR run 36523821486, fixed-seed, revision-pinned samples; 200 utterances per Linux dataset. Qwen and whisper-turbo ran on CPU, four threads. Scores were recalculated from saved reference/hypothesis pairs, without rerunning inference.

Accuracy ​

Lower is better. Raw CER here means the existing baseline: NFKC, lowercase, punctuation/symbol/space/control stripping and OpenCC t2s on both sides. It is not punctuation-sensitive literal raw-text CER. English uses the pinned Open ASR Leaderboard EnglishTextNormalizer and WER.

Normalised (bracketed Latin glosses removed, numerals unified) applies the same transformations to references and hypotheses: remove Latin parenthetical annotations before stripping punctuation, then numeral ITN via cn2an 0.5.24 (zh/yue) or kanjize 1.6.1 (ja). Parentheses containing CJK text or just numbers remain. This is a scoring-sensitivity diagnostic, not a verified ground-truth correction: annotations may be spoken, and generic numeral conversion may alter lexical numerals. Kana/kanji readings are not collapsed. Normalisation can make scores worse as well as better.

DatasetMetricQwen rawQwen normalised (bracketed Latin glosses removed, numerals unified)whisper-turbo rawwhisper-turbo normalised (same rules)
FLEURS enWER4.544.546.336.33
FLEURS zhCER7.732.539.215.03
FLEURS yueCER5.413.8912.1012.29
FLEURS jaCER5.935.854.804.65
LibriSpeech test-cleanWER2.002.002.232.23

Mandarin Qwen normalized CER has a 95% utterance-bootstrap CI of [1.92, 3.22]; whisper-turbo [4.30, 5.77]. Mandarin's original 602 errors include 372 deletions: removing Latin parenthetical annotations reduces deletions to 50 and total errors to 280; numeral ITN reduces total errors to 189. This explains most of the 7.73% raw score, rather than showing a model defect.

Accepted Japanese trade-off: on this 200-utterance FLEURS sample, Qwen trails whisper-turbo (5.93 vs 4.80 raw CER). Japanese numeral-only diagnostics give 5.79 vs 4.67; adding katakana-to-hiragana folding gives 5.56 vs 4.59 normalised CER. This separate diagnostic retains parenthetical annotations and the baseline OpenCC step; it is not the annotation-removal column above. Reproduce it with python3 bench-asr/report.py RESULTS --cjk-diagnostics --normalizer-dir NORMALIZERS using the saved run transcripts. Converting everything to kana readings is a different metric and still trails (4.50 vs 3.74); it cannot be presented as corrected CER. Real errors remain, including 地殻 → 近く and Taipei → 大阪. We accept this gap to use one model across languages.

No official-score reproduction claim. Qwen's published evaluation uses bfloat16, vLLM, greedy decoding, max_new_tokens=1024 and no language hint. The technical report uses CER for Mandarin and Cantonese but does not publish its complete text-normalisation protocol. Our CPU-quantized, language-hinted, sampled runs differ; the bootstrap intervals cover sample variation, not those protocol differences.

Runtime cost ​

On the full Linux samples transcribe-cpp's model-load-excluded RTF was 0.574 (en), 0.535 (zh), 0.559 (yue), 0.369 (ja), and 0.631 (LibriSpeech); RTF is compute time divided by audio time. See the original run's report for runner CPUs and peak memory; these are benchmark observations, not throughput guarantees.

The harness and all SHA-256/revision pins are in bench-asr/. report.py --cjk-diagnostics recalculates both scoring columns from saved summary.json / results.jsonl jobs. Its additional scoring dependencies are cn2an 0.5.24 and kanjize 1.6.1; the English normalizer is pinned in pins.json.