NeMo
English
audio
speech
forced-alignment
reference-text-alignment
speech-processing
mfa
whisperx
python
metric:mae
Eval Results (legacy)
Instructions to use vertox-ai/speech-text-data-aligners with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- NeMo
How to use vertox-ai/speech-text-data-aligners with NeMo:
# tag did not correspond to a valid NeMo domain.
- Notebooks
- Google Colab
- Kaggle
|
Download docs/TESTING.md from vertox-ai/speech-text-data-aligners: direct link, hf CLI and curl.
- Browser
- Download file 8.4 kB
-
https://huggingface.co/vertox-ai/speech-text-data-aligners/resolve/main/docs/TESTING.md
- Command line
-
hf download hf://vertox-ai/speech-text-data-aligners/docs/TESTING.md
-
curl -L -o TESTING.md https://huggingface.co/vertox-ai/speech-text-data-aligners/resolve/main/docs/TESTING.md
8.4 kB
| # Testing and Quality | |
| This page defines the deterministic release gate and records the current per-file | |
| coverage map. Ordinary tests do not download models, call remote services, require a | |
| GPU, or invoke heavyweight aligners. | |
| ## Environment | |
| Use the core development environment or the local equivalent: | |
| ```bash | |
| conda activate speech-text-data-aligners | |
| python -m pip install -e . --no-deps | |
| ``` | |
| Pinned development tools are in [`requirements.txt`](../requirements.txt) and | |
| [`environments/core-dev.yml`](../environments/core-dev.yml). | |
| ## Deterministic Gate | |
| Run from the repository root: | |
| ```bash | |
| python -m pytest | |
| ruff check . | |
| ruff format --check . | |
| python -m mypy src | |
| lint-imports | |
| coverage erase | |
| coverage run -m pytest | |
| coverage report --show-missing | |
| coverage json -o coverage.json | |
| python -m pytest tests/quality/test_per_file_coverage.py -q | |
| ``` | |
| `coverage.json` is generated evidence and is ignored by Git. Regenerate it before | |
| running the per-file gate; a stale file is not accepted as current proof. | |
| ## Current Observed Gate | |
| Captured in this checkout on 2026-10-30 before documentation-only changes to source: | |
| | Gate | Result | | |
| |---|---| | |
| | Pytest | 635 passed, 3 skipped | | |
| | Aggregate implementation line coverage | 98.74% | | |
| | Lowest implementation file | 93.33% | | |
| | Lowest shared-layer file | 95.65% | | |
| | Ruff lint/format | Pass | | |
| | Strict mypy | Pass in 53 source files | | |
| | Import Linter | 7 kept, 0 broken | | |
| | Architecture tests | 10 passed | | |
| | Header/manifest/per-file tests | Pass | | |
| The repository gate is at least 90% for every non-empty implementation file and at | |
| least 90% aggregate. This repository additionally enforces at least 95% for shared | |
| `core`, `data`, `application`, `benchmarking`, and `runtime` files. | |
| ## Test Boundaries | |
| | Test area | Purpose | | |
| |---|---| | |
| | `tests/unit/core` | Normalization, mapping, models, validation, errors, extraction, readiness | | |
| | `tests/unit/data` | CSV preservation, WAV resolution/probing, readiness cohort verification | | |
| | `tests/unit/application` | Public use cases, publication, benchmarking, readiness, materialization | | |
| | `tests/unit/benchmarking` | Metrics, reports, readiness distributions | | |
| | `tests/unit/runtime` | Process, artifacts, receipts, evidence integrity | | |
| | `tests/unit/backends` | Configs, native builders/parsers, adapters, registry, isolated providers | | |
| | `tests/unit/cli` | Argument validation and delegation to application services | | |
| | `tests/architecture` | Dependency direction and readiness isolation | | |
| | `tests/quality` | Headers, manifest consistency, per-file coverage | | |
| | `tests/integration/*` | Opt-in real subprocess/model smoke tests | | |
| Integration tests are marked `integration` plus `mfa`, `nemo`, or `whisperx`. They are | |
| excluded from ordinary confidence unless their runtime and explicit inputs are | |
| available. | |
| ## Opt-In Integration | |
| MFA: | |
| ```bash | |
| RUN_MFA_INTEGRATION=1 \ | |
| MFA_CONDA_PREFIX=/opt/conda/envs/speech-aligners-mfa \ | |
| MFA_SMOKE_WAV=/absolute/path/to/file.wav \ | |
| MFA_SMOKE_TRANSCRIPT='Exact authoritative transcript.' \ | |
| python -m pytest tests/integration/mfa/test_mfa_real.py -m 'integration and mfa' -v | |
| ``` | |
| WhisperX: | |
| ```bash | |
| RUN_WHISPERX_INTEGRATION=1 \ | |
| WHISPERX_PYTHON=/opt/conda/envs/speech-aligners-whisperx/bin/python \ | |
| WHISPERX_SMOKE_WAV=/absolute/path/to/file.wav \ | |
| WHISPERX_SMOKE_TRANSCRIPT='Exact authoritative transcript.' \ | |
| WHISPERX_MODEL_DIR=/opt/models/whisperx-align \ | |
| python -m pytest tests/integration/whisperx/test_whisperx_real.py -m 'integration and whisperx' -v | |
| ``` | |
| NeMo: | |
| ```bash | |
| NEMO_PYTHON=/opt/runtimes/nemo-speech-v3.0.0/.venv/bin/python \ | |
| NEMO_ALIGN_SCRIPT=/opt/runtimes/nemo-speech-v3.0.0/tools/nemo_forced_aligner/align.py \ | |
| NEMO_MODEL_PATH=/opt/models/stt_en_fastconformer_hybrid_large_pc.nemo \ | |
| NEMO_WAV_PATH=/absolute/path/to/file.wav \ | |
| NEMO_TRANSCRIPT='Exact authoritative transcript.' \ | |
| NEMO_DEVICE=cuda \ | |
| python -m pytest tests/integration/nemo/test_nemo_real.py -m 'integration and nemo' -v | |
| ``` | |
| NeMo may download the registry model only after `NEMO_ALLOW_MODEL_DOWNLOAD=1` is set | |
| explicitly. A local checkpoint is preferred. Integration commands require the listed | |
| hardware/data and are not part of ordinary unit CI. | |
| ## Implementation-to-Test and Coverage Map | |
| Coverage values are current line coverage for each implementation file. Empty package | |
| markers are intentionally zero bytes and excluded from implementation coverage; they | |
| provide no executable behavior. | |
| | Implementation | Focused test | Coverage | | |
| |---|---|---:| | |
| | `speech_text_data_aligners/__init__.py` | `tests/unit/test_public_api.py` | 100.00% | | |
| | `application/annotate.py` | `tests/unit/application/test_annotate.py` | 98.00% | | |
| | `application/benchmark.py` | `tests/unit/application/test_benchmark.py` | 100.00% | | |
| | `application/materialize.py` | `tests/unit/application/test_materialize.py` | 95.68% | | |
| | `application/readiness.py` | `tests/unit/application/test_readiness.py` | 100.00% | | |
| | `backends/registry.py` | `tests/unit/backends/test_registry.py` | 100.00% | | |
| | `backends/mfa/backend.py` | `tests/unit/backends/mfa/test_backend.py` | 100.00% | | |
| | `backends/mfa/config.py` | `tests/unit/backends/mfa/test_config.py` | 99.03% | | |
| | `backends/mfa/corpus.py` | `tests/unit/backends/mfa/test_corpus.py` | 99.19% | | |
| | `backends/mfa/runner.py` | `tests/unit/backends/mfa/test_runner.py` | 98.62% | | |
| | `backends/mfa/textgrid.py` | `tests/unit/backends/mfa/test_textgrid.py` | 97.91% | | |
| | `backends/nemo/backend.py` | `tests/unit/backends/nemo/test_backend.py` | 100.00% | | |
| | `backends/nemo/config.py` | `tests/unit/backends/nemo/test_config.py` | 98.11% | | |
| | `backends/nemo/ctm.py` | `tests/unit/backends/nemo/test_ctm.py` | 100.00% | | |
| | `backends/nemo/manifest.py` | `tests/unit/backends/nemo/test_manifest.py` | 100.00% | | |
| | `backends/nemo/runner.py` | `tests/unit/backends/nemo/test_runner.py` | 100.00% | | |
| | `backends/whisperx/backend.py` | `tests/unit/backends/whisperx/test_backend.py` | 100.00% | | |
| | `backends/whisperx/config.py` | `tests/unit/backends/whisperx/test_config.py` | 100.00% | | |
| | `backends/whisperx/parser.py` | `tests/unit/backends/whisperx/test_parser.py` | 100.00% | | |
| | `backends/whisperx/provider.py` | `tests/unit/backends/whisperx/test_provider.py` | 98.74% | | |
| | `backends/whisperx/segments.py` | `tests/unit/backends/whisperx/test_segments.py` | 100.00% | | |
| | `backends/whisperx/worker.py` | `tests/unit/backends/whisperx/test_worker.py` | 93.33% | | |
| | `benchmarking/metrics.py` | `tests/unit/benchmarking/test_metrics.py` | 100.00% | | |
| | `benchmarking/readiness.py` | `tests/unit/benchmarking/test_readiness.py` | 100.00% | | |
| | `benchmarking/reports.py` | `tests/unit/benchmarking/test_reports.py` | 98.84% | | |
| | `cli/annotate.py` | `tests/unit/cli/test_annotate.py` | 100.00% | | |
| | `cli/benchmark.py` | `tests/unit/cli/test_benchmark.py` | 100.00% | | |
| | `cli/main.py` | `tests/unit/cli/test_main.py` | 95.83% | | |
| | `cli/readiness.py` | `tests/unit/cli/test_readiness.py` | 100.00% | | |
| | `core/errors.py` | `tests/unit/core/test_errors.py` | 100.00% | | |
| | `core/extraction.py` | `tests/unit/core/test_extraction.py` | 95.65% | | |
| | `core/models.py` | `tests/unit/core/test_models.py` | 100.00% | | |
| | `core/normalization.py` | `tests/unit/core/test_normalization.py` | 100.00% | | |
| | `core/protocols.py` | `tests/unit/core/test_protocols.py` | 100.00% | | |
| | `core/readiness.py` | `tests/unit/core/test_readiness.py` | 100.00% | | |
| | `core/validation.py` | `tests/unit/core/test_validation.py` | 98.33% | | |
| | `data/audio.py` | `tests/unit/data/test_audio.py` | 97.37% | | |
| | `data/metadata.py` | `tests/unit/data/test_metadata.py` | 98.08% | | |
| | `data/readiness.py` | `tests/unit/data/test_readiness.py` | 100.00% | | |
| | `runtime/alignment_evidence.py` | `tests/unit/runtime/test_alignment_evidence.py` | 100.00% | | |
| | `runtime/artifacts.py` | `tests/unit/runtime/test_artifacts.py` | 100.00% | | |
| | `runtime/process.py` | `tests/unit/runtime/test_process.py` | 100.00% | | |
| | `runtime/receipts.py` | `tests/unit/runtime/test_receipts.py` | 100.00% | | |
| ## Coverage Interpretation | |
| - Coverage is line coverage from the deterministic full suite with real integration | |
| tests skipped. | |
| - High coverage does not replace behavioral review or empirical alignment evidence. | |
| - A skipped integration test is not counted as a successful real backend run. | |
| - Aggregate coverage cannot compensate for a file below its individual threshold. | |
| - When an implementation file is added, add its focused test and update this map in the | |
| same change. | |