wai.access.services: caption quality anyone can recompute, audio description, sign language and a completeness claim (ACC) #396
Loading…
Reference in a new issue
No description provided.
Delete branch "wai/access-services"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What this adds
wai.access.services(wai/extensions/access-services.md): access services for a room session, and figures about them that any verifier recomputes from signed records.Caption quality from the signed revisions (§3, §4).
record_startto the commitment's author. Words can also be placed directly on the room clock. The classcapture,statedornonesays which applies. The figure gives the mean (rounded down), min, max, p50 and p95, all at a fixed rank.transcript,reviewedorselfnames what the reference is.figure_mismatchorfigure_inputs_mismatchwhen it does not match what the verifier recomputes.Audio description (§5). A description record holds:
Script and voice each carry an origin label: human, machine or machine-reviewed. A voice must start between 35 ms early and 45 ms late of the end of the duck, and end no later than 45 ms after the duck begins to rise. These are DAPT §5.5's bounds, which DAPT takes from EBU R 37. The record maps, written by hand, onto a DAPT document (W3C CRD 2026-06-26): the ducking becomes Mixing Instructions on the Script Event, and the voice an Audio Recording or Synthesized Audio. Player obligations cite EN 301 549 V4.1.1 clauses 7.2.1–7.2.3 and 7.3.
Sign language (§6). A signing record binds each object of a
wai.avatar.posestream, or of a video of a signer, by digest to the final caption revisions it translates. A review (scopetranslation) signs it off. Its figures are each segment's delay behind the speech and, for video, a floor: QVGA and 20 fps, from EN 301 549 V4.1.1 clauses 6.5.2 and 6.5.3, which clause 4.2.4 NOTE 3 names.Completeness claim (§7). For each declared captions, description and signing track, the verifier checks:
§7.3 lists the tolerance each text states, and where none does. The claim also reports how much of each description is spoken over captioned dialogue, as a figure, not a refusal.
§9 maps each figure onto 47 CFR 79.1(j)(2), (j)(3) and (k)(2)(iv)/(vi), 79.3(a)(3), the UK regulator's 2013 and 2024 statements on live subtitling, and EBU Tech 3370 §2.3.2–2.3.3's authoring delay. It also lists what is not computed: NER-style severity grading (which needs a person), capitalisation and edge punctuation, speed and placement.
Implementation:
access_servicesmodule ofwai-rs, featureaccess_services = ["timed_text", "capture_take"], with no new dependency;wai_access_services_vectors gen|verifyandtests/access_services.rs;live-conformance/access/;live-conformance/access_services_verify.py;wai-conformance.ymlplus itspaths:entry;registry/capabilities.json,vocab/v2.ttl, the REGISTRY tables), with 7DocumentKindwire identifiers and thetag:…/wai/accessscheme;Design decisions and why
wai:access\x01 ‖ JCS(record − sig), and the record id is SHA-256(JCS(record)). Signed integers (latencies, offsets) are decimal strings, because the JCS subset holds no negative number.preRecordingwithtta:speak. DAPT has a SHOULD NOT for Audio objects in a pre-recording script and for Synthesized Audio in an as-recorded one. §5.5 states this departure and why.sign_revision_not_final). It translates what the captions resolve to; a superseded partial is not that.synthesized/generate/speech-synthesis, with oversightfully_autonomousorhuman_validated. The review reuses synthesis §9.1's vocabulary with scopetranslation.Checks (all cargo through
rbon the build host)cargo test --locked --no-default-features --features access_services --lib access_services::cargo test --locked --no-default-features --features access_services --test access_servicesReason::ALL)cargo test --locked --no-default-features --features timed_text --test timed_textcargo test --locked --no-default-features --lib codecs::registrycargo run --no-default-features --bin wai -- registry exportthenregistry export --checkwai_access_services_vectors verify ../live-conformance/accesspython3 -I live-conformance/access_services_verify.py live-conformance/accesspython3 -I live-conformance/timed_text_verify.py live-conformance/captionscargo clippy --locked --no-default-features --features access_services --all-targetsaccess_services*orcodecs/registry.rs(two fixed:is_multiple_of, a type alias); the pre-existing notes elsewhere are unchangedcargo metadata --locked --offline --format-version 1check-tests-in-ci.py,check-workflow-concurrency.sh,check-spec-refs.py,check-wai-section-refs.py,check-no-vanity-metrics.sh,test-public-text-checks.sh,check-comparative-prose.sh,check-orphan-sources.py[begin, …)interval before a link, so the intervals were reworded.check-public-names.shover the 15 touched files with the private listFalsifications (committed first, each restored after)
--test access_servicesdescription_earlyaccepted where refusal is stated--liband--test access_servicessign_revision_not_finalaccess_services_verify.pysign_partialreachestrack_incompleteaccess_services_verify.pydescription_earlyacceptedaccess_services_verify.pyRegulatory and standards facts, each read at its source
Not done
accessattributes with HLSCHARACTERISTICSand DASH Accessibility mappings: R7's INGEST part, left out of this slice.🤖 Generated with Claude Code