Some checks failed
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 8m12s
WAI operation catalogue / does this change touch it (push) Successful in 8m3s
wai-app and Create / wai-app · does this change touch it (push) Successful in 8m7s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 8m21s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 8m24s
wai-audit collector and player integration / does this change touch it (push) Successful in 8m6s
wai-key-proxy / does this change touch it (push) Successful in 7m59s
wai-fleet service / does this change touch it (push) Successful in 8m2s
wai-quantum studio and desktop / does this change touch it (push) Successful in 1m40s
wai-ledger service / does this change touch it (push) Successful in 1m42s
wai-quantum for JavaScript / does this change touch it (push) Successful in 1m43s
wai-sink-android native sink library / does this change touch it (push) Successful in 1m41s
WAI Studio / does this change touch it (push) Successful in 1m40s
wai-sink-swift native sink package / does this change touch it (push) Successful in 1m41s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Successful in 46s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Successful in 1m40s
wai-fleet service / service · macos (push) Successful in 47s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Successful in 5m44s
wai-ledger service / service · macos (push) Successful in 50s
wai-quantum studio and desktop / desktop app · macos (push) Successful in 4m37s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Has been cancelled
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Has been cancelled
wai-fleet service / service · linux (push) Has been cancelled
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Has been cancelled
wai-ledger service / service · linux (push) Has been cancelled
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Has been cancelled
WAI Studio / Studio in WebKit · linux (push) Has been cancelled
WAI Studio / Studio in Chromium and Firefox · macos (push) Has been cancelled
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Successful in 7m9s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Successful in 10m50s
wai-quantum studio and desktop / desktop app · windows (push) Successful in 10m5s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 8s
wai-quantum energy-landscape jobs / does this change touch it (push) Successful in 8s
wai-audit collector and player integration / collector · linux (push) Successful in 1m50s
wai-key-proxy / proxy · linux (push) Successful in 1m37s
wai-quantum energy-landscape jobs / the same bits · macos (push) Successful in 3m28s
WAI operation catalogue / the catalogue and every door · linux (push) Successful in 9m6s
wai-quantum studio and desktop / studio · browser (push) Successful in 7m10s
wai-quantum for JavaScript / javascript · linux (push) Successful in 6m42s
wai-quantum studio and desktop / desktop app · linux (push) Successful in 9m10s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 2m38s
wai-quantum energy-landscape jobs / the module under wasm32-wasip2 (wasmtime) (push) Successful in 2m38s
wai-quantum energy-landscape jobs / native against WebAssembly, over many seeds (push) Successful in 5m0s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 7m33s
wai-quantum energy-landscape jobs / reader, kernels, answers and the stated result · linux, release (push) Successful in 17m45s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Successful in 1m42s
joule-moq-room room service / joule-moq-room, every target (push) Successful in 4m49s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Successful in 4m25s
wai-quantum energy-landscape jobs / the same bits · linux-arm64 (push) Successful in 7m38s
synthesis §7.10 registers the second marking layer for speech and other audio: the same 8-byte payload and BCH code as tent64, the same marking and detection records and failure codes (audio states rate, channels and length), embedded by a pinned integer derivation in the band energies of the mono mix and read key-free after trims, rate and level changes and the codecs §7.10.7 measures. robustness-evidence registers audio corpora, ten pinned transforms of sound and the lossy codecs as measured transforms, whose records are stated. Reference in wai-rs (synthesis::mark::audio, audio_mark, robustness::audio, wai_audio_mark_vectors), second implementation in _wai_audio_mark.py with audio_mark_verify.py, corpus in live-conformance/audio-mark/ with records measured on generated voices and music and on recorded speech named by digest. Co-Authored-By: Claude Opus 5.5 <[email protected]>
80 lines
5.1 KiB
Markdown
80 lines
5.1 KiB
Markdown
# live-conformance/audio-mark — the audio watermark scheme `wai-mark:band64`
|
|
|
|
The corpus of the registered audio scheme of the second marking layer,
|
|
[`extensions/synthesis.md`](../../extensions/synthesis.md) §7.10, of its measurement (§7.10.7), and
|
|
of its robustness records ([`extensions/robustness-evidence.md`](../../extensions/robustness-evidence.md)
|
|
§10).
|
|
|
|
**Provenance.** Every signal here is generated: `wai_audio_mark_vectors gen` writes the voice and the
|
|
music from fixed seeds (`audio_mark::voice`, a source-filter model, and `audio_mark::music`, a few
|
|
synthesised instruments), integer throughout. No recording is stored. The recorded speech the
|
|
measured records name (`robustness/measured/speech*.json`) is the test-clean set of the LibriSpeech
|
|
corpus of read English speech (Panayotov, Chen, Povey and Khudanpur, ICASSP 2015), licensed CC BY 4.0
|
|
(<https://creativecommons.org/licenses/by/4.0/>), fetched from openslr.org/12 as `test-clean.tar.gz`
|
|
with SHA-256 `39fde525e59672dc6d1551919b1478f724438a95aa55f874b576be21967e6c23`. It is named here
|
|
only by the SHA-256 of each item's samples, read as 16 kHz mono and cut to its first 20 s (or
|
|
10 s); its samples are not in this repository.
|
|
|
|
## Files
|
|
|
|
- `scheme-band64.json`: the scheme's definition, the bytes whose SHA-256 is the scheme's digest
|
|
(§7.10.1).
|
|
- `audio/<SHA-256>.pcm`: the unmarked audio the vectors name, raw S16LE, channels interleaved, each
|
|
file named by the SHA-256 of its bytes: a voice of 7 s at 8 kHz, one channel, and music of 6 s at
|
|
12 kHz, two channels.
|
|
- `vectors.json`:
|
|
- `scheme`: the term, the digest, the cosine tables' digest, the shuffle's first and last 16
|
|
entries, the first 16 signs, the mask, and the false-positive bound of §7.10.6;
|
|
- `lg` and `shift`: values of the integer logarithm and of the gain's shift *S*(*a*) (§7.10.2,
|
|
§7.10.4);
|
|
- `embeds`: each stored audio (`audio`), its rate and channels, a payload, the marked samples'
|
|
digest (`marked`), the cells that carried a bit, and each cell's last gain (two bytes each,
|
|
big-endian, in cell order);
|
|
- `detects`: each audio a `source` names, its size and digest, and what the detector reads: the
|
|
`payload`, the `offset`, the `phase` and the `errors` corrected, or `null`;
|
|
- `battery_sample`: every pinned attack of §7.10.7 applied to the stored voice, marked and
|
|
unmarked, at the attack's seed, with the result's digest and what the detector reads;
|
|
- `cases`: cases of §11.1. Their `decoded` and `unmarked` samples are each named by a `source`:
|
|
stored audio (`audio`, with its `rate` and `channels`), optionally marked under a payload
|
|
(`marked`), then optionally transformed (`derive`: a transform of robustness-evidence §4.1,
|
|
its parameters and seed), then optionally with one sample's lowest bit flipped (`flip`). Each
|
|
case states what a verifier gives it, as `live-conformance/synthesis/` states its vectors'.
|
|
- `battery-band64.json`: the measurement of §7.10.7's pinned attacks over the generated sets,
|
|
`voice` (16 voices of 20 s at 16 kHz, one channel) and `music` (8 pieces of 15 s at 24 kHz, two
|
|
channels). It holds each item's SNR and segmental SNR, each attack's tallies per set, the
|
|
unmarked items' readings, the statistics of the words the detector reads from unmarked items
|
|
(§7.10.6), the bound, and the attacks every item survived.
|
|
- `robustness/`: the scheme's robustness records (robustness-evidence §10).
|
|
- `corpus/`: the corpus documents.
|
|
- `records/`: the conformance record over the two stored sounds, reproduced end to end; the
|
|
records over the generated sets; and their claim.
|
|
- `measured/`: the records of the whole battery, its measured transforms among it, over the
|
|
generated voices and over the recorded speech, with their claim, the measurements they come
|
|
from, the recorded speech's corpus documents, and the unmarked detections over the whole
|
|
recorded set and over generated music (`negatives*.json`).
|
|
|
|
## The encoder of the measured transforms
|
|
|
|
The measured records (robustness-evidence §4.2) were run on an arm64 host by
|
|
`wai_audio_mark_vectors measure` and `measure-dir`, through FFmpeg 9.0.2 with libopus 1.6.1
|
|
(`wai-attack:opus`, application `voip`), LAME 4.0 (`wai-attack:mp3`), and FFmpeg's own AAC, G.722,
|
|
G.726 and G.723.1 encoders. Each codec's result depends on its encoder's build, so the records are
|
|
stated. The same command on the same builds writes the same bytes.
|
|
|
|
## Running
|
|
|
|
```
|
|
cd ../../wai-rs
|
|
cargo run --release --no-default-features --features robustness --bin wai_audio_mark_vectors -- verify ../live-conformance/audio-mark
|
|
cargo run --release --no-default-features --features robustness --bin wai_audio_mark_vectors -- gen ../live-conformance/audio-mark # regenerate
|
|
cd ..
|
|
python3 -I live-conformance/audio_mark_verify.py live-conformance/audio-mark
|
|
```
|
|
|
|
Re-measuring needs an FFmpeg-compatible encoder:
|
|
`wai_audio_mark_vectors measure <corpus-dir> <ffmpeg>`, and for a directory of recordings
|
|
`measure-dir <corpus-dir> <ffmpeg> <name> <audio-dir> <seconds> <count>`.
|
|
|
|
Pass is byte equality, and every case reaching the outcome it states. A difference is a
|
|
conformance failure of the file or the implementation. Report it as a failure, never as close
|
|
enough.
|