EVEMISSTechnology

Repository guide · architecture · v2

openai / whisper · Architecture

A Python repository organized as a 'whisper' package plus 'tests'. One detected entrypoint — whisper/transcribe.py's __main__ guard — calls cli(), and every bounded path ends at external or unresolved targets. Module roles come from static call degree. 1,233 of 1,388 recorded relations are unresolved, so the dependency picture is partial and statically inferred.

Original repository
openai/whisper
License
MIT · open-source license
Analyzed revision · last verified
86098128c0b4f24f0e2aa2994de830614b474227 ·

openai/whisper Architecture Guide: Structure and Entry Points

Terms used on this page
Entrypoint record
A file the analyzer marks as a place where execution can start. When it carries a __main__ guard excerpt, the file contains an if __name__ == "__main__": block and the excerpt shows what that block calls; without an excerpt, the file was flagged by its name only.
Bounded static execution path
A call chain reconstructed from the source code without running it, stopped after a fixed number of steps. It shows how far the code can be followed on paper, not what happens at run time.
Unresolved boundary
Where a static path stops because the next call goes into an external library or cannot be resolved without running the code. It marks the edge of this analysis, not a defect in the repository.
Static relations
Calls and imports found in the source. "External or unresolved" relations point outside the analyzed files.
Module role
The analyzer's label for a file, inferred from how many calls go in and out (for example core, entry/orchestration, leaf). It describes a position in the call graph, not the authors' design.
Test-like files
Files whose names or locations look like tests. This analysis counts them; it does not run them.
Observed · inferred · author-claimed · unresolved
How each statement is supported: read directly from the analyzed files; derived by the analyzer from them; stated by the repository's authors (metadata, README); or not established by this analysis.
Verified
Two uses on these pages. In an analyzer record ("verified provenance", "a verified entrypoint") it means the record was read directly from the analyzed files, which these guides call observed; for an entrypoint, the __main__ guard text is present. Since the analyzer fix of 2026-10-04, a file that only has an entrypoint-like name such as cli.py or main.py is recorded as inferred; guides analyzed before that still call such a file verified, and it is still only a guess about how the file is used. It does not mean the code was run or tested. "Last verified" is the date the guide last passed the lab's checks against the analysis record of the stated revision; it is not a review of the repository itself.

Shape at a Glance

GitHub metadata records Python as the primary language, and the repository's own description — 'Robust Speech Recognition via Large-Scale Weak Supervision' — is author-claimed metadata, not analyzer-established.

The reconstruction's counts: 45 analyzed files, 1 entrypoint, 95 resolved static call relations, and 12 bounded execution paths. Two top-level directories are recorded as subsystem candidates: 'whisper' and 'tests'. The analyzer's summary additionally describes the code as organized around data, notebooks, tests, and whisper.

Role records name the whisper package's modules — __init__, __main__, audio, decoding, model, normalizers (basic and english), timing, tokenizer, transcribe, triton_ops, utils — plus five test modules: test_audio, test_normalizer, test_timing, test_tokenizer, test_transcribe.

At the root, README.md, pyproject.toml, requirements.txt, and LICENSE are classified as project-level important files. whisper/transcribe.py is flagged as likely an entrypoint, and the packet's detected __main__ guard sits in that file.

Entrypoint and Control Flow

cli() is the first function reached: whisper/transcribe.py holds the detected __main__ guard, and its body calls cli(): if __name__ == "__main__": cli().

Every listed bounded execution path starts at whisper/transcribe.py:__main__, reaches cli() as a local call, and terminates at an external or unresolved target with terminal_reason 'unresolved_boundary'; no cycles are recorded and no path is marked truncated. Named terminal targets include argparse.ArgumentParser, several parser.add_argument calls, and torch.cuda.is_available.

Paths end at these symbols because the analyzer records them as external_or_unresolved rather than resolving them into local code — a documented boundary, not a completed local call. The analyzer labels whisper/transcribe.py an entry/orchestration candidate (3 incoming, 18 outgoing static calls).

Core Modules and Inferred Roles

