The controller will not write a `speak` work function against a description, so
this measures instead of describing. scripts/build_tts_facts.py emits
docs/tts/tts-engine.{md,json} from the running system and the repository at run
time; anything unmeasurable says "unknown" with a reason. The content hash
excludes the timestamp, so it is stable across runs and answers "did anything
change?" rather than "was it run again?". 18 tests enforce that it does not
estimate -- including one that fails if a missing weights file is rendered as
"None", and one that fails if the Edge-voice answer is inverted, which it was, in
the first draft.
Four things that change the controller's plans:
* The fork is ONE commit ahead of upstream and it is cosmetic -- a logo and the
web demo. The contract being written against is not the fork, it is
umbraaudio/scripts/qwen_tts_server.py, where the HTTP surface and the four
generation paths were written.
* Synthesis is not deterministic. temperature 0.9, do_sample true, no seed. A
translation re-voiced because one line changed will not reproduce the other
lines byte-for-byte, so comparing takes needs an embedding measure, not a hash.
* The TTS server has NO authentication and binds 0.0.0.0:8881, and concurrency
is 1 behind a single lock. The generator names the seven auth mechanisms it
searched for so the claim can be checked rather than believed.
* assigned_edge_voice is the fallback engine for creating reference audio, not
the engine that renders utterances.
Not measured, and said so: working set / VRAM (the one that decides the 48 GB
CPU node question -- 9.5 GB of weights on disk is not the memory the process
holds, and on CPU that gap is the whole question); whether a seeded call is
reproducible; per-language quality; the model's own maximum text length; CUDA
failure modes.
scripts/build_scale_totals.py measures across all projects rather than handing
over a typed number: 4 projects, 131 chapters, 18,181 utterances, 14,526 audio
files, 6.98 GB, 38.58 hours, and 2 distinct schema fingerprints -- matching the
two already recorded in manifest.md. Markers are counted separately from audio,
because "files" that means both is a number nobody can use. Treasure Island
contributes 49 chapters and zero audio: that is a fact about it, not a failed
measurement.
Also delivered to the controller: their accepted-format validator accepts the
bundle, exit 0, 8884 records, and I confirmed it fails on a broken copy before
believing the pass.
139 lines
3.9 KiB
JSON
139 lines
3.9 KiB
JSON
{
|
|
"caveats": [
|
|
"Duration is read from WAV headers, not decoded. It is exact for PCM WAV and absent for anything else, which is why the file count and the duration are reported together rather than one from the other.",
|
|
"Audio totals cover chapter_audio only, and exclude the *.wav.txt staleness markers, which are counted separately. Voice references and exports are counted separately per project.",
|
|
"Scratch and intermediate output is excluded and counted separately, not silently dropped.",
|
|
"Projects without a populated database are not listed. Absence here means 'not measured', not 'does not exist'."
|
|
],
|
|
"content_hash": {
|
|
"algorithm": "sha256",
|
|
"of": "this document with generated_at omitted, canonical JSON",
|
|
"value": "f8f6d71f2f5c94821c7195911da184b79c37b221c9a4e1c4a398c34c9cc65555"
|
|
},
|
|
"document_version": 1,
|
|
"generated_at": "2026-10-15T19:03:52Z",
|
|
"generated_by": "scripts/build_scale_totals.py",
|
|
"projects": [
|
|
{
|
|
"audio": {
|
|
"audio_bytes": 2465148533,
|
|
"audio_duration_hours": 14.25,
|
|
"audio_duration_ms": 51284220,
|
|
"audio_files": 4358,
|
|
"files_with_unreadable_header": 1,
|
|
"marker_bytes": 859884,
|
|
"marker_files_excluded_from_audio": 4319,
|
|
"scratch_bytes_excluded": 0,
|
|
"scratch_files_excluded": 0
|
|
},
|
|
"chapters": 32,
|
|
"export": {
|
|
"bytes": 1076100454,
|
|
"files": 64
|
|
},
|
|
"project": "DealHunterShip_4.0e_whole-to-audio",
|
|
"schema_fingerprint": "399285355e2d456e",
|
|
"speakers_named": 55,
|
|
"utterances": 4319,
|
|
"voices": {
|
|
"bytes": 109829218,
|
|
"files": 104
|
|
},
|
|
"words": 67378
|
|
},
|
|
{
|
|
"audio": {
|
|
"audio_bytes": 4491799819,
|
|
"audio_duration_hours": 24.22,
|
|
"audio_duration_ms": 87180676,
|
|
"audio_files": 10129,
|
|
"files_with_unreadable_header": 9,
|
|
"marker_bytes": 2065419,
|
|
"marker_files_excluded_from_audio": 10015,
|
|
"scratch_bytes_excluded": 0,
|
|
"scratch_files_excluded": 0
|
|
},
|
|
"chapters": 49,
|
|
"export": {
|
|
"bytes": 0,
|
|
"files": 0
|
|
},
|
|
"project": "Last Dwarf",
|
|
"schema_fingerprint": "399285355e2d456e",
|
|
"speakers_named": 72,
|
|
"utterances": 10015,
|
|
"voices": {
|
|
"bytes": 126078048,
|
|
"files": 72
|
|
},
|
|
"words": 107356
|
|
},
|
|
{
|
|
"audio": {
|
|
"audio_bytes": 0,
|
|
"audio_duration_hours": 0.0,
|
|
"audio_duration_ms": 0,
|
|
"audio_files": 0,
|
|
"files_with_unreadable_header": 0,
|
|
"marker_bytes": 0,
|
|
"marker_files_excluded_from_audio": 0,
|
|
"scratch_bytes_excluded": 0,
|
|
"scratch_files_excluded": 0
|
|
},
|
|
"chapters": 49,
|
|
"export": {
|
|
"bytes": 0,
|
|
"files": 0
|
|
},
|
|
"project": "Treasure Island",
|
|
"schema_fingerprint": "b7c9ae76bc6615bd",
|
|
"speakers_named": 34,
|
|
"utterances": 3811,
|
|
"voices": {
|
|
"bytes": 59429776,
|
|
"files": 44
|
|
},
|
|
"words": 68937
|
|
},
|
|
{
|
|
"audio": {
|
|
"audio_bytes": 25945398,
|
|
"audio_duration_hours": 0.12,
|
|
"audio_duration_ms": 427260,
|
|
"audio_files": 39,
|
|
"files_with_unreadable_header": 0,
|
|
"marker_bytes": 10296,
|
|
"marker_files_excluded_from_audio": 36,
|
|
"scratch_bytes_excluded": 0,
|
|
"scratch_files_excluded": 0
|
|
},
|
|
"chapters": 1,
|
|
"export": {
|
|
"bytes": 4950352,
|
|
"files": 1
|
|
},
|
|
"project": "Vocals",
|
|
"schema_fingerprint": "399285355e2d456e",
|
|
"speakers_named": 2,
|
|
"utterances": 36,
|
|
"voices": {
|
|
"bytes": 4434938,
|
|
"files": 2
|
|
},
|
|
"words": 98
|
|
}
|
|
],
|
|
"root": "<REPO>",
|
|
"totals": {
|
|
"audio_bytes": 6982893750,
|
|
"audio_duration_hours": 38.58,
|
|
"audio_files": 14526,
|
|
"audio_gigabytes": 6.98,
|
|
"chapters": 131,
|
|
"distinct_schema_fingerprints": 2,
|
|
"marker_files": 14370,
|
|
"projects": 4,
|
|
"utterances": 18181
|
|
}
|
|
}
|