# isruihu/slideasr-bench architecture

> Architecture diagram of the GitHub repository isruihu/slideasr-bench, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/isruihu/slideasr-bench
- Repository: https://github.com/isruihu/slideasr-bench

## Overview

VAPO is a GPU-parallel benchmark runner for slide-enhanced speech recognition. Its primary workflow loads SlideASR examples, selects an audio or audio-visual model, transcribes each item, and appends per-item results. Model implementations include direct multimodal slide input, OCR-derived slide context, and VAPO’s visually anchored <think>/<answer> prompting. A separate evaluation workflow prepares text and entity matches, calculates WER and entity metrics, then aggregates results. The graph reflects sampled runtime code; README-documented benchmark/model options are included, but unsampled evaluation wiring is not inferred.

Main entry points: [`run.py`](https://github.com/isruihu/slideasr-bench/blob/main/run.py) (GPU runner), [`model/base_model.py`](https://github.com/isruihu/slideasr-bench/blob/main/model/base_model.py) (Audio inference base), [`evaluation/slide_asr_evaluation/prepare_asr_result_for_metrics.py`](https://github.com/isruihu/slideasr-bench/blob/main/evaluation/slide_asr_evaluation/prepare_asr_result_for_metrics.py) (Normalize and match entities), [`evaluation/slide_asr_evaluation`](https://github.com/isruihu/slideasr-bench/tree/main/evaluation/slide_asr_evaluation) (Prepared metric data)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_execution["Benchmark execution"]
  node_runner["GPU runner<br/>[run.py]"]
  node_registries["Model and dataset registry<br/>[config.py]"]
  node_queues["Worker queues<br/>[run.py]"]
end

subgraph group_models["Recognition models"]
  node_baseaudio["Audio inference base<br/>[base_model.py]"]
  node_baseav["Audio-visual base<br/>[base_model.py]"]
  node_ocr["OCR context<br/>[base_model.py]"]
  node_qwen25["Qwen2.5 Omni<br/>[qwen2_5_omni.py]"]
  node_vapo["VAPO prompting<br/>[qwen2_5_omni.py]"]
  node_qwen3["Qwen3 Omni<br/>[qwen3_omni.py]"]
  node_qwen2audio["Qwen2 Audio<br/>[qwen2_audio.py]"]
  node_midasheng["MiDasheng<br/>[midashenglm.py]"]
end

subgraph group_evaluation["Metric evaluation"]
  node_prepare["Normalize and match entities"]
  node_metrics["WER and entity metrics"]
  node_metricutils["Text and metric utilities<br/>[utils.py]"]
  node_aggregate["Metric aggregation"]
end

subgraph group_data["Benchmark data"]
  node_dataset["SlideASR datasets<br/>[slide_asr_bench.py]"]
  node_benchfiles["SlideASR files"]
  node_resultfiles["Inference JSONL<br/>[run.py]"]
  node_itemprocessor["Item processing<br/>[slide_asr_bench.py]"]
  node_metricfiles["Prepared metric data"]
end

node_user(("Benchmark operator"))
node_paddle["PaddleOCR models"]

node_user -->|"starts run"| node_runner
node_runner -->|"selects entries"| node_registries
node_runner -->|"loads samples"| node_dataset
node_dataset -->|"reads examples"| node_benchfiles
node_dataset -->|"skips completed IDs"| node_resultfiles
node_runner -->|"dispatches tasks"| node_queues
node_runner -->|"starts workers"| node_registries
node_runner -->|"collects results"| node_queues
node_runner -->|"appends results"| node_resultfiles
node_queues -->|"delivers items"| node_itemprocessor
node_itemprocessor -->|"runs audio inference"| node_baseaudio
node_itemprocessor -->|"runs visual inference"| node_baseav
node_baseaudio -->|"gets slide text"| node_ocr
node_ocr -.->|"calls OCR"| node_paddle
node_baseaudio -->|"dispatches atom"| node_qwen25
node_baseav -->|"dispatches atom"| node_qwen25
node_baseaudio -->|"dispatches atom"| node_qwen3
node_baseav -->|"dispatches atom"| node_qwen3
node_baseaudio -->|"dispatches atom"| node_qwen2audio
node_baseaudio -->|"dispatches atom"| node_midasheng
node_vapo -->|"uses generation"| node_qwen25
node_user -->|"evaluates results"| node_prepare
node_prepare -->|"reads transcripts"| node_resultfiles
node_prepare -->|"normalizes and matches"| node_metricutils
node_prepare -->|"writes prepared data"| node_metricfiles
node_metrics -->|"reads prepared data"| node_metricfiles
node_metrics -->|"calculates WER"| node_metricutils
node_metrics -->|"writes metric data"| node_metricfiles
node_aggregate -->|"reads metric data"| node_metricfiles

click node_runner "https://github.com/isruihu/slideasr-bench/blob/main/run.py"
click node_registries "https://github.com/isruihu/slideasr-bench/blob/main/config.py"
click node_queues "https://github.com/isruihu/slideasr-bench/blob/main/run.py"
click node_dataset "https://github.com/isruihu/slideasr-bench/blob/main/dataset/slide_asr_bench.py"
click node_benchfiles "https://github.com/isruihu/slideasr-bench/tree/main/resource"
click node_resultfiles "https://github.com/isruihu/slideasr-bench/blob/main/run.py"
click node_itemprocessor "https://github.com/isruihu/slideasr-bench/blob/main/dataset/slide_asr_bench.py"
click node_baseaudio "https://github.com/isruihu/slideasr-bench/blob/main/model/base_model.py"
click node_baseav "https://github.com/isruihu/slideasr-bench/blob/main/model/base_model.py"
click node_ocr "https://github.com/isruihu/slideasr-bench/blob/main/model/base_model.py"
click node_qwen25 "https://github.com/isruihu/slideasr-bench/blob/main/model/qwen2_5_omni.py"
click node_vapo "https://github.com/isruihu/slideasr-bench/blob/main/model/qwen2_5_omni.py"
click node_qwen3 "https://github.com/isruihu/slideasr-bench/blob/main/model/qwen3_omni.py"
click node_qwen2audio "https://github.com/isruihu/slideasr-bench/blob/main/model/qwen2_audio.py"
click node_midasheng "https://github.com/isruihu/slideasr-bench/blob/main/model/midashenglm.py"
click node_prepare "https://github.com/isruihu/slideasr-bench/blob/main/evaluation/slide_asr_evaluation/prepare_asr_result_for_metrics.py"
click node_metrics "https://github.com/isruihu/slideasr-bench/blob/main/evaluation/slide_asr_evaluation/calculate_metrics.py"
click node_metricutils "https://github.com/isruihu/slideasr-bench/blob/main/evaluation/slide_asr_evaluation/utils.py"
click node_aggregate "https://github.com/isruihu/slideasr-bench/blob/main/evaluation/slide_asr_evaluation/view_metric_result.py"
click node_metricfiles "https://github.com/isruihu/slideasr-bench/tree/main/evaluation/slide_asr_evaluation"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_runner,node_registries,node_queues toneBlue
class node_baseaudio,node_baseav,node_ocr,node_qwen25,node_vapo,node_qwen3,node_qwen2audio,node_midasheng toneAmber
class node_prepare,node_metrics,node_metricutils,node_aggregate toneMint
class node_dataset,node_benchfiles,node_resultfiles,node_itemprocessor,node_metricfiles toneRose
class node_user,node_paddle toneIndigo
```

## Components

### Benchmark execution

- [GPU runner](https://github.com/isruihu/slideasr-bench/blob/main/run.py): `run.py`
- [Model and dataset registry](https://github.com/isruihu/slideasr-bench/blob/main/config.py): `config.py`
- [Worker queues](https://github.com/isruihu/slideasr-bench/blob/main/run.py): `run.py`

### Recognition models

- [Audio inference base](https://github.com/isruihu/slideasr-bench/blob/main/model/base_model.py): `model/base_model.py`
- [Audio-visual base](https://github.com/isruihu/slideasr-bench/blob/main/model/base_model.py): `model/base_model.py`
- [OCR context](https://github.com/isruihu/slideasr-bench/blob/main/model/base_model.py): `model/base_model.py`
- [Qwen2.5 Omni](https://github.com/isruihu/slideasr-bench/blob/main/model/qwen2_5_omni.py): `model/qwen2_5_omni.py`
- [VAPO prompting](https://github.com/isruihu/slideasr-bench/blob/main/model/qwen2_5_omni.py): `model/qwen2_5_omni.py`
- [Qwen3 Omni](https://github.com/isruihu/slideasr-bench/blob/main/model/qwen3_omni.py): `model/qwen3_omni.py`
- [Qwen2 Audio](https://github.com/isruihu/slideasr-bench/blob/main/model/qwen2_audio.py): `model/qwen2_audio.py`
- [MiDasheng](https://github.com/isruihu/slideasr-bench/blob/main/model/midashenglm.py): `model/midashenglm.py`

### Metric evaluation

- [Normalize and match entities](https://github.com/isruihu/slideasr-bench/blob/main/evaluation/slide_asr_evaluation/prepare_asr_result_for_metrics.py): `evaluation/slide_asr_evaluation/prepare_asr_result_for_metrics.py`
- [WER and entity metrics](https://github.com/isruihu/slideasr-bench/blob/main/evaluation/slide_asr_evaluation/calculate_metrics.py): `evaluation/slide_asr_evaluation/calculate_metrics.py`
- [Text and metric utilities](https://github.com/isruihu/slideasr-bench/blob/main/evaluation/slide_asr_evaluation/utils.py): `evaluation/slide_asr_evaluation/utils.py`
- [Metric aggregation](https://github.com/isruihu/slideasr-bench/blob/main/evaluation/slide_asr_evaluation/view_metric_result.py): `evaluation/slide_asr_evaluation/view_metric_result.py`

### Benchmark data

- [SlideASR datasets](https://github.com/isruihu/slideasr-bench/blob/main/dataset/slide_asr_bench.py): `dataset/slide_asr_bench.py`
- [SlideASR files](https://github.com/isruihu/slideasr-bench/tree/main/resource): `resource`
- [Inference JSONL](https://github.com/isruihu/slideasr-bench/blob/main/run.py): `run.py`
- [Item processing](https://github.com/isruihu/slideasr-bench/blob/main/dataset/slide_asr_bench.py): `dataset/slide_asr_bench.py`
- [Prepared metric data](https://github.com/isruihu/slideasr-bench/tree/main/evaluation/slide_asr_evaluation): `evaluation/slide_asr_evaluation`

### Other components

- **Benchmark operator**
- **PaddleOCR models**

## Connections

- Benchmark operator → GPU runner: starts run
- GPU runner → Model and dataset registry: selects entries
- GPU runner → SlideASR datasets: loads samples
- SlideASR datasets → SlideASR files: reads examples
- SlideASR datasets → Inference JSONL: skips completed IDs
- GPU runner → Worker queues: dispatches tasks
- GPU runner → Model and dataset registry: starts workers
- GPU runner → Worker queues: collects results
- GPU runner → Inference JSONL: appends results
- Worker queues → Item processing: delivers items
- Item processing → Audio inference base: runs audio inference
- Item processing → Audio-visual base: runs visual inference
- Audio inference base → OCR context: gets slide text
- OCR context → PaddleOCR models: calls OCR
- Audio inference base → Qwen2.5 Omni: dispatches atom
- Audio-visual base → Qwen2.5 Omni: dispatches atom
- Audio inference base → Qwen3 Omni: dispatches atom
- Audio-visual base → Qwen3 Omni: dispatches atom
- Audio inference base → Qwen2 Audio: dispatches atom
- Audio inference base → MiDasheng: dispatches atom
- VAPO prompting → Qwen2.5 Omni: uses generation
- Benchmark operator → Normalize and match entities: evaluates results
- Normalize and match entities → Inference JSONL: reads transcripts
- Normalize and match entities → Text and metric utilities: normalizes and matches
- Normalize and match entities → Prepared metric data: writes prepared data
- WER and entity metrics → Prepared metric data: reads prepared data
- WER and entity metrics → Text and metric utilities: calculates WER
- WER and entity metrics → Prepared metric data: writes metric data
- Metric aggregation → Prepared metric data: reads metric data