Roles below are inferred by the analyzer from static resolved call degree and entrypoint membership; they describe call-graph shape, not confirmed runtime responsibility.

  • whisper/model.py: highest recorded degree, 22 incoming and 20 outgoing calls; service/core candidate.
  • whisper/timing.py: 16 in, 9 out; whisper/utils.py: 14 in, 2 out; whisper/tokenizer.py: 12 in, 2 out — service/core candidates with high incoming counts.
  • whisper/decoding.py: 11 in, 13 out; whisper/audio.py: 8 in, 5 out — service/core candidates.
  • whisper/normalizers/english.py: 3 in, 3 out, service/core candidate; normalizers/__init__.py and basic.py: 1 in, 0 out each, leaf/data-boundary candidates.
  • whisper/triton_ops.py: 1 in, 1 out; whisper/__main__.py: 0 in, 1 out, orchestration candidate.

Where Static Paths Stop

The packet records 1,388 static relations — 1,207 calls and 181 imports — of which 1,233 are external_or_unresolved and 155 local.

The bounded paths stop at argparse.ArgumentParser, parser.add_argument, and torch.cuda.is_available, each recorded as an external_or_unresolved call target. torch appears on both sides of the boundary: declared as a runtime dependency in requirements.txt and reached from cli() as an unresolved external target.

The analyzer documents that reflection, runtime dependency injection, dynamic imports, monkey-patching, generated code, framework runtime wiring, and dynamic dispatch are not resolved. With 1,233 of 1,388 relations unresolved, this boundary list is where the static picture ends; behavior beyond those edges is not established by this analysis.

Dependencies Between Parts

requirements.txt declares seven runtime dependencies: numba, numpy, torch, tqdm, more-itertools, tiktoken, and triton (>=2.0.0). Dependency records come only from requirements-style manifests; pyproject.toml dependency tables are not parsed, so this list may be incomplete.

Incoming-call concentrations suggest the rest of the code depends most on whisper/model.py, whisper/timing.py, whisper/utils.py, and whisper/tokenizer.py. Test modules are recorded with zero incoming calls and outward-only calls — for example tests/test_timing.py at 0 in and 6 out — which reads as tests exercising library modules rather than being called by them.

Because 1,233 of 1,388 relations are unresolved, the packet does not yield a complete cross-module dependency map.

What This Static Analysis Cannot Show

This analysis is static only: reflection, runtime dependency injection, dynamic imports, monkey-patching, generated code, framework runtime wiring, and dynamic dispatch are not resolved.

Install, run, and build inference is partial, and installation commands are not verified. README claim extraction is line-based and may capture code lines rather than prose, so README-derived statements are author-claimed at most.

Manifest entries about the analyzer's actual capabilities describe the analyzer, not this repository, and are excluded from evidence. How the code's runtime framework wiring behaves is not established by this packet's static relations; the packet's unresolved teaching claim states static analysis cannot establish runtime framework behavior.

A Grounded Reading Order

Start with the manifests and project-level important files — README.md, pyproject.toml, requirements.txt, LICENSE. A grounded teaching claim then recommends tracing the bounded execution path and inspecting unresolved boundaries before changing code.

Next, read whisper/transcribe.py from its __main__ guard and follow cli() to its unresolved edges; the detected entrypoint and the listed bounded paths both run there.

Close with the high-incoming modules — whisper/model.py, whisper/timing.py, whisper/utils.py, whisper/tokenizer.py — whose static call degree marks them as the most depended-upon parts.

What this analysis could not establish

The writing model's own notes on the analysis record. Identifiers such as lim_3, exec_* or claim_… name records of that analysis; the claims table cites the same records.

  • The reconstruction overview and repository summary report 12 bounded execution paths, but execution_paths_static lists 10 records; this asset cites only the listed path records.
  • Per-directory file counts (whisper/ 18, tests/ 7, root 13, .github/ 3, data/ 2, notebooks/ 2) appear in the inventory but carry no citation ID, so directory sizes are described only through summary_repository.
  • boundaries_static and core_flow_static lines (including 'k.title reached from whisper/transcribe.py [cli]') have no citable IDs, so boundaries were asserted only from execution-path records.
  • The resolved-relation sample lines (for example, tests importing whisper modules) lack citation IDs, so test-to-library dependencies are described only through inferred role degrees.
  • The packet records no plugin-loading mechanism; none is asserted.
Claims and evidence — 40 claims, 40 supported by an independent verifier

Every substantive statement above is a claim bound to grounding IDs of the analyzed revision. Global grounding IDs are namespaced by the analysis run.

