Async Voice TTS Normalization Benchmark
Async TN is a diagnostic adapter for the Async Voice AI Text-to-Speech Normalization Benchmark. It evaluates Spokenform deterministically against the upstream normalized text. It does not change normalization behavior and does not use upstream category labels as runtime hints.
Source and license
The adapter uses the English data/sentences.json and multilingual
data/multilingual-sentences.json files from the Apache-2.0 Hugging Face Space:
https://huggingface.co/spaces/async-vocie-ai/text-to-speech-normalization-benchmark
The source revision is pinned to
516dfbf54c8f85db865b65de4272b1f4280ad1dd. Raw URLs include this revision, and
run metadata records the SHA-256 and byte size of every downloaded source and
reference file. The full corpus is never packaged or committed.
Suites and languages
The English suite maps en to Spokenform en_US. The multilingual suite
supports en, de, es, fr, it, and pt, with en mapped to en_US and
the other codes mapped to their Spokenform language. Both source and resolved
language are retained in every result.
Commands
python -m benchmarks.async_tn --suite english
python -m benchmarks.async_tn --suite multilingual
python -m benchmarks.async_tn --suite multilingual --language de
python -m benchmarks.async_tn --suite english --category date
python -m benchmarks.async_tn --suite all --offline
python -m benchmarks.async_tn --suite all --profile extended --show-failures semantic
python -m benchmarks.async_tn --download-only
Use --case, --limit, --speech-wer-threshold, --report none,
--normalize-literals, --refresh, and --cache-dir for focused runs.
--language is a multilingual filter and is rejected for the English-only
suite. --offline never makes a network request, and cannot be combined with
--refresh.
Cache and result files
Data is cached under:
.cache/async-tn/516dfbf54c8f85db865b65de4272b1f4280ad1dd/
metadata.json records the source repository, commit, license, hashes, and
sizes. Downloaded files are validated and replaced atomically. A cache miss in
offline mode is an error.
Each run writes benchmark-results/async-tn/<run-id>/ containing:
summary.json, counts, metrics, diagnostics, configuration, and provenance;rows.jsonl, one sentence record per evaluated case;units.jsonl, one annotated unit record per source unit;failures.jsonlandfailures.md, triage-oriented failure records;exclusions.jsonl, quarantined source records;reference.json, pinned upstream published TTS reference values;report.html, a self-contained static dashboard.
Metrics and mapping
Sentence and unit records include literal exactness, speech exactness, speech
equivalence, and word error rate from benchmarks.text_metrics. Category and
language reports expose total, scorable, correct, incorrect, quarantined, and
runtime-error denominators. Percentages are never shown without their counts.
Sentence exactness and the all_units_correct unit result remain separate.
The source annotation is mapped into the expected full sentence using
Spokenform’s OffsetMap and deterministic diff replacements. The actual unit
is mapped from the single prepare() result for the complete sentence. A
replacement crossing a unit boundary is marked mapping-ambiguous rather than
being assigned to a unit by heuristic substring matching.
Source offsets are validated when provided. Missing offsets are resolved by exact text in unit order. Missing, invalid, overlapping, repeated ambiguous, or unsupported records are quarantined with explicit reason codes. Unknown category strings are retained and included in machine-readable aggregates. The dashboard’s default category presentation threshold is 30 units only; it does not remove low-frequency categories from result files.
Profiles and safety
The default profile uses conservative Spokenform behavior with literal
normalization disabled. extended is opt-in and enables the existing extended
literal behavior. The benchmark calls prepare() once per sentence and never
passes an upstream category or other benchmark-only oracle to the runtime.
Ownership, risk tier, provenance, and failure-family fields are diagnostic
metadata. Benchmark failures do not authorize broad runtime rule changes.
Dashboard
report.html opens directly from a filesystem path. It has English,
multilingual, failures, and metadata views, category search and threshold
controls, language/category/family/ownership/risk failure filters, live
visible-row counts, source-stage details, and a reproducibility panel. It
contains no CDN, external font, remote image, or server dependency. Dataset
and runtime strings are HTML-escaped.
The failure explorer separates authoritative sentence failures from unit-level
diagnostics. Sentence rows always use sentence-level source, expected, and
actual text. Unit rows expose projected expected and projected actual text as
diagnostic views only. When a source edit crosses a unit boundary, the unit row
is marked mapping-ambiguous; the raw projected text stays available in the
diagnostic details, but it is never presented as an authoritative unit target
or unit output and the unit remains unscorable.
The published reference values come from the pinned overview/category JSON and represent the upstream audio/LLM judge methodology. Spokenform values are computed against normalized text. The report displays these values separately for context and never computes a mixed-method winner or ranking.
Comparing runs
python -m benchmarks.async_tn_compare \
benchmark-results/async-tn/run-a \
benchmark-results/async-tn/run-b
Comparison requires matching benchmark, repository, commit, source file hashes,
suite, language mapping, profile, and configuration hash. It reports sentence
and unit failures, language/category deltas, stable case and unit IDs, and new,
resolved, and remaining quarantines. Use --allow-incompatible only for an
intentional exploratory comparison; the result records that override.
Baselines and policy
Baseline commands are run after implementation against the pinned source. Keep only small policy-approved summary or documentation artifacts. Do not commit the downloaded corpus, full source-bearing failure data, or generated reports unless repository policy explicitly requests them. Async TN is diagnostic and is not a replacement for the false-positive safety suite or existing benchmark gates.