Claim Epistemic status Verifier Grounding (global IDs)
c1 The repository's detected shape is a 'whisper' package plus a 'tests' directory, with one detected entrypoint in whisper/transcribe.py whose bounded static paths end at external or unresolved targets; 1,233 of 1,388 recorded relations are unresolved. inferred supported analysis_ee52b965e66bce7b:summary_repository, analysis_ee52b965e66bce7b:py_entry_e9d8e13fe4d4, analysis_ee52b965e66bce7b:exec_210328c6174a, analysis_ee52b965e66bce7b:relation_counts
c2 Module roles and control flow in this asset are inferred from static call degree and bounded execution paths, not observed at runtime. inferred supported analysis_ee52b965e66bce7b:role_10, analysis_ee52b965e66bce7b:exec_210328c6174a
c3 GitHub metadata records Python as the repository's primary language. observed supported analysis_ee52b965e66bce7b:meta_primary_language
c4 The repository's GitHub description is 'Robust Speech Recognition via Large-Scale Weak Supervision'; this is author-claimed metadata, not analyzer-established. author_claimed supported analysis_ee52b965e66bce7b:meta_description
c5 The architecture reconstruction records 45 analyzed files, 1 entrypoint, 95 resolved static call relations, and 12 bounded execution paths. inferred supported analysis_ee52b965e66bce7b:architecture_reconstruction
c6 The packet's verified subsystem records mark two top-level directories as subsystem candidates: 'whisper' and 'tests'. observed supported analysis_ee52b965e66bce7b:subsys_2, analysis_ee52b965e66bce7b:subsys_1
c7 The analyzer's summary describes the code as organized around the directories data, notebooks, tests, and whisper, and notes the repository includes tests. inferred supported analysis_ee52b965e66bce7b:summary_repository
c8 Role records name the whisper package's modules: __init__, __main__, audio, decoding, model, normalizers (basic and english), timing, tokenizer, transcribe, triton_ops, and utils; tests/ holds test_audio, test_normalizer, test_timing, test_tokenizer, and test_transcribe. inferred supported analysis_ee52b965e66bce7b:role_6, analysis_ee52b965e66bce7b:role_7, analysis_ee52b965e66bce7b:role_8, analysis_ee52b965e66bce7b:role_9, analysis_ee52b965e66bce7b:role_10, analysis_ee52b965e66bce7b:role_11, analysis_ee52b965e66bce7b:role_12, analysis_ee52b965e66bce7b:role_13, analysis_ee52b965e66bce7b:role_14, analysis_ee52b965e66bce7b:role_15, analysis_ee52b965e66bce7b:role_16, analysis_ee52b965e66bce7b:role_17, analysis_ee52b965e66bce7b:role_18, analysis_ee52b965e66bce7b:role_1, analysis_ee52b965e66bce7b:role_2, analysis_ee52b965e66bce7b:role_3, analysis_ee52b965e66bce7b:role_4, analysis_ee52b965e66bce7b:role_5
c9 The root inventory classifies README.md, pyproject.toml, requirements.txt, and LICENSE as project-level important files. observed supported analysis_ee52b965e66bce7b:important_1, analysis_ee52b965e66bce7b:important_3, analysis_ee52b965e66bce7b:important_4, analysis_ee52b965e66bce7b:important_5
c10 whisper/transcribe.py is flagged in the inventory as likely an entrypoint, and the packet's detected Python __main__ guard is in that file. observed supported analysis_ee52b965e66bce7b:important_6, analysis_ee52b965e66bce7b:py_entry_e9d8e13fe4d4
c11 The detected entrypoint is a __main__ guard in whisper/transcribe.py whose body calls cli(): if __name__ == "__main__": cli(). observed supported analysis_ee52b965e66bce7b:py_entry_e9d8e13fe4d4
c12 Every listed bounded execution path starts at whisper/transcribe.py:__main__, steps into cli() as a local call, then terminates at an external or unresolved target with terminal_reason 'unresolved_boundary'; no cycles are recorded and no path is truncated. inferred supported analysis_ee52b965e66bce7b:exec_210328c6174a, analysis_ee52b965e66bce7b:exec_873b5bbd14cf, analysis_ee52b965e66bce7b:exec_bd66f158fc76
c13 Named terminal targets are argparse.ArgumentParser, several parser.add_argument calls, and torch.cuda.is_available. inferred supported analysis_ee52b965e66bce7b:exec_210328c6174a, analysis_ee52b965e66bce7b:exec_873b5bbd14cf, analysis_ee52b965e66bce7b:exec_bd66f158fc76
c14 The paths end there because the analyzer records those symbols as external_or_unresolved rather than resolving them to local code; the stop is a recorded boundary, not a completed local call. inferred supported analysis_ee52b965e66bce7b:exec_210328c6174a, analysis_ee52b965e66bce7b:relation_counts
c15 whisper/transcribe.py is labeled an entry/orchestration candidate, with 3 incoming and 18 outgoing static calls. inferred supported analysis_ee52b965e66bce7b:role_16
c16 Module roles are inferred by the analyzer from static resolved call degree and entrypoint membership; they describe call-graph shape, not confirmed runtime responsibility. inferred supported analysis_ee52b965e66bce7b:role_10, analysis_ee52b965e66bce7b:role_14
c17 whisper/model.py shows the highest recorded degree — 22 incoming and 20 outgoing calls — and is labeled a service/core candidate. inferred supported analysis_ee52b965e66bce7b:role_10
c18 whisper/timing.py (16 in, 9 out), whisper/utils.py (14 in, 2 out), and whisper/tokenizer.py (12 in, 2 out) are service/core candidates with high incoming counts. inferred supported analysis_ee52b965e66bce7b:role_14, analysis_ee52b965e66bce7b:role_18, analysis_ee52b965e66bce7b:role_15
c19 whisper/decoding.py (11 in, 13 out) and whisper/audio.py (8 in, 5 out) are labeled service/core candidates. inferred supported analysis_ee52b965e66bce7b:role_9, analysis_ee52b965e66bce7b:role_8
c20 The normalizers split into whisper/normalizers/english.py (3 in, 3 out; service/core candidate) and two leaf/data-boundary candidates — normalizers/__init__.py and basic.py — each with 1 incoming and 0 outgoing calls. inferred supported analysis_ee52b965e66bce7b:role_13, analysis_ee52b965e66bce7b:role_11, analysis_ee52b965e66bce7b:role_12
c21 Lowest-degree modules include whisper/triton_ops.py (1 in, 1 out) and whisper/__main__.py (0 in, 1 out; orchestration candidate). inferred supported analysis_ee52b965e66bce7b:role_17, analysis_ee52b965e66bce7b:role_7
c22 The packet records 1,388 static relations — 1,207 calls and 181 imports — of which 1,233 are external_or_unresolved and 155 are local. observed supported analysis_ee52b965e66bce7b:relation_counts
c23 The bounded paths stop at argparse.ArgumentParser, parser.add_argument, and torch.cuda.is_available, each recorded as an external_or_unresolved call target. inferred supported analysis_ee52b965e66bce7b:exec_210328c6174a, analysis_ee52b965e66bce7b:exec_873b5bbd14cf, analysis_ee52b965e66bce7b:exec_bd66f158fc76
c24 torch appears on both sides of the boundary: declared as a runtime dependency in requirements.txt and reached from cli() as an unresolved external target. inferred supported analysis_ee52b965e66bce7b:dep_3, analysis_ee52b965e66bce7b:exec_bd66f158fc76
c25 The analyzer documents that reflection, runtime dependency injection, dynamic imports, monkey-patching, generated code, framework runtime wiring, and dynamic dispatch are not resolved. observed supported analysis_ee52b965e66bce7b:lim_1
c26 With 1,233 of 1,388 relations unresolved, this boundary list is where the static picture ends; behavior beyond those edges is not established by this analysis. inferred supported analysis_ee52b965e66bce7b:relation_counts, analysis_ee52b965e66bce7b:lim_1
c27 requirements.txt declares seven runtime dependencies: numba, numpy, torch, tqdm, more-itertools, tiktoken, and triton (version >=2.0.0). observed supported analysis_ee52b965e66bce7b:dep_1, analysis_ee52b965e66bce7b:dep_2, analysis_ee52b965e66bce7b:dep_3, analysis_ee52b965e66bce7b:dep_4, analysis_ee52b965e66bce7b:dep_5, analysis_ee52b965e66bce7b:dep_6, analysis_ee52b965e66bce7b:dep_7
c28 Dependency records come only from requirements-style manifests; pyproject.toml dependency tables are not parsed, so the declared list may be incomplete. observed supported analysis_ee52b965e66bce7b:lim_3
c29 Incoming-call concentrations suggest the rest of the code depends most on whisper/model.py, whisper/timing.py, whisper/utils.py, and whisper/tokenizer.py. inferred supported analysis_ee52b965e66bce7b:role_10, analysis_ee52b965e66bce7b:role_14, analysis_ee52b965e66bce7b:role_18, analysis_ee52b965e66bce7b:role_15
c30 Test modules are recorded with zero incoming calls and outward-only calls — for example tests/test_timing.py at 0 in and 6 out — which reads as tests exercising library modules rather than being called by them. inferred supported analysis_ee52b965e66bce7b:role_3, analysis_ee52b965e66bce7b:role_1, analysis_ee52b965e66bce7b:role_2, analysis_ee52b965e66bce7b:role_4, analysis_ee52b965e66bce7b:role_5
c31 Because 1,233 of 1,388 relations are unresolved, the packet does not yield a complete cross-module dependency map. inferred supported analysis_ee52b965e66bce7b:relation_counts
c32 Reflection, runtime dependency injection, dynamic imports, monkey-patching, generated code, framework runtime wiring, and dynamic dispatch are not resolved by this static analysis. observed supported analysis_ee52b965e66bce7b:lim_1
c33 Install, run, and build inference is partial, and installation commands are not verified by the analyzer. observed supported analysis_ee52b965e66bce7b:lim_2
c34 README claim extraction is line-based and may capture code lines instead of prose, so README-derived statements are author-claimed at most. observed supported analysis_ee52b965e66bce7b:lim_4
c35 Manifest entries describing the analyzer's actual capabilities concern the analyzer, not the analyzed repository, and are excluded from repository evidence. observed supported analysis_ee52b965e66bce7b:lim_5
c36 How the code's runtime framework wiring behaves is not established by this packet's static relations; the packet's own unresolved teaching claim states static analysis cannot establish runtime framework behavior. unresolved supported analysis_ee52b965e66bce7b:claim_7c9925f9c8f4, analysis_ee52b965e66bce7b:lim_1
c37 A grounded teaching claim recommends starting with manifests and important symbols, then tracing the bounded execution path and inspecting unresolved boundaries before changing code. inferred supported analysis_ee52b965e66bce7b:claim_e56db45165bf
c38 The packet classifies README.md, pyproject.toml, requirements.txt, and LICENSE as project-level important files. observed supported analysis_ee52b965e66bce7b:important_1, analysis_ee52b965e66bce7b:important_3, analysis_ee52b965e66bce7b:important_4, analysis_ee52b965e66bce7b:important_5
c39 A practical second step is whisper/transcribe.py: the detected __main__ guard and every listed bounded path run through its cli(). inferred supported analysis_ee52b965e66bce7b:py_entry_e9d8e13fe4d4, analysis_ee52b965e66bce7b:exec_210328c6174a
c40 Finish with the high-incoming modules — whisper/model.py, whisper/timing.py, whisper/utils.py, whisper/tokenizer.py — since their static degree marks them as the most depended-upon parts. inferred supported analysis_ee52b965e66bce7b:role_10, analysis_ee52b965e66bce7b:role_14, analysis_ee52b965e66bce7b:role_18, analysis_ee52b965e66bce7b:role_15

Sources, rights and disclosure · attribution-license-templates/v0.1

Rights notice. Original repository hosted on GitHub. Repository source code, documentation, names, media, and related project materials remain subject to the rights of their respective authors, contributors, and other rights holders and to applicable repository license terms.

Platform notice. GitHub is the source hosting platform for the linked repository. GitHub and related marks are trademarks of GitHub, Inc. EVEMISS Technology is not affiliated with or endorsed by GitHub unless explicitly stated otherwise.

How this page is produced. This page was produced using revision-aware repository analysis and AI-assisted editorial tooling. Technical claims are tied to the analyzed repository revision and may be revalidated when the source repository changes.

AI-assisted analysis. Reviewed by EVEMISS Technology through human–AI collaborative review. · Report a rights concern · Back to the overview